36 namespace strategy_choice {
51 : m_forwarder(forwarder)
52 , m_nameTree(m_forwarder.getNameTree())
60 auto entry = make_unique<Entry>(
Name());
62 NFD_LOG_INFO(
"setDefaultStrategy " << entry->getStrategyInstanceName());
75 return InsertResult::DEPTH_EXCEEDED;
78 unique_ptr<Strategy> strategy;
82 catch (
const std::invalid_argument& e) {
83 NFD_LOG_ERROR(
"insert(" << prefix <<
"," << strategyName <<
") cannot create strategy: " << e.what());
87 if (strategy ==
nullptr) {
88 NFD_LOG_ERROR(
"insert(" << prefix <<
"," << strategyName <<
") strategy not registered");
89 return InsertResult::NOT_REGISTERED;
95 if (entry !=
nullptr) {
97 NFD_LOG_TRACE(
"insert(" << prefix <<
") not changing " << strategy->getInstanceName());
98 return InsertResult::OK;
102 " to " << strategy->getInstanceName());
106 auto newEntry = make_unique<Entry>(prefix);
107 entry = newEntry.get();
110 NFD_LOG_TRACE(
"insert(" << prefix <<
") new entry " << strategy->getInstanceName());
113 this->changeStrategy(*entry, *oldStrategy, *strategy);
115 return InsertResult::OK;
118 StrategyChoice::InsertResult::InsertResult(Status status,
const std::string& exceptionMessage)
120 , m_exceptionMessage(exceptionMessage)
127 switch (res.m_status) {
128 case StrategyChoice::InsertResult::OK:
130 case StrategyChoice::InsertResult::NOT_REGISTERED:
131 return os <<
"Strategy not registered";
132 case StrategyChoice::InsertResult::EXCEPTION:
133 return os <<
"Error instantiating strategy: " << res.m_exceptionMessage;
134 case StrategyChoice::InsertResult::DEPTH_EXCEEDED:
135 return os <<
"Prefix has too many components (limit is " 144 BOOST_ASSERT(prefix.
size() > 0);
147 if (nte ==
nullptr) {
151 Entry* entry = nte->getStrategyChoiceEntry();
152 if (entry ==
nullptr) {
159 this->changeStrategy(*entry, oldStrategy, parentStrategy);
161 nte->setStrategyChoiceEntry(
nullptr);
166 std::pair<bool, Name>
170 if (nte ==
nullptr) {
171 return {
false,
Name()};
175 if (entry ==
nullptr) {
176 return {
false,
Name()};
184 StrategyChoice::findEffectiveStrategyImpl(
const K& key)
const 187 BOOST_ASSERT(nte !=
nullptr);
194 return this->findEffectiveStrategyImpl(prefix);
200 return this->findEffectiveStrategyImpl(pitEntry);
206 return this->findEffectiveStrategyImpl(measurementsEntry);
214 for (
const shared_ptr<pit::Entry>& pitEntry : nte.
getPitEntries()) {
215 pitEntry->clearStrategyInfo();
216 for (
const pit::InRecord& inRecord : pitEntry->getInRecords()) {
217 const_cast<pit::InRecord&>(inRecord).clearStrategyInfo();
219 for (
const pit::OutRecord& outRecord : pitEntry->getOutRecords()) {
220 const_cast<pit::OutRecord&>(outRecord).clearStrategyInfo();
229 StrategyChoice::changeStrategy(Entry& entry,
Strategy& oldStrategy,
Strategy& newStrategy)
231 const Name& oldInstanceName = oldStrategy.getInstanceName();
232 const Name& newInstanceName = newStrategy.getInstanceName();
235 NFD_LOG_INFO(
"changeStrategy(" << entry.getPrefix() <<
") " 236 << oldInstanceName <<
" -> " << newInstanceName
241 NFD_LOG_INFO(
"changeStrategy(" << entry.getPrefix() <<
") " 242 << oldInstanceName <<
" -> " << newInstanceName);
246 const name_tree::Entry* rootNte = m_nameTree.
getEntry(entry);
247 BOOST_ASSERT(rootNte !=
nullptr);
249 [&rootNte] (
const name_tree::Entry& nte) -> std::pair<bool, bool> {
250 if (&nte == rootNte) {
253 if (nte.getStrategyChoiceEntry() !=
nullptr) {
254 return {
false,
false};
258 for (
const name_tree::Entry& nte : ntChanged) {
264 StrategyChoice::getRange()
const 267 boost::adaptors::transformed(name_tree::GetTableEntry<Entry>(
PartialName getPrefix(ssize_t nComponents) const
Extract a prefix of the name.
boost::range_iterator< Range >::type const_iterator
static void clearStrategyInfo(const name_tree::Entry &nte)
const std::vector< shared_ptr< pit::Entry > > & getPitEntries() const
NDN_CXX_ASSERT_FORWARD_ITERATOR(StrategyChoice::const_iterator)
contains information about an Interest from an incoming face
void erase(const Name &prefix)
make prefix to inherit strategy from its parent
std::pair< bool, Name > get(const Name &prefix) const
get strategy Name of prefix
StrategyChoice(Forwarder &forwarder)
Entry & lookup(const Name &name, size_t prefixLen)
find or insert an entry by name
Entry * findLongestPrefixMatch(const Name &name, const EntrySelector &entrySelector=AnyEntry()) const
longest prefix matching
const Name & getStrategyInstanceName() const
InsertResult insert(const Name &prefix, const Name &strategyName)
set strategy of prefix to be strategyName
represents a Measurements entry
Range partialEnumerate(const Name &prefix, const EntrySubTreeSelector &entrySubTreeSelector=AnyEntrySubTree()) const
enumerate all entries under a prefix
std::ostream & operator<<(std::ostream &os, const StrategyChoice::InsertResult &res)
measurements::Entry * getMeasurementsEntry() const
Copyright (c) 2011-2015 Regents of the University of California.
Entry * getEntry(const EntryT &tableEntry) const
fw::Strategy & findEffectiveStrategy(const Name &prefix) const
get effective strategy for prefix
void clearStrategyInfo()
clear all StrategyInfo items
Represents an absolute name.
void setDefaultStrategy(const Name &strategyName)
set the default strategy
represents a Strategy Choice entry
Range fullEnumerate(const EntrySelector &entrySelector=AnyEntry()) const
enumerate all entries
size_t size() const
Get number of components.
represents a forwarding strategy
size_t eraseIfEmpty(Entry *entry, bool canEraseAncestors=true)
delete the entry if it is empty
static unique_ptr< Strategy > create(const Name &instanceName, Forwarder &forwarder)
boost::transformed_range< name_tree::GetTableEntry< Entry >, const name_tree::Range > Range
fw::Strategy & getStrategy() const
represents the Strategy Choice table
void setStrategy(unique_ptr< fw::Strategy > strategy)
const Name & getInstanceName() const
contains information about an Interest toward an outgoing face
std::string to_string(const V &v)
strategy_choice::Entry * getStrategyChoiceEntry() const
Entry * findExactMatch(const Name &name, size_t prefixLen=std::numeric_limits< size_t >::max()) const
exact match lookup
#define NFD_LOG_INIT(name)
static bool nteHasStrategyChoiceEntry(const name_tree::Entry &nte)
const Name & getName() const
void setStrategyChoiceEntry(unique_ptr< strategy_choice::Entry > strategyChoiceEntry)
static bool areSameType(const Name &instanceNameA, const Name &instanceNameB)
an entry in the name tree
static constexpr size_t getMaxDepth()
maximum depth of the name tree