30 #include <boost/concept/assert.hpp>
31 #include <boost/concept_check.hpp>
32 #include <type_traits>
36 const shared_ptr<fib::Entry> Fib::s_emptyEntry = make_shared<fib::Entry>(
Name());
39 BOOST_CONCEPT_ASSERT((boost::ForwardIterator<Fib::const_iterator>));
42 #ifdef HAVE_IS_DEFAULT_CONSTRUCTIBLE
43 static_assert(std::is_default_constructible<Fib::const_iterator>::value,
44 "Fib::const_iterator must be default-constructible");
46 BOOST_CONCEPT_ASSERT((boost::DefaultConstructible<Fib::const_iterator>));
47 #endif // HAVE_IS_DEFAULT_CONSTRUCTIBLE
50 : m_nameTree(nameTree)
65 shared_ptr<fib::Entry>
68 shared_ptr<name_tree::Entry> nameTreeEntry =
70 if (static_cast<bool>(nameTreeEntry)) {
71 return nameTreeEntry->getFibEntry();
76 shared_ptr<fib::Entry>
79 shared_ptr<fib::Entry> entry = nameTreeEntry->getFibEntry();
80 if (static_cast<bool>(entry))
84 if (static_cast<bool>(nameTreeEntry)) {
85 return nameTreeEntry->getFibEntry();
90 shared_ptr<fib::Entry>
93 shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.
get(pitEntry);
95 BOOST_ASSERT(static_cast<bool>(nameTreeEntry));
100 shared_ptr<fib::Entry>
103 shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.
get(measurementsEntry);
105 BOOST_ASSERT(static_cast<bool>(nameTreeEntry));
110 shared_ptr<fib::Entry>
113 shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.
findExactMatch(prefix);
114 if (static_cast<bool>(nameTreeEntry))
115 return nameTreeEntry->getFibEntry();
116 return shared_ptr<fib::Entry>();
119 std::pair<shared_ptr<fib::Entry>,
bool>
122 shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.
lookup(prefix);
123 shared_ptr<fib::Entry> entry = nameTreeEntry->getFibEntry();
124 if (static_cast<bool>(entry))
125 return std::make_pair(entry,
false);
126 entry = make_shared<fib::Entry>(prefix);
127 nameTreeEntry->setFibEntry(entry);
129 return std::make_pair(entry,
true);
133 Fib::erase(shared_ptr<name_tree::Entry> nameTreeEntry)
135 nameTreeEntry->setFibEntry(shared_ptr<fib::Entry>());
143 shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.
findExactMatch(prefix);
144 if (static_cast<bool>(nameTreeEntry)) {
145 this->
erase(nameTreeEntry);
152 shared_ptr<name_tree::Entry> nameTreeEntry = m_nameTree.
get(entry);
153 if (static_cast<bool>(nameTreeEntry)) {
154 this->
erase(nameTreeEntry);
161 std::list<fib::Entry*> toErase;
165 shared_ptr<fib::Entry> entry = nte.getFibEntry();
166 entry->removeNextHop(face);
167 if (!entry->hasNextHops()) {
168 toErase.push_back(entry.get());
static bool predicate_NameTreeEntry_hasFibEntry(const name_tree::Entry &entry)
shared_ptr< fib::Entry > findLongestPrefixMatch(const Name &prefix) const
performs a longest prefix match
std::pair< shared_ptr< fib::Entry >, bool > insert(const Name &prefix)
inserts a FIB entry for prefix If an entry for exact same prefix exists, that entry is returned...
bool eraseEntryIfEmpty(shared_ptr< name_tree::Entry > entry)
Delete a Name Tree Entry if this entry is empty.
shared_ptr< name_tree::Entry > get(const fib::Entry &fibEntry) const
get NameTree entry from attached FIB entry
const_iterator begin() const
returns an iterator pointing to the first FIB entry
shared_ptr< name_tree::Entry > findLongestPrefixMatch(const Name &prefix, const name_tree::EntrySelector &entrySelector=name_tree::AnyEntry()) const
Longest prefix matching for the given name.
represents a Measurements entry
void removeNextHopFromAllEntries(shared_ptr< Face > face)
removes the NextHop record for face in all entrites
void erase(const Name &prefix)
shared_ptr< fib::Entry > findExactMatch(const Name &prefix) const
shared_ptr< name_tree::Entry > lookup(const Name &prefix)
Look for the Name Tree Entry that contains this name prefix.
shared_ptr< name_tree::Entry > findExactMatch(const Name &prefix) const
Exact match lookup for the given name prefix.
boost::iterator_range< const_iterator > fullEnumerate(const name_tree::EntrySelector &entrySelector=name_tree::AnyEntry()) const
Enumerate all entries, optionally filtered by an EntrySelector.
shared_ptr< fib::Entry > getFibEntry() const