blob: 537448efc5c146b53c08afae285c38ec4db95d7f [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande0421bc62020-05-08 20:42:19 -07002/*
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -08003 * Copyright (c) 2014-2020, 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/>.
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070019 */
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
akmhoquefdbddb12014-05-02 18:35:19 -050027#include <ndn-cxx/face.hpp>
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080028#include <set>
akmhoque53353462014-04-22 08:43:45 -050029
akmhoque53353462014-04-22 08:43:45 -050030namespace nlsr {
31
Vince Lehmanef21d8e2015-04-01 15:59:39 -050032struct NextHopComparator {
33 bool
34 operator() (const NextHop& nh1, const NextHop& nh2) const {
35 if (nh1.getRouteCostAsAdjustedInteger() < nh2.getRouteCostAsAdjustedInteger()) {
36 return true;
37 }
38 else if (nh1.getRouteCostAsAdjustedInteger() == nh2.getRouteCostAsAdjustedInteger()) {
39 return nh1.getConnectingFaceUri() < nh2.getConnectingFaceUri();
40 }
41 else {
42 return false;
43 }
44 }
45};
46
akmhoquec8a10f72014-04-25 18:42:55 -050047class NexthopList
akmhoque53353462014-04-22 08:43:45 -050048{
49public:
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070050 NexthopList() = default;
akmhoquefdbddb12014-05-02 18:35:19 -050051
Nick G97e34942016-07-11 14:46:27 -050052 /*! \brief Adds a next hop to the list.
53 \param nh The next hop.
54
Nick Gordonb50e51b2016-07-22 16:05:57 -050055 Adds a next hop to this object. If the next hop is new it is
56 added. If the next hop already exists in the list then that next
57 hop's route cost is updated.
Nick G97e34942016-07-11 14:46:27 -050058 */
akmhoque53353462014-04-22 08:43:45 -050059 void
Vince Lehmanef21d8e2015-04-01 15:59:39 -050060 addNextHop(const NextHop& nh);
akmhoque53353462014-04-22 08:43:45 -050061
Vince Lehmanef21d8e2015-04-01 15:59:39 -050062 /*! \brief Remove a next hop from the Next Hop list
63 \param nh The NextHop we want to remove.
Nick G97e34942016-07-11 14:46:27 -050064
Vince Lehmanef21d8e2015-04-01 15:59:39 -050065 The next hop gets removed only if both next hop face and route cost are same.
Nick G97e34942016-07-11 14:46:27 -050066 */
akmhoque53353462014-04-22 08:43:45 -050067 void
Vince Lehmanef21d8e2015-04-01 15:59:39 -050068 removeNextHop(const NextHop& nh);
akmhoque53353462014-04-22 08:43:45 -050069
akmhoquefdbddb12014-05-02 18:35:19 -050070 size_t
Nick Gordonff9a6272017-10-12 13:38:29 -050071 size() const
Nick Gordonb50e51b2016-07-22 16:05:57 -050072 {
73 return m_nexthopList.size();
74 }
75
akmhoque53353462014-04-22 08:43:45 -050076 void
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070077 clear()
akmhoque53353462014-04-22 08:43:45 -050078 {
akmhoquefdbddb12014-05-02 18:35:19 -050079 m_nexthopList.clear();
akmhoque53353462014-04-22 08:43:45 -050080 }
81
laqinfan35731852017-08-08 06:17:39 -050082 const std::set<NextHop, NextHopComparator>&
83 getNextHops() const
akmhoque53353462014-04-22 08:43:45 -050084 {
85 return m_nexthopList;
86 }
87
Vince Lehmanef21d8e2015-04-01 15:59:39 -050088 typedef std::set<NextHop, NextHopComparator>::iterator iterator;
89 typedef std::set<NextHop, NextHopComparator>::const_iterator const_iterator;
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070090 typedef std::set<NextHop, NextHopComparator>::reverse_iterator reverse_iterator;
Vince Lehman18841082014-08-19 17:15:24 -050091
92 iterator
93 begin()
94 {
95 return m_nexthopList.begin();
96 }
97
98 iterator
99 end()
100 {
101 return m_nexthopList.end();
102 }
103
Vince Lehman942eb7b2014-10-02 10:09:27 -0500104 const_iterator
105 cbegin() const
106 {
107 return m_nexthopList.begin();
108 }
109
110 const_iterator
111 cend() const
112 {
113 return m_nexthopList.end();
114 }
115
Ashlesh Gawande0421bc62020-05-08 20:42:19 -0700116 reverse_iterator
117 rbegin() const
118 {
119 return m_nexthopList.rbegin();
120 }
121
122 reverse_iterator
123 rend() const
124 {
125 return m_nexthopList.rend();
126 }
akmhoque674b0b12014-05-20 14:33:28 -0500127
akmhoque53353462014-04-22 08:43:45 -0500128private:
Vince Lehmanef21d8e2015-04-01 15:59:39 -0500129 std::set<NextHop, NextHopComparator> m_nexthopList;
akmhoque53353462014-04-22 08:43:45 -0500130};
131
Nick Gordonb50e51b2016-07-22 16:05:57 -0500132bool
133operator==(NexthopList& lhs, NexthopList& rhs);
134
135bool
136operator==(const NexthopList& lhs, const NexthopList& rhs);
137
Nick Gordonc0c6bcf2017-08-15 18:11:21 -0500138bool
139operator!=(const NexthopList& lhs, const NexthopList& rhs);
140
Nick Gordonb50e51b2016-07-22 16:05:57 -0500141std::ostream&
142operator<<(std::ostream& os, const NexthopList& nhl);
143
Nick Gordonfad8e252016-08-11 14:21:38 -0500144} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500145
Nick Gordond0a7df32017-05-30 16:44:34 -0500146#endif // NLSR_NEXTHOP_LIST_HPP