blob: 1628d96ac23fa79d8e8fa4cfab2b0bea941dcd4e [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-entry.hpp"
Junxiao Shic1e12362014-01-24 20:03:26 -07008
Alexander Afanasyev18bbf812014-01-29 01:40:23 -08009namespace nfd {
Junxiao Shic1e12362014-01-24 20:03:26 -070010namespace fib {
11
12Entry::Entry(const Name& prefix)
13 : m_prefix(prefix)
14{
15}
16
17static inline bool
18predicate_NextHop_eq_Face(const NextHop& nexthop, shared_ptr<Face> face)
19{
20 return nexthop.getFace() == face;
21}
22
Junxiao Shi0b5fbbb2014-02-20 15:54:03 -070023bool
24Entry::hasNextHop(shared_ptr<Face> face) const
25{
26 NextHopList::const_iterator it = std::find_if(m_nextHops.begin(), m_nextHops.end(),
27 bind(&predicate_NextHop_eq_Face, _1, face));
28 return it != m_nextHops.end();
29}
30
Junxiao Shic1e12362014-01-24 20:03:26 -070031void
32Entry::addNextHop(shared_ptr<Face> face, int32_t cost)
33{
34 NextHopList::iterator it = std::find_if(m_nextHops.begin(), m_nextHops.end(),
35 bind(&predicate_NextHop_eq_Face, _1, face));
36 if (it == m_nextHops.end()) {
37 m_nextHops.push_back(fib::NextHop(face));
38 it = m_nextHops.end() - 1;
39 }
40 // now it refers to the NextHop for face
Junxiao Shi7bb01512014-03-05 21:34:09 -070041
Junxiao Shic1e12362014-01-24 20:03:26 -070042 it->setCost(cost);
Junxiao Shi7bb01512014-03-05 21:34:09 -070043
Junxiao Shic1e12362014-01-24 20:03:26 -070044 this->sortNextHops();
Junxiao Shic1e12362014-01-24 20:03:26 -070045}
46
47void
48Entry::removeNextHop(shared_ptr<Face> face)
49{
50 NextHopList::iterator it = std::find_if(m_nextHops.begin(), m_nextHops.end(),
51 bind(&predicate_NextHop_eq_Face, _1, face));
52 if (it == m_nextHops.end()) {
53 return;
54 }
Junxiao Shi7bb01512014-03-05 21:34:09 -070055
Junxiao Shic1e12362014-01-24 20:03:26 -070056 m_nextHops.erase(it);
57}
58
59static inline bool
60compare_NextHop_cost(const NextHop& a, const NextHop& b)
61{
62 return a.getCost() < b.getCost();
63}
64
65void
66Entry::sortNextHops()
67{
68 std::sort(m_nextHops.begin(), m_nextHops.end(), &compare_NextHop_cost);
69}
70
71
72} // namespace fib
Alexander Afanasyev18bbf812014-01-29 01:40:23 -080073} // namespace nfd