build: == Dependency change == NLSR now depends on ndn-cxx library

Refs: #1535

Change-Id: I4c7c0c3dcfcac6ee91648a46c07e426adbb5bd20
diff --git a/src/route/name-prefix-table.cpp b/src/route/name-prefix-table.cpp
new file mode 100644
index 0000000..e37751b
--- /dev/null
+++ b/src/route/name-prefix-table.cpp
@@ -0,0 +1,154 @@
+#include <list>
+#include <utility>
+#include <algorithm>
+
+#include "nlsr.hpp"
+#include "name-prefix-table.hpp"
+#include "name-prefix-table-entry.hpp"
+
+
+
+namespace nlsr {
+
+using namespace std;
+
+static bool
+npteCompare(NamePrefixTableEntry& npte, string& name)
+{
+  return npte.getNamePrefix() == name;
+}
+
+
+
+void
+NamePrefixTable::addNpte(string name, RoutingTableEntry& rte, Nlsr& pnlsr)
+{
+  std::list<NamePrefixTableEntry>::iterator it = std::find_if(m_npteList.begin(),
+                                                              m_npteList.end(), bind(&npteCompare, _1, name));
+  if (it == m_npteList.end())
+  {
+    NamePrefixTableEntry newEntry(name);
+    newEntry.addRoutingTableEntry(rte);
+    newEntry.generateNhlfromRteList();
+    newEntry.getNhl().sort();
+    m_npteList.push_back(newEntry);
+    if (rte.getNhl().getSize() > 0)
+    {
+      pnlsr.getFib().update(pnlsr, name, newEntry.getNhl());
+    }
+  }
+  else
+  {
+    if (rte.getNhl().getSize() > 0)
+    {
+      (*it).addRoutingTableEntry(rte);
+      (*it).generateNhlfromRteList();
+      (*it).getNhl().sort();
+      pnlsr.getFib().update(pnlsr, name, (*it).getNhl());
+    }
+    else
+    {
+      (*it).resetRteListNextHop();
+      (*it).getNhl().reset();
+      pnlsr.getFib().remove(pnlsr, name);
+    }
+  }
+}
+
+void
+NamePrefixTable::removeNpte(string name, RoutingTableEntry& rte, Nlsr& pnlsr)
+{
+  std::list<NamePrefixTableEntry>::iterator it = std::find_if(m_npteList.begin(),
+                                                              m_npteList.end(), bind(&npteCompare, _1, name));
+  if (it != m_npteList.end())
+  {
+    string destRouter = rte.getDestination();
+    (*it).removeRoutingTableEntry(rte);
+    if (((*it).getRteListSize() == 0) &&
+        (!pnlsr.getLsdb().doesLsaExist(destRouter + "/1", 1)) &&
+        (!pnlsr.getLsdb().doesLsaExist(destRouter + "/2", 2)) &&
+        (!pnlsr.getLsdb().doesLsaExist(destRouter + "/3", 3)))
+    {
+      m_npteList.erase(it);
+      pnlsr.getFib().remove(pnlsr, name);
+    }
+    else
+    {
+      (*it).generateNhlfromRteList();
+      pnlsr.getFib().update(pnlsr, name, (*it).getNhl());
+    }
+  }
+}
+
+
+void
+NamePrefixTable::addNpteByDestName(string name, string destRouter, Nlsr& pnlsr)
+{
+  RoutingTableEntry* rteCheck =
+    pnlsr.getRoutingTable().findRoutingTableEntry(destRouter);
+  if (rteCheck != 0)
+  {
+    addNpte(name, *(rteCheck) , pnlsr);
+  }
+  else
+  {
+    RoutingTableEntry rte(destRouter);
+    addNpte(name, rte, pnlsr);
+  }
+}
+
+void
+NamePrefixTable::removeNpte(string name, string destRouter, Nlsr& pnlsr)
+{
+  RoutingTableEntry* rteCheck =
+    pnlsr.getRoutingTable().findRoutingTableEntry(destRouter);
+  if (rteCheck != 0)
+  {
+    removeNpte(name, *(rteCheck), pnlsr);
+  }
+  else
+  {
+    RoutingTableEntry rte(destRouter);
+    removeNpte(name, rte, pnlsr);
+  }
+}
+
+void
+NamePrefixTable::updateWithNewRoute(Nlsr& pnlsr)
+{
+  for (std::list<NamePrefixTableEntry>::iterator it = m_npteList.begin();
+       it != m_npteList.end();
+       ++it)
+  {
+    std::list<RoutingTableEntry> rteList = (*it).getRteList();
+    for (std::list<RoutingTableEntry>::iterator rteit = rteList.begin();
+         rteit != rteList.end(); ++rteit)
+    {
+      RoutingTableEntry* rteCheck =
+        pnlsr.getRoutingTable().findRoutingTableEntry((*rteit).getDestination());
+      if (rteCheck != 0)
+      {
+        addNpte((*it).getNamePrefix(), *(rteCheck), pnlsr);
+      }
+      else
+      {
+        RoutingTableEntry rte((*rteit).getDestination());
+        addNpte((*it).getNamePrefix(), rte, pnlsr);
+      }
+    }
+  }
+}
+
+void
+NamePrefixTable::print()
+{
+  std::cout << "----------------NPT----------------------" << std::endl;
+  for (std::list<NamePrefixTableEntry>::iterator it = m_npteList.begin();
+       it != m_npteList.end();
+       ++it)
+  {
+    cout << (*it) << endl;
+  }
+}
+
+} //namespace nlsr