blob: 7a3295af5df474dc12e79683b78f91f4ea2292db [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
Alexander Afanasyev18bbf812014-01-29 01:40:23 -080011namespace nfd {
Junxiao Shic1e12362014-01-24 20:03:26 -070012
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);
Steve DiBenedettod5f87932014-02-05 15:11:39 -070038
Junxiao Shic1e12362014-01-24 20:03:26 -070039 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{
Steve DiBenedettod5f87932014-02-05 15:11:39 -070057 shared_ptr<fib::Entry> bestMatch =
Junxiao Shic1e12362014-01-24 20:03:26 -070058 std::accumulate(m_table.begin(), m_table.end(), m_rootEntry,
59 bind(&accumulate_FibEntry_longestPrefixMatch, _1, _2, prefix));
60 return bestMatch;
61}
62
Steve DiBenedettod5f87932014-02-05 15:11:39 -070063shared_ptr<fib::Entry>
64Fib::findExactMatch(const Name& prefix) const
65{
66 std::list<shared_ptr<fib::Entry> >::const_iterator it =
67 std::find_if(m_table.begin(), m_table.end(),
68 bind(&predicate_FibEntry_eq_Name, _1, prefix));
69
70 if (it != m_table.end())
71 {
72 return *it;
73 }
74 return shared_ptr<fib::Entry>();
75}
76
77void
78Fib::remove(const Name& prefix)
79{
80 m_table.remove_if(bind(&predicate_FibEntry_eq_Name, _1, prefix));
81}
82
Junxiao Shic1e12362014-01-24 20:03:26 -070083static inline void
84FibEntry_removeNextHop(shared_ptr<fib::Entry> entry,
85 shared_ptr<Face> face)
86{
87 entry->removeNextHop(face);
88}
89
90void
91Fib::removeNextHopFromAllEntries(shared_ptr<Face> face)
92{
93 std::for_each(m_table.begin(), m_table.end(),
94 bind(&FibEntry_removeNextHop, _1, face));
95}
96
97
Alexander Afanasyev18bbf812014-01-29 01:40:23 -080098} // namespace nfd