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: