nlsr: Add support for sources to NamePrefixList

Added support for string sources to NamePrefixList entries.  Required was
some tweaking of the API, and refactoring usage around the codebase.

Change-Id: I44813e024a88dc1f591f427b0fad568a7d5353ab
refs: #4177
diff --git a/src/name-prefix-list.hpp b/src/name-prefix-list.hpp
index cba76d3..5ec94ef 100644
--- a/src/name-prefix-list.hpp
+++ b/src/name-prefix-list.hpp
@@ -31,8 +31,13 @@
 namespace nlsr {
 class NamePrefixList
 {
-
 public:
+  using NamePair = std::tuple<ndn::Name, std::vector<std::string>>;
+  enum NamePairIndex {
+    NAME,
+    SOURCES
+  };
+
   NamePrefixList();
 
   ~NamePrefixList();
@@ -42,14 +47,14 @@
       \retval false If the name could not be inserted.
    */
   bool
-  insert(const ndn::Name& name);
+  insert(const ndn::Name& name, const std::string& source = "");
 
   /*! \brief removes name from NamePrefixList
       \retval true If the name is removed
       \retval false If the name failed to be removed.
    */
   bool
-  remove(const ndn::Name& name);
+  remove(const ndn::Name& name, const std::string& source = "");
 
   void
   sort();
@@ -57,27 +62,45 @@
   size_t
   getSize()
   {
-    return m_nameList.size();
+    return m_names.size();
   }
 
-  std::list<ndn::Name>&
-  getNameList()
-  {
-    return m_nameList;
-  }
-
-  const std::list<ndn::Name>&
-  getNameList() const
-  {
-    return m_nameList;
-  }
+  std::list<ndn::Name>
+  getNames() const;
 
   bool
   operator==(const NamePrefixList& other) const;
 
-private:
-  std::list<ndn::Name> m_nameList;
+  /*! Returns how many unique sources this name has.
 
+    \retval 0 if the name is not in the list, else the number of sources.
+   */
+  uint32_t
+  countSources(const ndn::Name& name) const;
+
+  /*! Returns the sources that this name has.
+
+    \retval an empty vector if the name is not in the list, else a
+    vector containing the sources.
+   */
+  const std::vector<std::string>
+  getSources(const ndn::Name& name) const;
+
+private:
+  /*! Obtain an iterator to the entry matching name.
+
+    \note We could do this quite easily inline with a lambda, but this
+    is slightly more efficient.
+   */
+  std::vector<NamePair>::iterator
+  get(const ndn::Name& name);
+
+  /*! Obtain an iterator to a specific source in an entry
+   */
+  std::vector<std::string>::iterator
+  getSource(const std::string& source, std::vector<NamePair>::iterator& entry);
+
+  std::vector<NamePair> m_names;
 };
 
 std::ostream&