blob: 59e3e5792ecffa3f261c678f87eba17261eda996 [file] [log] [blame]
Minsheng Zhang03152692015-07-28 11:53:21 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Davide Pesaventob84bd3a2016-04-22 02:21:45 +02003 * Copyright (c) 2014-2016, Regents of the University of California,
Minsheng Zhang03152692015-07-28 11:53:21 -05004 * 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.
10 *
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/>.
24 */
25
26#ifndef NFD_DAEMON_TABLE_CS_POLICY_LRU_HPP
27#define NFD_DAEMON_TABLE_CS_POLICY_LRU_HPP
28
29#include "cs-policy.hpp"
Minsheng Zhang03152692015-07-28 11:53:21 -050030
31#include <boost/multi_index_container.hpp>
32#include <boost/multi_index/sequenced_index.hpp>
33#include <boost/multi_index/hashed_index.hpp>
34
35namespace nfd {
36namespace cs {
37namespace lru {
38
39struct EntryItComparator
40{
41 bool
42 operator()(const iterator& a, const iterator& b) const
43 {
44 return *a < *b;
45 }
46};
47
48typedef boost::multi_index_container<
49 iterator,
50 boost::multi_index::indexed_by<
51 boost::multi_index::sequenced<>,
52 boost::multi_index::ordered_unique<
53 boost::multi_index::identity<iterator>, EntryItComparator
54 >
55 >
56 > Queue;
57
58/** \brief LRU cs replacement policy
59 *
60 * The least recently used entries get removed first.
61 * Everytime when any entry is used or refreshed, Policy should witness the usage
62 * of it.
63 */
64class LruPolicy : public Policy
65{
66public:
67 LruPolicy();
68
69public:
70 static const std::string POLICY_NAME;
71
72private:
73 virtual void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +020074 doAfterInsert(iterator i) override;
Minsheng Zhang03152692015-07-28 11:53:21 -050075
76 virtual void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +020077 doAfterRefresh(iterator i) override;
Minsheng Zhang03152692015-07-28 11:53:21 -050078
79 virtual void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +020080 doBeforeErase(iterator i) override;
Minsheng Zhang03152692015-07-28 11:53:21 -050081
82 virtual void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +020083 doBeforeUse(iterator i) override;
Minsheng Zhang03152692015-07-28 11:53:21 -050084
85 virtual void
Davide Pesaventob84bd3a2016-04-22 02:21:45 +020086 evictEntries() override;
Minsheng Zhang03152692015-07-28 11:53:21 -050087
88private:
89 /** \brief moves an entry to the end of queue
90 */
91 void
92 insertToQueue(iterator i, bool isNewEntry);
93
94private:
95 Queue m_queue;
96};
97
98} // namespace lru
99
100using lru::LruPolicy;
101
102} // namespace cs
103} // namespace nfd
104
Junxiao Shi9f5b01d2016-08-05 03:54:28 +0000105#endif // NFD_DAEMON_TABLE_CS_POLICY_LRU_HPP