blob: 8923d9caa387eb96296ac1682d03500aedffdc03 [file] [log] [blame]
HYuana9b85752014-02-26 02:32:30 -06001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento50a6af32019-02-21 00:04:40 -05002/*
Davide Pesaventoe422f9e2022-06-03 01:30:23 -04003 * Copyright (c) 2014-2022, Regents of the University of California,
Junxiao Shib184e532016-05-26 18:09:57 +00004 * Arizona Board of Regents,
5 * Colorado State University,
6 * University Pierre & Marie Curie, Sorbonne University,
7 * Washington University in St. Louis,
8 * Beijing Institute of Technology,
9 * The University of Memphis.
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -070010 *
11 * This file is part of NFD (Named Data Networking Forwarding Daemon).
12 * See AUTHORS.md for complete list of NFD authors and contributors.
13 *
14 * NFD is free software: you can redistribute it and/or modify it under the terms
15 * of the GNU General Public License as published by the Free Software Foundation,
16 * either version 3 of the License, or (at your option) any later version.
17 *
18 * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20 * PURPOSE. See the GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along with
23 * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
Junxiao Shiee5a4442014-07-27 17:13:43 -070024 */
HYuana9b85752014-02-26 02:32:30 -060025
Alexander Afanasyev613e2a92014-04-15 13:36:58 -070026#ifndef NFD_DAEMON_TABLE_NAME_TREE_ENTRY_HPP
27#define NFD_DAEMON_TABLE_NAME_TREE_ENTRY_HPP
HYuana9b85752014-02-26 02:32:30 -060028
HYuana9b85752014-02-26 02:32:30 -060029#include "table/fib-entry.hpp"
30#include "table/pit-entry.hpp"
31#include "table/measurements-entry.hpp"
Junxiao Shibb5105f2014-03-03 12:06:45 -070032#include "table/strategy-choice-entry.hpp"
HYuana9b85752014-02-26 02:32:30 -060033
Davide Pesaventoe422f9e2022-06-03 01:30:23 -040034namespace nfd::name_tree {
HYuana9b85752014-02-26 02:32:30 -060035
Junxiao Shi340d5532016-08-13 04:00:35 +000036class Node;
37
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -040038/**
39 * \brief An entry in the name tree.
HYuana9b85752014-02-26 02:32:30 -060040 */
Junxiao Shi340d5532016-08-13 04:00:35 +000041class Entry : noncopyable
HYuana9b85752014-02-26 02:32:30 -060042{
HYuana9b85752014-02-26 02:32:30 -060043public:
Junxiao Shib660b4c2016-08-06 20:47:44 +000044 Entry(const Name& prefix, Node* node);
HYuana9b85752014-02-26 02:32:30 -060045
HYuana9b85752014-02-26 02:32:30 -060046 const Name&
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -040047 getName() const noexcept
Junxiao Shib660b4c2016-08-06 20:47:44 +000048 {
49 return m_name;
50 }
HYuana9b85752014-02-26 02:32:30 -060051
Junxiao Shib660b4c2016-08-06 20:47:44 +000052 /** \return entry of getName().getPrefix(-1)
53 * \retval nullptr this entry is the root entry, i.e. getName() == Name()
54 */
55 Entry*
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -040056 getParent() const noexcept
Junxiao Shib660b4c2016-08-06 20:47:44 +000057 {
58 return m_parent;
59 }
60
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -040061 /** \brief Set parent of this entry.
Junxiao Shib660b4c2016-08-06 20:47:44 +000062 * \param entry entry of getName().getPrefix(-1)
63 * \pre getParent() == nullptr
64 * \post getParent() == &entry
65 * \post entry.getChildren() contains this
66 */
HYuana9b85752014-02-26 02:32:30 -060067 void
Junxiao Shib660b4c2016-08-06 20:47:44 +000068 setParent(Entry& entry);
HYuana9b85752014-02-26 02:32:30 -060069
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -040070 /** \brief Unset parent of this entry.
Junxiao Shib660b4c2016-08-06 20:47:44 +000071 * \post getParent() == nullptr
72 * \post parent.getChildren() does not contain this
73 */
HYuana9b85752014-02-26 02:32:30 -060074 void
Junxiao Shib660b4c2016-08-06 20:47:44 +000075 unsetParent();
HYuana9b85752014-02-26 02:32:30 -060076
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -040077 /**
78 * \brief Check whether this entry has any children.
Junxiao Shib660b4c2016-08-06 20:47:44 +000079 */
Haowei Yuane1079fc2014-03-08 14:41:25 -060080 bool
Junxiao Shib660b4c2016-08-06 20:47:44 +000081 hasChildren() const
82 {
Davide Pesavento50a6af32019-02-21 00:04:40 -050083 return !m_children.empty();
Junxiao Shib660b4c2016-08-06 20:47:44 +000084 }
Haowei Yuane1079fc2014-03-08 14:41:25 -060085
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -040086 /**
87 * \brief Returns the children of this entry.
Junxiao Shib660b4c2016-08-06 20:47:44 +000088 */
89 const std::vector<Entry*>&
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -040090 getChildren() const noexcept
Junxiao Shib660b4c2016-08-06 20:47:44 +000091 {
92 return m_children;
93 }
94
95 /** \retval true this entry has no children and no table entries
96 * \retval false this entry has child or attached table entry
97 */
Junxiao Shi40631842014-03-01 13:52:37 -070098 bool
Junxiao Shib660b4c2016-08-06 20:47:44 +000099 isEmpty() const
100 {
101 return !this->hasChildren() && !this->hasTableEntries();
102 }
HYuana9b85752014-02-26 02:32:30 -0600103
Junxiao Shiee5a4442014-07-27 17:13:43 -0700104public: // attached table entries
Junxiao Shib660b4c2016-08-06 20:47:44 +0000105 /** \retval true at least one table entries is attached
106 * \retval false no table entry is attached
107 */
108 bool
109 hasTableEntries() const;
110
111 fib::Entry*
112 getFibEntry() const
113 {
114 return m_fibEntry.get();
115 }
116
HYuana9b85752014-02-26 02:32:30 -0600117 void
Junxiao Shia6de4292016-07-12 02:08:10 +0000118 setFibEntry(unique_ptr<fib::Entry> fibEntry);
HYuana9b85752014-02-26 02:32:30 -0600119
Junxiao Shib660b4c2016-08-06 20:47:44 +0000120 bool
121 hasPitEntries() const
122 {
123 return !this->getPitEntries().empty();
124 }
125
126 const std::vector<shared_ptr<pit::Entry>>&
127 getPitEntries() const
128 {
129 return m_pitEntries;
130 }
HYuana9b85752014-02-26 02:32:30 -0600131
HYuana9b85752014-02-26 02:32:30 -0600132 void
Junxiao Shi9f7455b2014-04-07 21:02:16 -0700133 insertPitEntry(shared_ptr<pit::Entry> pitEntry);
134
135 void
Junxiao Shidbef6dc2016-08-15 02:58:36 +0000136 erasePitEntry(pit::Entry* pitEntry);
HYuana9b85752014-02-26 02:32:30 -0600137
Junxiao Shib660b4c2016-08-06 20:47:44 +0000138 measurements::Entry*
139 getMeasurementsEntry() const
140 {
141 return m_measurementsEntry.get();
142 }
Junxiao Shie349ea12014-03-12 01:32:42 -0700143
HYuana9b85752014-02-26 02:32:30 -0600144 void
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000145 setMeasurementsEntry(unique_ptr<measurements::Entry> measurementsEntry);
HYuana9b85752014-02-26 02:32:30 -0600146
Junxiao Shib660b4c2016-08-06 20:47:44 +0000147 strategy_choice::Entry*
148 getStrategyChoiceEntry() const
149 {
150 return m_strategyChoiceEntry.get();
151 }
HYuana9b85752014-02-26 02:32:30 -0600152
Junxiao Shibb5105f2014-03-03 12:06:45 -0700153 void
Junxiao Shiff10da62016-07-13 17:57:43 +0000154 setStrategyChoiceEntry(unique_ptr<strategy_choice::Entry> strategyChoiceEntry);
Junxiao Shibb5105f2014-03-03 12:06:45 -0700155
Junxiao Shi340d5532016-08-13 04:00:35 +0000156 /** \return name tree entry on which a table entry is attached,
157 * or nullptr if the table entry is detached
158 * \note This function is for NameTree internal use. Other components
159 * should use NameTree::getEntry(tableEntry) instead.
160 */
161 template<typename ENTRY>
162 static Entry*
163 get(const ENTRY& tableEntry)
164 {
165 return tableEntry.m_nameTreeEntry;
166 }
167
HYuana9b85752014-02-26 02:32:30 -0600168private:
Junxiao Shib660b4c2016-08-06 20:47:44 +0000169 Name m_name;
170 Node* m_node;
Davide Pesavento50a6af32019-02-21 00:04:40 -0500171 Entry* m_parent = nullptr;
Junxiao Shib660b4c2016-08-06 20:47:44 +0000172 std::vector<Entry*> m_children;
173
Junxiao Shia6de4292016-07-12 02:08:10 +0000174 unique_ptr<fib::Entry> m_fibEntry;
Junxiao Shi029401f2016-08-05 12:55:14 +0000175 std::vector<shared_ptr<pit::Entry>> m_pitEntries;
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000176 unique_ptr<measurements::Entry> m_measurementsEntry;
Junxiao Shiff10da62016-07-13 17:57:43 +0000177 unique_ptr<strategy_choice::Entry> m_strategyChoiceEntry;
HYuana9b85752014-02-26 02:32:30 -0600178
Junxiao Shib660b4c2016-08-06 20:47:44 +0000179 friend Node* getNode(const Entry& entry);
HYuana9b85752014-02-26 02:32:30 -0600180};
181
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -0400182/** \brief A functor to get a table entry from a name tree entry.
Junxiao Shi13ad4b72016-08-15 04:51:21 +0000183 * \tparam ENTRY type of single table entry attached to name tree entry, such as fib::Entry
184 */
185template<typename ENTRY>
186class GetTableEntry
187{
188public:
Davide Pesaventoaa9e3b22022-10-21 17:00:07 -0400189 /** \brief A function pointer to the getter on Entry class that returns ENTRY.
Junxiao Shi13ad4b72016-08-15 04:51:21 +0000190 */
191 using Getter = ENTRY* (Entry::*)() const;
192
Junxiao Shi3aba7542016-12-24 02:42:52 +0000193 /** \note The default argument is needed to ensure FIB and StrategyChoice iterators
194 * are default-constructible.
195 */
Junxiao Shi13ad4b72016-08-15 04:51:21 +0000196 explicit
Junxiao Shi3aba7542016-12-24 02:42:52 +0000197 GetTableEntry(Getter getter = nullptr)
Junxiao Shi13ad4b72016-08-15 04:51:21 +0000198 : m_getter(getter)
199 {
200 }
201
202 const ENTRY&
203 operator()(const Entry& nte) const
204 {
205 return *(nte.*m_getter)();
206 }
207
208private:
209 Getter m_getter;
210};
211
Davide Pesaventoe422f9e2022-06-03 01:30:23 -0400212} // namespace nfd::name_tree
HYuana9b85752014-02-26 02:32:30 -0600213
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700214#endif // NFD_DAEMON_TABLE_NAME_TREE_ENTRY_HPP