blob: 34fd4088cf936e28e4db2fccd05980e5b175191c [file] [log] [blame]
Junxiao Shi0fcb41e2014-01-24 10:29:43 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento84c65c02017-07-05 18:40:34 +00002/*
3 * Copyright (c) 2014-2017, Regents of the University of California,
Junxiao Shi5640ec82015-01-07 21:51:19 -07004 * 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.
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080010 *
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -070011 * 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 Shia9388182014-12-13 23:16:09 -070024 */
25
26/** \file
Alexander Afanasyev9bcbc7c2014-04-06 19:37:37 -070027 *
Junxiao Shia9388182014-12-13 23:16:09 -070028 * \brief implements the ContentStore
29 *
30 * This ContentStore implementation consists of two data structures,
31 * a Table, and a set of cleanup queues.
32 *
33 * The Table is a container (std::set) sorted by full Names of stored Data packets.
34 * Data packets are wrapped in Entry objects.
35 * Each Entry contain the Data packet itself,
36 * and a few addition attributes such as the staleness of the Data packet.
37 *
38 * The cleanup queues are three doubly linked lists which stores Table iterators.
39 * The three queues keep track of unsolicited, stale, and fresh Data packet, respectively.
40 * Table iterator is placed into, removed from, and moved between suitable queues
41 * whenever an Entry is added, removed, or has other attribute changes.
42 * The Table iterator of an Entry should be in exactly one queue at any moment.
43 * Within each queue, the iterators are kept in first-in-first-out order.
44 * Eviction procedure exhausts the first queue before moving onto the next queue,
45 * in the order of unsolicited, stale, and fresh queue.
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070046 */
47
Alexander Afanasyev613e2a92014-04-15 13:36:58 -070048#ifndef NFD_DAEMON_TABLE_CS_HPP
49#define NFD_DAEMON_TABLE_CS_HPP
Alexander Afanasyevb927a3a2014-01-24 10:41:47 -080050
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050051#include "cs-policy.hpp"
52#include "cs-internal.hpp"
Junxiao Shifc206962015-01-16 11:12:22 -070053#include "cs-entry-impl.hpp"
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -050054#include <ndn-cxx/util/signal.hpp>
Junxiao Shifc206962015-01-16 11:12:22 -070055#include <boost/iterator/transform_iterator.hpp>
Ilya Moiseenko96b80bb2014-04-05 20:53:27 -040056
Alexander Afanasyev18bbf812014-01-29 01:40:23 -080057namespace nfd {
Junxiao Shia9388182014-12-13 23:16:09 -070058namespace cs {
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070059
Junxiao Shia9388182014-12-13 23:16:09 -070060/** \brief represents the ContentStore
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070061 */
Alexander Afanasyevb927a3a2014-01-24 10:41:47 -080062class Cs : noncopyable
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070063{
64public:
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080065 explicit
Junxiao Shib4a5acd2016-12-07 19:59:18 +000066 Cs(size_t nMaxPackets = 10);
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080067
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070068 /** \brief inserts a Data packet
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070069 */
Minsheng Zhangffe8bbb2016-03-10 13:40:37 -070070 void
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080071 insert(const Data& data, bool isUnsolicited = false);
72
mzhang4eab72492015-02-25 11:16:09 -060073 typedef std::function<void(const Interest&, const Data& data)> HitCallback;
74 typedef std::function<void(const Interest&)> MissCallback;
75
Junxiao Shia9388182014-12-13 23:16:09 -070076 /** \brief finds the best matching Data packet
mzhang4eab72492015-02-25 11:16:09 -060077 * \param interest the Interest for lookup
78 * \param hitCallback a callback if a match is found; must not be empty
79 * \param missCallback a callback if there's no match; must not be empty
80 * \note A lookup invokes either callback exactly once.
81 * The callback may be invoked either before or after find() returns
Junxiao Shi0fcb41e2014-01-24 10:29:43 -070082 */
mzhang4eab72492015-02-25 11:16:09 -060083 void
84 find(const Interest& interest,
85 const HitCallback& hitCallback,
86 const MissCallback& missCallback) const;
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080087
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080088 void
Junxiao Shia9388182014-12-13 23:16:09 -070089 erase(const Name& exactName)
90 {
91 BOOST_ASSERT_MSG(false, "not implemented");
92 }
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080093
Junxiao Shia9388182014-12-13 23:16:09 -070094 /** \brief changes capacity (in number of packets)
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -080095 */
96 void
97 setLimit(size_t nMaxPackets);
98
Junxiao Shia9388182014-12-13 23:16:09 -070099 /** \return capacity (in number of packets)
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800100 */
101 size_t
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500102 getLimit() const;
103
104 /** \brief changes cs replacement policy
105 * \pre size() == 0
106 */
107 void
108 setPolicy(unique_ptr<Policy> policy);
109
110 /** \return cs replacement policy
111 */
112 Policy*
113 getPolicy() const
Junxiao Shia9388182014-12-13 23:16:09 -0700114 {
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500115 return m_policy.get();
Junxiao Shia9388182014-12-13 23:16:09 -0700116 }
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800117
Junxiao Shia9388182014-12-13 23:16:09 -0700118 /** \return number of stored packets
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800119 */
120 size_t
Junxiao Shifc206962015-01-16 11:12:22 -0700121 size() const
122 {
123 return m_table.size();
124 }
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800125
Junxiao Shia9388182014-12-13 23:16:09 -0700126PUBLIC_WITH_TESTS_ELSE_PRIVATE:
127 void
128 dump();
129
Junxiao Shifc206962015-01-16 11:12:22 -0700130public: // enumeration
131 struct EntryFromEntryImpl
132 {
133 typedef const Entry& result_type;
134
135 const Entry&
136 operator()(const EntryImpl& entry) const
137 {
138 return entry;
139 }
Junxiao Shia9388182014-12-13 23:16:09 -0700140 };
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800141
Junxiao Shifc206962015-01-16 11:12:22 -0700142 /** \brief ContentStore iterator (public API)
143 */
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500144 typedef boost::transform_iterator<EntryFromEntryImpl, iterator, const Entry&> const_iterator;
Junxiao Shifc206962015-01-16 11:12:22 -0700145
146 const_iterator
147 begin() const
148 {
149 return boost::make_transform_iterator(m_table.begin(), EntryFromEntryImpl());
150 }
151
152 const_iterator
153 end() const
154 {
155 return boost::make_transform_iterator(m_table.end(), EntryFromEntryImpl());
156 }
157
158private: // find
Junxiao Shi5640ec82015-01-07 21:51:19 -0700159 /** \brief find leftmost match in [first,last)
160 * \return the leftmost match, or last if not found
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800161 */
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500162 iterator
163 findLeftmost(const Interest& interest, iterator left, iterator right) const;
Junxiao Shi5640ec82015-01-07 21:51:19 -0700164
165 /** \brief find rightmost match in [first,last)
166 * \return the rightmost match, or last if not found
167 */
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500168 iterator
169 findRightmost(const Interest& interest, iterator first, iterator last) const;
Junxiao Shi5640ec82015-01-07 21:51:19 -0700170
171 /** \brief find rightmost match among entries with exact Names in [first,last)
172 * \return the rightmost match, or last if not found
173 */
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500174 iterator
175 findRightmostAmongExact(const Interest& interest, iterator first, iterator last) const;
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800176
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800177 void
Junxiao Shi52555b02016-11-25 21:39:06 +0000178 setPolicyImpl(unique_ptr<Policy> policy);
Ilya Moiseenko76cf77a2014-03-05 14:35:51 -0800179
180private:
Junxiao Shia9388182014-12-13 23:16:09 -0700181 Table m_table;
Minsheng Zhangcb6e05f2015-04-20 15:51:47 -0500182 unique_ptr<Policy> m_policy;
183 ndn::util::signal::ScopedConnection m_beforeEvictConnection;
Junxiao Shi0fcb41e2014-01-24 10:29:43 -0700184};
185
Junxiao Shia9388182014-12-13 23:16:09 -0700186} // namespace cs
187
188using cs::Cs;
189
Alexander Afanasyev18bbf812014-01-29 01:40:23 -0800190} // namespace nfd
Alexander Afanasyevb927a3a2014-01-24 10:41:47 -0800191
Alexander Afanasyev613e2a92014-04-15 13:36:58 -0700192#endif // NFD_DAEMON_TABLE_CS_HPP