/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /** * Copyright (C) 2014 Named Data Networking Project * See COPYING for copyright and distribution information. */ #include "fib.hpp" #include "pit-entry.hpp" #include "measurements-entry.hpp" namespace nfd { const shared_ptr Fib::m_emptyEntry = make_shared(Name()); Fib::Fib(NameTree& nameTree) : m_nameTree(nameTree) , m_nItems(0) { } Fib::~Fib() { } static inline bool predicate_NameTreeEntry_hasFibEntry(const name_tree::Entry& entry) { return static_cast(entry.getFibEntry()); } std::pair, bool> Fib::insert(const Name& prefix) { shared_ptr nameTreeEntry = m_nameTree.lookup(prefix); shared_ptr entry = nameTreeEntry->getFibEntry(); if (static_cast(entry)) return std::make_pair(entry, false); entry = make_shared(prefix); nameTreeEntry->setFibEntry(entry); m_nItems++; return std::make_pair(entry, true); } shared_ptr Fib::findLongestPrefixMatch(const Name& prefix) const { shared_ptr nameTreeEntry = m_nameTree.findLongestPrefixMatch(prefix, &predicate_NameTreeEntry_hasFibEntry); if (static_cast(nameTreeEntry)) { return nameTreeEntry->getFibEntry(); } return m_emptyEntry; } shared_ptr Fib::findLongestPrefixMatch(const pit::Entry& pitEntry) const { return this->findLongestPrefixMatch(pitEntry.getName()); } shared_ptr Fib::findLongestPrefixMatch(const measurements::Entry& measurementsEntry) const { return this->findLongestPrefixMatch(measurementsEntry.getName()); } shared_ptr Fib::findExactMatch(const Name& prefix) const { shared_ptr nameTreeEntry = m_nameTree.findExactMatch(prefix); if (static_cast(nameTreeEntry)) return nameTreeEntry->getFibEntry(); return shared_ptr(); } void Fib::erase(const Name& prefix) { shared_ptr nameTreeEntry = m_nameTree.findExactMatch(prefix); if (static_cast(nameTreeEntry)) { nameTreeEntry->eraseFibEntry(nameTreeEntry->getFibEntry()); m_nItems--; } } void Fib::removeNextHopFromAllEntries(shared_ptr face) { shared_ptr > > nameTreeEntries = m_nameTree.fullEnumerate(&predicate_NameTreeEntry_hasFibEntry); for (size_t i = 0; i < nameTreeEntries->size(); ++i) { shared_ptr entry = nameTreeEntries->at(i)->getFibEntry(); entry->removeNextHop(face); } } } // namespace nfd