blob: 9875891ad1a43d133901f4d27b4058c3eda31533 [file] [log] [blame]
HYuana9b85752014-02-26 02:32:30 -06001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Junxiao Shib184e532016-05-26 18:09:57 +00003 * Copyright (c) 2014-2016, Regents of the University of California,
4 * 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
Junxiao Shib660b4c2016-08-06 20:47:44 +000029#include "name-tree-hashtable.hpp"
HYuana9b85752014-02-26 02:32:30 -060030#include "table/fib-entry.hpp"
31#include "table/pit-entry.hpp"
32#include "table/measurements-entry.hpp"
Junxiao Shibb5105f2014-03-03 12:06:45 -070033#include "table/strategy-choice-entry.hpp"
HYuana9b85752014-02-26 02:32:30 -060034
35namespace nfd {
HYuana9b85752014-02-26 02:32:30 -060036namespace name_tree {
37
Junxiao Shib660b4c2016-08-06 20:47:44 +000038/** \brief an entry in the name tree
HYuana9b85752014-02-26 02:32:30 -060039 */
Junxiao Shiefceadc2014-03-09 18:52:57 -070040class Entry : public enable_shared_from_this<Entry>, noncopyable
HYuana9b85752014-02-26 02:32:30 -060041{
HYuana9b85752014-02-26 02:32:30 -060042public:
Junxiao Shib660b4c2016-08-06 20:47:44 +000043 Entry(const Name& prefix, Node* node);
HYuana9b85752014-02-26 02:32:30 -060044
HYuana9b85752014-02-26 02:32:30 -060045 const Name&
Junxiao Shib660b4c2016-08-06 20:47:44 +000046 getName() const
47 {
48 return m_name;
49 }
HYuana9b85752014-02-26 02:32:30 -060050
Junxiao Shib660b4c2016-08-06 20:47:44 +000051 /// \deprecated
52 const Name&
53 getPrefix() const
54 {
55 return this->getName();
56 }
57
58 /** \return entry of getName().getPrefix(-1)
59 * \retval nullptr this entry is the root entry, i.e. getName() == Name()
60 */
61 Entry*
62 getParent() const
63 {
64 return m_parent;
65 }
66
67 /** \brief set parent of this entry
68 * \param entry entry of getName().getPrefix(-1)
69 * \pre getParent() == nullptr
70 * \post getParent() == &entry
71 * \post entry.getChildren() contains this
72 */
HYuana9b85752014-02-26 02:32:30 -060073 void
Junxiao Shib660b4c2016-08-06 20:47:44 +000074 setParent(Entry& entry);
HYuana9b85752014-02-26 02:32:30 -060075
Junxiao Shib660b4c2016-08-06 20:47:44 +000076 /** \brief unset parent of this entry
77 * \post getParent() == nullptr
78 * \post parent.getChildren() does not contain this
79 */
HYuana9b85752014-02-26 02:32:30 -060080 void
Junxiao Shib660b4c2016-08-06 20:47:44 +000081 unsetParent();
HYuana9b85752014-02-26 02:32:30 -060082
Junxiao Shib660b4c2016-08-06 20:47:44 +000083 /** \retval true this entry has at least one child
84 * \retval false this entry has no children
85 */
Haowei Yuane1079fc2014-03-08 14:41:25 -060086 bool
Junxiao Shib660b4c2016-08-06 20:47:44 +000087 hasChildren() const
88 {
89 return !this->getChildren().empty();
90 }
Haowei Yuane1079fc2014-03-08 14:41:25 -060091
Junxiao Shib660b4c2016-08-06 20:47:44 +000092 /** \return children of this entry
93 */
94 const std::vector<Entry*>&
95 getChildren() const
96 {
97 return m_children;
98 }
99
100 /** \retval true this entry has no children and no table entries
101 * \retval false this entry has child or attached table entry
102 */
Junxiao Shi40631842014-03-01 13:52:37 -0700103 bool
Junxiao Shib660b4c2016-08-06 20:47:44 +0000104 isEmpty() const
105 {
106 return !this->hasChildren() && !this->hasTableEntries();
107 }
HYuana9b85752014-02-26 02:32:30 -0600108
Junxiao Shiee5a4442014-07-27 17:13:43 -0700109public: // attached table entries
Junxiao Shib660b4c2016-08-06 20:47:44 +0000110 /** \retval true at least one table entries is attached
111 * \retval false no table entry is attached
112 */
113 bool
114 hasTableEntries() const;
115
116 fib::Entry*
117 getFibEntry() const
118 {
119 return m_fibEntry.get();
120 }
121
HYuana9b85752014-02-26 02:32:30 -0600122 void
Junxiao Shia6de4292016-07-12 02:08:10 +0000123 setFibEntry(unique_ptr<fib::Entry> fibEntry);
HYuana9b85752014-02-26 02:32:30 -0600124
Junxiao Shib660b4c2016-08-06 20:47:44 +0000125 bool
126 hasPitEntries() const
127 {
128 return !this->getPitEntries().empty();
129 }
130
131 const std::vector<shared_ptr<pit::Entry>>&
132 getPitEntries() const
133 {
134 return m_pitEntries;
135 }
HYuana9b85752014-02-26 02:32:30 -0600136
HYuana9b85752014-02-26 02:32:30 -0600137 void
Junxiao Shi9f7455b2014-04-07 21:02:16 -0700138 insertPitEntry(shared_ptr<pit::Entry> pitEntry);
139
140 void
141 erasePitEntry(shared_ptr<pit::Entry> pitEntry);
HYuana9b85752014-02-26 02:32:30 -0600142
Junxiao Shib660b4c2016-08-06 20:47:44 +0000143 measurements::Entry*
144 getMeasurementsEntry() const
145 {
146 return m_measurementsEntry.get();
147 }
Junxiao Shie349ea12014-03-12 01:32:42 -0700148
HYuana9b85752014-02-26 02:32:30 -0600149 void
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000150 setMeasurementsEntry(unique_ptr<measurements::Entry> measurementsEntry);
HYuana9b85752014-02-26 02:32:30 -0600151
Junxiao Shib660b4c2016-08-06 20:47:44 +0000152 strategy_choice::Entry*
153 getStrategyChoiceEntry() const
154 {
155 return m_strategyChoiceEntry.get();
156 }
HYuana9b85752014-02-26 02:32:30 -0600157
Junxiao Shibb5105f2014-03-03 12:06:45 -0700158 void
Junxiao Shiff10da62016-07-13 17:57:43 +0000159 setStrategyChoiceEntry(unique_ptr<strategy_choice::Entry> strategyChoiceEntry);
Junxiao Shibb5105f2014-03-03 12:06:45 -0700160
HYuana9b85752014-02-26 02:32:30 -0600161private:
Junxiao Shib660b4c2016-08-06 20:47:44 +0000162 Name m_name;
163 Node* m_node;
164 Entry* m_parent;
165 std::vector<Entry*> m_children;
166
Junxiao Shia6de4292016-07-12 02:08:10 +0000167 unique_ptr<fib::Entry> m_fibEntry;
Junxiao Shi029401f2016-08-05 12:55:14 +0000168 std::vector<shared_ptr<pit::Entry>> m_pitEntries;
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000169 unique_ptr<measurements::Entry> m_measurementsEntry;
Junxiao Shiff10da62016-07-13 17:57:43 +0000170 unique_ptr<strategy_choice::Entry> m_strategyChoiceEntry;
HYuana9b85752014-02-26 02:32:30 -0600171
Junxiao Shib660b4c2016-08-06 20:47:44 +0000172 friend Node* getNode(const Entry& entry);
HYuana9b85752014-02-26 02:32:30 -0600173};
174
HYuana9b85752014-02-26 02:32:30 -0600175} // namespace name_tree
176} // namespace nfd
177
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700178#endif // NFD_DAEMON_TABLE_NAME_TREE_ENTRY_HPP