blob: 1d8fe3a7c31ef522cabd7a0960351ffb7c832bdd [file] [log] [blame]
Junxiao Shic1e12362014-01-24 20:03:26 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (C) 2014 Named Data Networking Project
4 * See COPYING for copyright and distribution information.
5 */
6
7#include "fib.hpp"
8#include <algorithm>
9#include <numeric>
10
11namespace ndn {
12
13Fib::Fib()
14{
15 std::pair<shared_ptr<fib::Entry>, bool> pair_rootEntry_dummy =
16 this->insert(Name());
17 m_rootEntry = pair_rootEntry_dummy.first;
18}
19
20Fib::~Fib()
21{
22}
23
24static inline bool
25predicate_FibEntry_eq_Name(const shared_ptr<fib::Entry>& entry,
26 const Name& name)
27{
28 return entry->getPrefix().equals(name);
29}
30
31std::pair<shared_ptr<fib::Entry>, bool>
32Fib::insert(const Name& prefix)
33{
34 std::list<shared_ptr<fib::Entry> >::iterator it = std::find_if(
35 m_table.begin(), m_table.end(),
36 bind(&predicate_FibEntry_eq_Name, _1, prefix));
37 if (it != m_table.end()) return std::make_pair(*it, false);
38
39 shared_ptr<fib::Entry> entry = make_shared<fib::Entry>(prefix);
40 m_table.push_back(entry);
41 return std::make_pair(entry, true);
42}
43
44static inline const shared_ptr<fib::Entry>&
45accumulate_FibEntry_longestPrefixMatch(
46 const shared_ptr<fib::Entry>& bestMatch,
47 const shared_ptr<fib::Entry>& entry, const Name& name)
48{
49 if (!entry->getPrefix().isPrefixOf(name)) return bestMatch;
50 if (bestMatch->getPrefix().size() < entry->getPrefix().size()) return entry;
51 return bestMatch;
52}
53
54shared_ptr<fib::Entry>
55Fib::findLongestPrefixMatch(const Name& prefix) const
56{
57 shared_ptr<fib::Entry> bestMatch =
58 std::accumulate(m_table.begin(), m_table.end(), m_rootEntry,
59 bind(&accumulate_FibEntry_longestPrefixMatch, _1, _2, prefix));
60 return bestMatch;
61}
62
63static inline void
64FibEntry_removeNextHop(shared_ptr<fib::Entry> entry,
65 shared_ptr<Face> face)
66{
67 entry->removeNextHop(face);
68}
69
70void
71Fib::removeNextHopFromAllEntries(shared_ptr<Face> face)
72{
73 std::for_each(m_table.begin(), m_table.end(),
74 bind(&FibEntry_removeNextHop, _1, face));
75}
76
77
78} // namespace ndn