30 #include <ndn-cxx/lp/tags.hpp> 31 #include <ndn-cxx/util/concepts.hpp> 40 static unique_ptr<Policy>
49 m_policy->setLimit(nMaxPackets);
55 if (!m_shouldAdmit || m_policy->getLimit() == 0) {
61 shared_ptr<lp::CachePolicyTag> tag = data.getTag<lp::CachePolicyTag>();
63 lp::CachePolicyType policy = tag->get().getPolicy();
64 if (policy == lp::CachePolicyType::NO_CACHE) {
70 bool isNewEntry =
false;
71 std::tie(it, isNewEntry) = m_table.emplace(data.shared_from_this(), isUnsolicited);
82 m_policy->afterRefresh(it);
85 m_policy->afterInsert(it);
92 BOOST_ASSERT(static_cast<bool>(cb));
94 iterator first = m_table.lower_bound(prefix);
96 if (prefix.size() > 0) {
97 last = m_table.lower_bound(prefix.getSuccessor());
101 while (first != last && nErased < limit) {
102 m_policy->beforeErase(first);
103 first = m_table.erase(first);
117 BOOST_ASSERT(static_cast<bool>(hitCallback));
118 BOOST_ASSERT(static_cast<bool>(missCallback));
120 if (!m_shouldServe || m_policy->getLimit() == 0) {
121 missCallback(interest);
124 const Name& prefix = interest.getName();
125 bool isRightmost = interest.getChildSelector() == 1;
126 NFD_LOG_DEBUG(
"find " << prefix << (isRightmost ?
" R" :
" L"));
128 iterator first = m_table.lower_bound(prefix);
130 if (prefix.size() > 0) {
131 last = m_table.lower_bound(prefix.getSuccessor());
136 match = this->findRightmost(interest, first, last);
139 match = this->findLeftmost(interest, first, last);
144 missCallback(interest);
148 m_policy->beforeUse(match);
149 hitCallback(interest, match->getData());
153 Cs::findLeftmost(
const Interest& interest,
iterator first,
iterator last)
const 155 return std::find_if(first, last, [&interest] (
const auto& entry) {
return entry.canSatisfy(interest); });
159 Cs::findRightmost(
const Interest& interest,
iterator first,
iterator last)
const 165 size_t interestNameLength = interest.getName().size();
166 for (
iterator right = last; right != first;) {
170 if (prev->getName().size() == interestNameLength) {
172 iterator matchExact = this->findRightmostAmongExact(interest, first, right);
173 return matchExact == right ? last : matchExact;
176 Name prefix = prev->getName().getPrefix(interestNameLength + 1);
177 iterator left = m_table.lower_bound(prefix);
181 iterator match = this->findLeftmost(interest, left, right);
182 if (match != right) {
191 Cs::findRightmostAmongExact(
const Interest& interest,
iterator first,
iterator last)
const 193 return find_last_if(first, last, [&interest] (
const auto& entry) {
return entry.canSatisfy(interest); });
208 BOOST_ASSERT(policy !=
nullptr);
209 BOOST_ASSERT(m_policy !=
nullptr);
210 size_t limit = m_policy->getLimit();
211 this->setPolicyImpl(std::move(policy));
212 m_policy->setLimit(limit);
216 Cs::setPolicyImpl(unique_ptr<Policy> policy)
219 m_policy = std::move(policy);
220 m_beforeEvictConnection = m_policy->beforeEvict.connect([
this] (
iterator it) {
224 m_policy->setCs(
this);
225 BOOST_ASSERT(m_policy->getCs() ==
this);
231 if (m_shouldAdmit == shouldAdmit) {
235 NFD_LOG_INFO((shouldAdmit ?
"Enabling" :
"Disabling") <<
" Data admittance");
241 if (m_shouldServe == shouldServe) {
245 NFD_LOG_INFO((shouldServe ?
"Enabling" :
"Disabling") <<
" Data serving");
void updateStaleTime()
refreshes stale time relative to current time
It find_last_if(It first, It last, Pred p)
finds the last element satisfying a predicate
static unique_ptr< Policy > makeDefaultPolicy()
bool shouldServe() const
get CS_ENABLE_SERVE flag
void enableAdmit(bool shouldAdmit)
set CS_ENABLE_ADMIT flag
std::function< void(size_t nErased)> AfterEraseCallback
static unique_ptr< Policy > create(const std::string &policyName)
NDN_CXX_ASSERT_FORWARD_ITERATOR(Cs::const_iterator)
Table::const_iterator iterator
void erase(const Name &prefix, size_t limit, const AfterEraseCallback &cb)
asynchronously erases entries under prefix
std::function< void(const Interest &)> MissCallback
Copyright (c) 2014-2015, Regents of the University of California, Arizona Board of Regents...
void insert(const Data &data, bool isUnsolicited=false)
inserts a Data packet
boost::transform_iterator< EntryFromEntryImpl, iterator, const Entry & > const_iterator
ContentStore iterator (public API)
void enableServe(bool shouldServe)
set CS_ENABLE_SERVE flag
void setPolicy(unique_ptr< Policy > policy)
change replacement policy
an Entry in ContentStore implementation
#define NFD_LOG_INIT(name)
bool isUnsolicited() const
void find(const Interest &interest, const HitCallback &hitCallback, const MissCallback &missCallback) const
finds the best matching Data packet
Cs(size_t nMaxPackets=10)
std::function< void(const Interest &, const Data &)> HitCallback
bool shouldAdmit() const
get CS_ENABLE_ADMIT flag