deduplicate code retrieving conversation from uid

This code had multiple occurences throughout the client. It is now an
inlinable helper function in utils.h header.

Change-Id: Ic9ba45e4622338d1c40399e58eb969d9f99faa6a
Reviewed-by: Olivier Soldano <olivier.soldano@savoirfairelinux.com>
diff --git a/src/ConversationVC.mm b/src/ConversationVC.mm
index 31944f9..25bb510 100644
--- a/src/ConversationVC.mm
+++ b/src/ConversationVC.mm
@@ -95,7 +95,7 @@
 
     auto& convQueue = convModel_->allFilteredConversations();
 
-    auto it = std::find_if(convQueue.begin(), convQueue.end(), [self](const lrc::api::conversation::Info& conv) {return conv.uid == convUid_;});
+    auto it = getConversationFromUid(convUid_, *convModel_);
 
     if (it != convQueue.end())
         cachedConv_ = &(*it);
diff --git a/src/CurrentCallVC.mm b/src/CurrentCallVC.mm
index 79f34b2..bd44a7f 100644
--- a/src/CurrentCallVC.mm
+++ b/src/CurrentCallVC.mm
@@ -45,6 +45,7 @@
 #import "BrokerVC.h"
 #import "views/IconButton.h"
 #import "views/CallLayer.h"
+#import "utils.h"
 
 @interface RendererConnectionsHolder : NSObject
 
@@ -292,10 +293,7 @@
     [ringingPanel setHidden:NO];
     [controlsPanel setHidden:YES];
     [headerContainer setHidden:YES];
-    auto it = std::find_if(convModel->allFilteredConversations().begin(), convModel->allFilteredConversations().end(),
-                           [self] (const lrc::api::conversation::Info& conv) {
-                               return convUid_ == conv.uid;
-                           });
+    auto it = getConversationFromUid(convUid_, *convModel);
     if (it != convModel->allFilteredConversations().end()) {
         auto& imgManip = reinterpret_cast<Interfaces::ImageManipulationDelegate&>(GlobalInstances::pixmapManipulator());
         QVariant photo = imgManip.conversationPhoto(*it, *accountInfo_);
diff --git a/src/MessagesVC.mm b/src/MessagesVC.mm
index 035c4f8..a7e0c27 100644
--- a/src/MessagesVC.mm
+++ b/src/MessagesVC.mm
@@ -31,6 +31,7 @@
 #import "views/MessageBubbleView.h"
 #import "INDSequentialTextSelectionManager.h"
 #import "delegates/ImageManipulationDelegate.h"
+#import "utils.h"
 
 @interface MessagesVC () <NSTableViewDelegate, NSTableViewDataSource> {
 
@@ -64,7 +65,7 @@
 
     auto& convQueue = convModel_->allFilteredConversations();
 
-    auto it = std::find_if(convQueue.begin(), convQueue.end(), [self](const lrc::api::conversation::Info& conv) {return conv.uid == convUid_;});
+    auto it = getConversationFromUid(convUid_, *convModel_);
 
     if (it != convQueue.end())
         cachedConv_ = &(*it);
diff --git a/src/SmartViewVC.mm b/src/SmartViewVC.mm
index 6174038..34daf4e 100755
--- a/src/SmartViewVC.mm
+++ b/src/SmartViewVC.mm
@@ -118,10 +118,7 @@
     [smartView reloadData];
 
     if (!selectedUid_.empty() && model_ != nil) {
-        auto it = std::find_if(model_->allFilteredConversations().begin(), model_->allFilteredConversations().end(),
-                          [self] (const lrc::api::conversation::Info& conv) {
-                              return selectedUid_ == conv.uid;
-                          });
+        auto it = getConversationFromUid(selectedUid_, *model_);
         if (it != model_->allFilteredConversations().end()) {
             NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:(it - model_->allFilteredConversations().begin())];
             [smartView selectRowIndexes:indexSet byExtendingSelection:NO];
@@ -177,10 +174,7 @@
     [self setConversationModel:model];
 
     if (model_ != nil) {
-        auto it = std::find_if(model_->allFilteredConversations().begin(), model_->allFilteredConversations().end(),
-                               [self] (const lrc::api::conversation::Info& conv) {
-                                   return selectedUid_ == conv.uid;
-                               });
+        auto it = getConversationFromUid(selectedUid_, *model_);
         if (it != model_->allFilteredConversations().end()) {
             NSIndexSet* indexSet = [NSIndexSet indexSetWithIndex:(it - model_->allFilteredConversations().begin())];
             [smartView selectRowIndexes:indexSet byExtendingSelection:NO];
diff --git a/src/utils.h b/src/utils.h
index d496e56..e6ba40f 100755
--- a/src/utils.h
+++ b/src/utils.h
@@ -23,6 +23,7 @@
 #import <api/account.h>
 #import <api/contactmodel.h>
 #import <api/contact.h>
+#import <map>
 
 static inline NSString* bestIDForConversation(const lrc::api::conversation::Info& conv, const lrc::api::ConversationModel& model)
 {
@@ -41,3 +42,17 @@
     else
         return bestIDForConversation(conv, model);
 }
+
+/**
+ * This function return an iterator pointing to a Conversation::Info in ConversationModel given its uid. If not found
+ * the iterator is invalid thus it needs to be checked by caller.
+ * @param uid UID of conversation being searched
+ * @param model ConversationModel in which to do the lookup
+ * @return iterator pointing to corresponding Conversation if any. Points to past-the-end element otherwise.
+ */
+static inline lrc::api::ConversationModel::ConversationQueue::const_iterator getConversationFromUid(const std::string& uid, const lrc::api::ConversationModel& model) {
+    return std::find_if(model.allFilteredConversations().begin(), model.allFilteredConversations().end(),
+                        [&] (const lrc::api::conversation::Info& conv) {
+                            return uid == conv.uid;
+                        });
+}