routing: made map more container-agnostic

Change-Id: Ib18a41bac7627a9eb0bbafa6ccad0335d420dd68
refs: #4239
diff --git a/src/adjacency-list.cpp b/src/adjacency-list.cpp
index 6f83b1a..b82346f 100644
--- a/src/adjacency-list.cpp
+++ b/src/adjacency-list.cpp
@@ -194,6 +194,12 @@
   return m_adjList;
 }
 
+const std::list<Adjacent>&
+AdjacencyList::getAdjList() const
+{
+  return m_adjList;
+}
+
 bool
 AdjacencyList::isAdjLsaBuildable(const uint32_t interestRetryNo) const
 {
diff --git a/src/adjacency-list.hpp b/src/adjacency-list.hpp
index dcb1539..c21e70b 100644
--- a/src/adjacency-list.hpp
+++ b/src/adjacency-list.hpp
@@ -70,6 +70,9 @@
   std::list<Adjacent>&
   getAdjList();
 
+  const std::list<Adjacent>&
+  getAdjList() const;
+
   bool
   isNeighbor(const ndn::Name& adjName);
 
diff --git a/src/common.hpp b/src/common.hpp
index 4e82370..470d8b1 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -34,6 +34,22 @@
 
 const ndn::time::seconds TIME_ALLOWED_FOR_CANONIZATION = ndn::time::seconds(4);
 
+template<typename T, typename = void>
+struct is_iterator
+{
+   static constexpr bool value = false;
+};
+
+/*! Use C++11 iterator_traits to check if some type is an iterator
+ */
+template<typename T>
+struct is_iterator<T, typename std::enable_if<!std::is_same<
+  typename std::iterator_traits<T>::value_type,
+  void>::value>::type>
+{
+   static constexpr bool value = true;
+};
+
 } // namespace nlsr
 
 #endif // NLSR_COMMON_HPP
diff --git a/src/lsa.hpp b/src/lsa.hpp
index 4840c34..d27ddd6 100644
--- a/src/lsa.hpp
+++ b/src/lsa.hpp
@@ -22,14 +22,14 @@
 #ifndef NLSR_LSA_HPP
 #define NLSR_LSA_HPP
 
+#include "name-prefix-list.hpp"
+#include "adjacent.hpp"
+#include "adjacency-list.hpp"
+
 #include <boost/cstdint.hpp>
 #include <ndn-cxx/util/scheduler.hpp>
 #include <ndn-cxx/util/time.hpp>
 
-#include "adjacent.hpp"
-#include "name-prefix-list.hpp"
-#include "adjacency-list.hpp"
-
 namespace nlsr {
 
 class Nlsr;
@@ -205,6 +205,12 @@
     return m_adl;
   }
 
+  const AdjacencyList&
+  getAdl() const
+  {
+    return m_adl;
+  }
+
   void
   addAdjacent(Adjacent adj)
   {
diff --git a/src/route/map.cpp b/src/route/map.cpp
index a97be11..544976e 100644
--- a/src/route/map.cpp
+++ b/src/route/map.cpp
@@ -16,19 +16,19 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * \author A K M Mahmudul Hoque <ahoque1@memphis.edu>
- *
  **/
-#include <iostream>
-#include <list>
 
+#include "map.hpp"
 #include "nlsr.hpp"
 #include "adjacent.hpp"
 #include "lsa.hpp"
 #include "lsdb.hpp"
-#include "map.hpp"
+
 #include "logger.hpp"
+
+#include <iostream>
+#include <list>
+
 namespace nlsr {
 
 INIT_LOGGER("Map");
@@ -98,29 +98,6 @@
 }
 
 void
-Map::createFromAdjLsdb(Nlsr& pnlsr)
-{
-  std::list<AdjLsa> adjLsdb = pnlsr.getLsdb().getAdjLsdb();
-  for (std::list<AdjLsa>::iterator it = adjLsdb.begin();
-       it != adjLsdb.end() ; it++) {
-    addEntry((*it).getOrigRouter());
-    std::list<Adjacent> adl = (*it).getAdl().getAdjList();
-    for (std::list<Adjacent>::iterator itAdl = adl.begin();
-         itAdl != adl.end() ; itAdl++) {
-      addEntry((*itAdl).getName());
-    }
-  }
-}
-
-void
-Map::createFromCoordinateLsdb(Nlsr& nlsr)
-{
-  for (CoordinateLsa lsa : nlsr.getLsdb().getCoordinateLsdb()) {
-    addEntry(lsa.getOrigRouter());
-  }
-}
-
-void
 Map::reset()
 {
   m_table.clear();
diff --git a/src/route/map.hpp b/src/route/map.hpp
index 45e6b96..262fe52 100644
--- a/src/route/map.hpp
+++ b/src/route/map.hpp
@@ -16,21 +16,18 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * \author A K M Mahmudul Hoque <ahoque1@memphis.edu>
- *
  **/
+
 #ifndef NLSR_MAP_HPP
 #define NLSR_MAP_HPP
 
+#include "common.hpp"
+#include "map-entry.hpp"
+
 #include <iostream>
 #include <list>
 #include <boost/cstdint.hpp>
 
-#include <ndn-cxx/common.hpp>
-
-#include "map-entry.hpp"
-
 namespace nlsr {
 
 class Nlsr;
@@ -52,11 +49,36 @@
   void
   addEntry(const ndn::Name& rtrName);
 
-  void
-  createFromAdjLsdb(Nlsr& pnlsr);
+  /*! Populates the Map with AdjacencyLsas.
 
+    \note IteratorType must an iterator type, and begin to end must represent a valid range.
+  */
+  template<typename IteratorType>
   void
-  createFromCoordinateLsdb(Nlsr& nlsr);
+  createFromAdjLsdb(IteratorType begin, IteratorType end)
+  {
+    BOOST_STATIC_ASSERT_MSG(is_iterator<IteratorType>::value, "IteratorType must be an iterator!");
+    for (auto lsa = begin; lsa != end; lsa++) {
+      addEntry(lsa->getOrigRouter());
+      for (const auto& adjacent : lsa->getAdl().getAdjList()) {
+        addEntry(adjacent.getName());
+      }
+    }
+  }
+
+  /*! Populates the Map with CoordinateLsas.
+
+    \note IteratorType must an iterator type, and begin to end must represent a valid range.
+  */
+  template<typename IteratorType>
+  void
+  createFromCoordinateLsdb(IteratorType begin, IteratorType end)
+  {
+    BOOST_STATIC_ASSERT_MSG(is_iterator<IteratorType>::value, "IteratorType must be an iterator!");
+    for (auto lsa = begin; lsa != end; lsa++) {
+      addEntry(lsa->getOrigRouter());
+    }
+  }
 
   const ndn::Name
   getRouterNameByMappingNo(int32_t mn);
@@ -91,4 +113,5 @@
 };
 
 } // namespace nlsr
-#endif //NLSR_MAP_HPP
+
+#endif // NLSR_MAP_HPP
diff --git a/src/route/routing-table.cpp b/src/route/routing-table.cpp
index b1e02dc..708e3dd 100644
--- a/src/route/routing-table.cpp
+++ b/src/route/routing-table.cpp
@@ -16,13 +16,7 @@
  *
  * You should have received a copy of the GNU General Public License along with
  * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
- *
- * \author A K M Mahmudul Hoque <ahoque1@memphis.edu>
- *
  **/
-#include <iostream>
-#include <string>
-#include <list>
 
 #include "routing-table.hpp"
 #include "nlsr.hpp"
@@ -33,6 +27,10 @@
 #include "name-prefix-table.hpp"
 #include "logger.hpp"
 
+#include <iostream>
+#include <string>
+#include <list>
+
 namespace nlsr {
 
 INIT_LOGGER("RoutingTable");
@@ -123,7 +121,7 @@
   _LOG_DEBUG("RoutingTable::calculateLsRoutingTable Called");
 
   Map map;
-  map.createFromAdjLsdb(nlsr);
+  map.createFromAdjLsdb(nlsr.getLsdb().getAdjLsdb().begin(), nlsr.getLsdb().getAdjLsdb().end());
   map.writeLog();
 
   size_t nRouters = map.getMapSize();
@@ -137,7 +135,8 @@
 RoutingTable::calculateHypRoutingTable(Nlsr& nlsr)
 {
   Map map;
-  map.createFromCoordinateLsdb(nlsr);
+  map.createFromCoordinateLsdb(nlsr.getLsdb().getCoordinateLsdb().begin(),
+                               nlsr.getLsdb().getCoordinateLsdb().end());
   map.writeLog();
 
   size_t nRouters = map.getMapSize();
@@ -153,7 +152,7 @@
 RoutingTable::calculateHypDryRoutingTable(Nlsr& nlsr)
 {
   Map map;
-  map.createFromAdjLsdb(nlsr);
+  map.createFromAdjLsdb(nlsr.getLsdb().getAdjLsdb().begin(), nlsr.getLsdb().getAdjLsdb().end());
   map.writeLog();
 
   size_t nRouters = map.getMapSize();
diff --git a/tests/test-hyperbolic-calculator.cpp b/tests/test-hyperbolic-calculator.cpp
index 030fe25..c894c98 100644
--- a/tests/test-hyperbolic-calculator.cpp
+++ b/tests/test-hyperbolic-calculator.cpp
@@ -102,7 +102,7 @@
     CoordinateLsa coordC(adjC.getOrigRouter(), 1, MAX_TIME, 14.11, anglesC);
     lsdb.installCoordinateLsa(coordC);
 
-    map.createFromAdjLsdb(nlsr);
+    map.createFromAdjLsdb(lsdb.getAdjLsdb().begin(), lsdb.getAdjLsdb().end());
   }
 
   void runTest(const double& expectedCost)
diff --git a/tests/test-link-state-calculator.cpp b/tests/test-link-state-calculator.cpp
index 50063a2..8aee304 100644
--- a/tests/test-link-state-calculator.cpp
+++ b/tests/test-link-state-calculator.cpp
@@ -97,7 +97,7 @@
     AdjLsa adjC(c.getName(), 1, MAX_TIME, 2, adjacencyListC);
     lsdb.installAdjLsa(adjC);
 
-    map.createFromAdjLsdb(nlsr);
+    map.createFromAdjLsdb(lsdb.getAdjLsdb().begin(), lsdb.getAdjLsdb().end());
   }
 
 public: