blob: 2827926ffa9cc390ce58c3f825c3b0ac6232f101 [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
29#include "common.hpp"
30#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 {
36
37class NameTree;
38
39namespace name_tree {
40
Haowei Yuane1079fc2014-03-08 14:41:25 -060041// Forward declarations
HYuana9b85752014-02-26 02:32:30 -060042class Node;
43class Entry;
44
45/**
Haowei Yuane1079fc2014-03-08 14:41:25 -060046 * \brief Name Tree Node Class
HYuana9b85752014-02-26 02:32:30 -060047 */
48class Node
49{
50public:
51 Node();
52
53 ~Node();
54
55public:
56 // variables are in public as this is just a data structure
57 shared_ptr<Entry> m_entry; // Name Tree Entry (i.e., Name Prefix Entry)
58 Node* m_prev; // Previous Name Tree Node (to resolve hash collision)
59 Node* m_next; // Next Name Tree Node (to resolve hash collision)
60};
61
62/**
Haowei Yuane1079fc2014-03-08 14:41:25 -060063 * \brief Name Tree Entry Class
HYuana9b85752014-02-26 02:32:30 -060064 */
Junxiao Shiefceadc2014-03-09 18:52:57 -070065class Entry : public enable_shared_from_this<Entry>, noncopyable
HYuana9b85752014-02-26 02:32:30 -060066{
HYuana9b85752014-02-26 02:32:30 -060067public:
68 explicit
69 Entry(const Name& prefix);
70
71 ~Entry();
72
73 const Name&
74 getPrefix() const;
75
76 void
Haowei Yuanf52dac72014-03-24 23:35:03 -050077 setHash(size_t hash);
HYuana9b85752014-02-26 02:32:30 -060078
Haowei Yuanf52dac72014-03-24 23:35:03 -050079 size_t
HYuana9b85752014-02-26 02:32:30 -060080 getHash() const;
81
82 void
83 setParent(shared_ptr<Entry> parent);
84
85 shared_ptr<Entry>
86 getParent() const;
87
88 std::vector<shared_ptr<Entry> >&
89 getChildren();
Haowei Yuane1079fc2014-03-08 14:41:25 -060090
91 bool
92 hasChildren() const;
93
Junxiao Shi40631842014-03-01 13:52:37 -070094 bool
95 isEmpty() const;
HYuana9b85752014-02-26 02:32:30 -060096
Junxiao Shiee5a4442014-07-27 17:13:43 -070097public: // attached table entries
HYuana9b85752014-02-26 02:32:30 -060098 void
Junxiao Shia6de4292016-07-12 02:08:10 +000099 setFibEntry(unique_ptr<fib::Entry> fibEntry);
HYuana9b85752014-02-26 02:32:30 -0600100
Junxiao Shia6de4292016-07-12 02:08:10 +0000101 fib::Entry*
HYuana9b85752014-02-26 02:32:30 -0600102 getFibEntry() const;
103
HYuana9b85752014-02-26 02:32:30 -0600104 void
Junxiao Shi9f7455b2014-04-07 21:02:16 -0700105 insertPitEntry(shared_ptr<pit::Entry> pitEntry);
106
107 void
108 erasePitEntry(shared_ptr<pit::Entry> pitEntry);
HYuana9b85752014-02-26 02:32:30 -0600109
Haowei Yuane1079fc2014-03-08 14:41:25 -0600110 bool
111 hasPitEntries() const;
112
Junxiao Shib184e532016-05-26 18:09:57 +0000113 const std::vector<shared_ptr<pit::Entry>>&
Junxiao Shie349ea12014-03-12 01:32:42 -0700114 getPitEntries() const;
115
HYuana9b85752014-02-26 02:32:30 -0600116 void
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000117 setMeasurementsEntry(unique_ptr<measurements::Entry> measurementsEntry);
HYuana9b85752014-02-26 02:32:30 -0600118
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000119 measurements::Entry*
HYuana9b85752014-02-26 02:32:30 -0600120 getMeasurementsEntry() const;
121
Junxiao Shibb5105f2014-03-03 12:06:45 -0700122 void
Junxiao Shiff10da62016-07-13 17:57:43 +0000123 setStrategyChoiceEntry(unique_ptr<strategy_choice::Entry> strategyChoiceEntry);
Junxiao Shibb5105f2014-03-03 12:06:45 -0700124
Junxiao Shiff10da62016-07-13 17:57:43 +0000125 strategy_choice::Entry*
Junxiao Shibb5105f2014-03-03 12:06:45 -0700126 getStrategyChoiceEntry() const;
127
HYuana9b85752014-02-26 02:32:30 -0600128private:
Haowei Yuanf52dac72014-03-24 23:35:03 -0500129 // Benefits of storing m_hash
130 // 1. m_hash is compared before m_prefix is compared
131 // 2. fast hash table resize support
132 size_t m_hash;
HYuana9b85752014-02-26 02:32:30 -0600133 Name m_prefix;
134 shared_ptr<Entry> m_parent; // Pointing to the parent entry.
135 std::vector<shared_ptr<Entry> > m_children; // Children pointers.
Junxiao Shia6de4292016-07-12 02:08:10 +0000136 unique_ptr<fib::Entry> m_fibEntry;
HYuana9b85752014-02-26 02:32:30 -0600137 std::vector<shared_ptr<pit::Entry> > m_pitEntries;
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000138 unique_ptr<measurements::Entry> m_measurementsEntry;
Junxiao Shiff10da62016-07-13 17:57:43 +0000139 unique_ptr<strategy_choice::Entry> m_strategyChoiceEntry;
HYuana9b85752014-02-26 02:32:30 -0600140
141 // get the Name Tree Node that is associated with this Name Tree Entry
142 Node* m_node;
Haowei Yuanf52dac72014-03-24 23:35:03 -0500143
Junxiao Shi9f7455b2014-04-07 21:02:16 -0700144 // Make private members accessible by Name Tree
145 friend class nfd::NameTree;
HYuana9b85752014-02-26 02:32:30 -0600146};
147
148inline const Name&
149Entry::getPrefix() const
150{
151 return m_prefix;
152}
153
Haowei Yuanf52dac72014-03-24 23:35:03 -0500154inline size_t
HYuana9b85752014-02-26 02:32:30 -0600155Entry::getHash() const
156{
157 return m_hash;
158}
159
Haowei Yuanf52dac72014-03-24 23:35:03 -0500160inline void
161Entry::setHash(size_t hash)
162{
163 m_hash = hash;
164}
165
HYuana9b85752014-02-26 02:32:30 -0600166inline shared_ptr<Entry>
167Entry::getParent() const
168{
169 return m_parent;
170}
171
Haowei Yuanf52dac72014-03-24 23:35:03 -0500172inline void
173Entry::setParent(shared_ptr<Entry> parent)
174{
175 m_parent = parent;
176}
177
HYuana9b85752014-02-26 02:32:30 -0600178inline std::vector<shared_ptr<name_tree::Entry> >&
179Entry::getChildren()
180{
181 return m_children;
182}
183
Junxiao Shi40631842014-03-01 13:52:37 -0700184inline bool
Haowei Yuane1079fc2014-03-08 14:41:25 -0600185Entry::hasChildren() const
186{
187 return !m_children.empty();
188}
189
Junxiao Shia6de4292016-07-12 02:08:10 +0000190inline fib::Entry*
HYuana9b85752014-02-26 02:32:30 -0600191Entry::getFibEntry() const
192{
Junxiao Shia6de4292016-07-12 02:08:10 +0000193 return m_fibEntry.get();
HYuana9b85752014-02-26 02:32:30 -0600194}
195
Haowei Yuane1079fc2014-03-08 14:41:25 -0600196inline bool
197Entry::hasPitEntries() const
198{
199 return !m_pitEntries.empty();
200}
201
Junxiao Shib184e532016-05-26 18:09:57 +0000202inline const std::vector<shared_ptr<pit::Entry>>&
Junxiao Shie349ea12014-03-12 01:32:42 -0700203Entry::getPitEntries() const
204{
205 return m_pitEntries;
206}
207
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000208inline measurements::Entry*
HYuana9b85752014-02-26 02:32:30 -0600209Entry::getMeasurementsEntry() const
210{
Junxiao Shi80f9fcd2016-07-23 02:48:36 +0000211 return m_measurementsEntry.get();
HYuana9b85752014-02-26 02:32:30 -0600212}
213
Junxiao Shiff10da62016-07-13 17:57:43 +0000214inline strategy_choice::Entry*
Junxiao Shibb5105f2014-03-03 12:06:45 -0700215Entry::getStrategyChoiceEntry() const
216{
Junxiao Shiff10da62016-07-13 17:57:43 +0000217 return m_strategyChoiceEntry.get();
Junxiao Shibb5105f2014-03-03 12:06:45 -0700218}
219
HYuana9b85752014-02-26 02:32:30 -0600220} // namespace name_tree
221} // namespace nfd
222
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700223#endif // NFD_DAEMON_TABLE_NAME_TREE_ENTRY_HPP