blob: 9ba07724afdd181d8a5dfe6fb1b9f144a3ab7ceb [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Nick Gordonc6a85222017-01-03 16:54:34 -06003 * Copyright (c) 2014-2017, The University of Memphis,
Nick Gordonf8b5bcd2016-08-11 15:06:50 -05004 * Regents of the University of California
akmhoque3d06e792014-05-27 16:23:20 -05005 *
6 * This file is part of NLSR (Named-data Link State Routing).
7 * See AUTHORS.md for complete list of NLSR authors and contributors.
8 *
9 * NLSR is free software: you can redistribute it and/or modify it under the terms
10 * of the GNU General Public License as published by the Free Software Foundation,
11 * either version 3 of the License, or (at your option) any later version.
12 *
13 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
14 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
akmhoque3d06e792014-05-27 16:23:20 -050019 **/
Nick Gordond0a7df32017-05-30 16:44:34 -050020
akmhoquefdbddb12014-05-02 18:35:19 -050021#ifndef NLSR_NEXTHOP_LIST_HPP
22#define NLSR_NEXTHOP_LIST_HPP
akmhoque53353462014-04-22 08:43:45 -050023
Nick Gordond0a7df32017-05-30 16:44:34 -050024#include "nexthop.hpp"
25#include "adjacent.hpp"
26
Vince Lehmanef21d8e2015-04-01 15:59:39 -050027#include <set>
akmhoque53353462014-04-22 08:43:45 -050028#include <iostream>
akmhoquefdbddb12014-05-02 18:35:19 -050029#include <boost/cstdint.hpp>
akmhoquefdbddb12014-05-02 18:35:19 -050030#include <ndn-cxx/face.hpp>
akmhoque53353462014-04-22 08:43:45 -050031
akmhoque53353462014-04-22 08:43:45 -050032namespace nlsr {
33
Vince Lehmanef21d8e2015-04-01 15:59:39 -050034struct NextHopComparator {
35 bool
36 operator() (const NextHop& nh1, const NextHop& nh2) const {
37 if (nh1.getRouteCostAsAdjustedInteger() < nh2.getRouteCostAsAdjustedInteger()) {
38 return true;
39 }
40 else if (nh1.getRouteCostAsAdjustedInteger() == nh2.getRouteCostAsAdjustedInteger()) {
41 return nh1.getConnectingFaceUri() < nh2.getConnectingFaceUri();
42 }
43 else {
44 return false;
45 }
46 }
47};
48
akmhoquec8a10f72014-04-25 18:42:55 -050049class NexthopList
akmhoque53353462014-04-22 08:43:45 -050050{
51public:
akmhoquec8a10f72014-04-25 18:42:55 -050052 NexthopList()
akmhoque53353462014-04-22 08:43:45 -050053 {
54 }
55
akmhoquec8a10f72014-04-25 18:42:55 -050056 ~NexthopList()
akmhoque53353462014-04-22 08:43:45 -050057 {
58 }
akmhoquefdbddb12014-05-02 18:35:19 -050059
Nick G97e34942016-07-11 14:46:27 -050060 /*! \brief Adds a next hop to the list.
61 \param nh The next hop.
62
Nick Gordonb50e51b2016-07-22 16:05:57 -050063 Adds a next hop to this object. If the next hop is new it is
64 added. If the next hop already exists in the list then that next
65 hop's route cost is updated.
Nick G97e34942016-07-11 14:46:27 -050066 */
akmhoque53353462014-04-22 08:43:45 -050067 void
Vince Lehmanef21d8e2015-04-01 15:59:39 -050068 addNextHop(const NextHop& nh);
akmhoque53353462014-04-22 08:43:45 -050069
Vince Lehmanef21d8e2015-04-01 15:59:39 -050070 /*! \brief Remove a next hop from the Next Hop list
71 \param nh The NextHop we want to remove.
Nick G97e34942016-07-11 14:46:27 -050072
Vince Lehmanef21d8e2015-04-01 15:59:39 -050073 The next hop gets removed only if both next hop face and route cost are same.
Nick G97e34942016-07-11 14:46:27 -050074 */
akmhoque53353462014-04-22 08:43:45 -050075 void
Vince Lehmanef21d8e2015-04-01 15:59:39 -050076 removeNextHop(const NextHop& nh);
akmhoque53353462014-04-22 08:43:45 -050077
akmhoquefdbddb12014-05-02 18:35:19 -050078 size_t
Nick Gordonff9a6272017-10-12 13:38:29 -050079 size() const
Nick Gordonb50e51b2016-07-22 16:05:57 -050080 {
81 return m_nexthopList.size();
82 }
83
akmhoque53353462014-04-22 08:43:45 -050084 void
85 reset()
86 {
akmhoquefdbddb12014-05-02 18:35:19 -050087 m_nexthopList.clear();
akmhoque53353462014-04-22 08:43:45 -050088 }
89
Vince Lehmanef21d8e2015-04-01 15:59:39 -050090 std::set<NextHop, NextHopComparator>&
akmhoquefdbddb12014-05-02 18:35:19 -050091 getNextHops()
akmhoque53353462014-04-22 08:43:45 -050092 {
93 return m_nexthopList;
94 }
95
Vince Lehmanef21d8e2015-04-01 15:59:39 -050096 typedef std::set<NextHop, NextHopComparator>::iterator iterator;
97 typedef std::set<NextHop, NextHopComparator>::const_iterator const_iterator;
Vince Lehman18841082014-08-19 17:15:24 -050098
99 iterator
100 begin()
101 {
102 return m_nexthopList.begin();
103 }
104
105 iterator
106 end()
107 {
108 return m_nexthopList.end();
109 }
110
Vince Lehman942eb7b2014-10-02 10:09:27 -0500111 const_iterator
112 cbegin() const
113 {
114 return m_nexthopList.begin();
115 }
116
117 const_iterator
118 cend() const
119 {
120 return m_nexthopList.end();
121 }
122
akmhoque674b0b12014-05-20 14:33:28 -0500123 void
124 writeLog();
125
akmhoque53353462014-04-22 08:43:45 -0500126private:
Vince Lehmanef21d8e2015-04-01 15:59:39 -0500127 std::set<NextHop, NextHopComparator> m_nexthopList;
akmhoque53353462014-04-22 08:43:45 -0500128};
129
Nick Gordonb50e51b2016-07-22 16:05:57 -0500130bool
131operator==(NexthopList& lhs, NexthopList& rhs);
132
133bool
134operator==(const NexthopList& lhs, const NexthopList& rhs);
135
Nick Gordonc0c6bcf2017-08-15 18:11:21 -0500136bool
137operator!=(const NexthopList& lhs, const NexthopList& rhs);
138
Nick Gordonb50e51b2016-07-22 16:05:57 -0500139std::ostream&
140operator<<(std::ostream& os, const NexthopList& nhl);
141
Nick Gordonfad8e252016-08-11 14:21:38 -0500142} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500143
Nick Gordond0a7df32017-05-30 16:44:34 -0500144#endif // NLSR_NEXTHOP_LIST_HPP