NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.3: NDN, CCN, CCNx, content centric networks
API Documentation
in-memory-storage.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
22 #ifndef NDN_UTIL_IN_MEMORY_STORAGE_HPP
23 #define NDN_UTIL_IN_MEMORY_STORAGE_HPP
24 
25 #include "../common.hpp"
26 #include "../interest.hpp"
27 #include "../data.hpp"
28 #include "scheduler.hpp"
30 
31 #include <boost/multi_index/member.hpp>
32 #include <boost/multi_index_container.hpp>
33 #include <boost/multi_index/ordered_index.hpp>
34 #include <boost/multi_index/sequenced_index.hpp>
35 #include <boost/multi_index/identity.hpp>
36 #include <boost/multi_index/mem_fun.hpp>
37 
38 #include <stack>
39 #include <iterator>
40 
41 namespace ndn {
42 namespace util {
43 
46 class InMemoryStorage : noncopyable
47 {
48 public:
49  //multi_index_container to implement storage
50  class byFullName;
51 
52  typedef boost::multi_index_container<
54  boost::multi_index::indexed_by<
55 
56  // by Full Name
57  boost::multi_index::ordered_unique<
58  boost::multi_index::tag<byFullName>,
59  boost::multi_index::const_mem_fun<InMemoryStorageEntry, const Name&,
61  std::less<Name>
62  >
63 
64  >
65  > Cache;
66 
71  class const_iterator : public std::iterator<std::input_iterator_tag, const Data>
72  {
73  public:
74  const_iterator(const Data* ptr, const Cache* cache,
76 
78  operator++();
79 
81  operator++(int);
82 
83  const Data&
84  operator*();
85 
86  const Data*
87  operator->();
88 
89  bool
90  operator==(const const_iterator& rhs);
91 
92  bool
93  operator!=(const const_iterator& rhs);
94 
95  private:
96  const Data* m_ptr;
97  const Cache* m_cache;
99  };
100 
104  class Error : public std::runtime_error
105  {
106  public:
107  Error() : std::runtime_error("Cannot reduce the capacity of the in-memory storage!")
108  {
109  }
110  };
111 
115  explicit
116  InMemoryStorage(size_t limit = std::numeric_limits<size_t>::max());
117 
121  explicit
122  InMemoryStorage(boost::asio::io_service& ioService,
123  size_t limit = std::numeric_limits<size_t>::max());
124 
128  virtual
130 
143  void
144  insert(const Data& data, const time::milliseconds& mustBeFreshProcessingWindow = INFINITE_WINDOW);
145 
156  shared_ptr<const Data>
157  find(const Interest& interest);
158 
170  shared_ptr<const Data>
171  find(const Name& name);
172 
183  void
184  erase(const Name& prefix, const bool isPrefix = true);
185 
188  size_t
189  getLimit() const
190  {
191  return m_limit;
192  }
193 
196  size_t
197  size() const
198  {
199  return m_nPackets;
200  }
201 
208  begin() const;
209 
216  end() const;
217 
222  virtual void
223  afterAccess(InMemoryStorageEntry* entry);
224 
229  virtual void
230  afterInsert(InMemoryStorageEntry* entry);
231 
236  virtual void
237  beforeErase(InMemoryStorageEntry* entry);
238 
246  virtual bool
247  evictItem() = 0;
248 
252  void
253  setCapacity(size_t nMaxPackets);
254 
258  size_t
259  getCapacity() const
260  {
261  return m_capacity;
262  }
263 
266  bool
267  isFull() const
268  {
269  return size() >= m_capacity;
270  }
271 
278  void
279  eraseImpl(const Name& name);
280 
283  void
284  printCache(std::ostream& os) const;
285 
291  freeEntry(Cache::iterator it);
292 
307  InMemoryStorageEntry*
308  selectChild(const Interest& interest,
309  Cache::index<byFullName>::type::iterator startingPoint) const;
310 
318 
319 private:
320  void
321  init();
322 
323 public:
324  static const time::milliseconds INFINITE_WINDOW;
325 
326 private:
327  static const time::milliseconds ZERO_WINDOW;
328 
329 private:
330  Cache m_cache;
332  size_t m_limit;
334  size_t m_capacity;
336  size_t m_nPackets;
338  std::stack<InMemoryStorageEntry*> m_freeEntries;
340  unique_ptr<Scheduler> m_scheduler;
341 };
342 
343 } // namespace util
344 } // namespace ndn
345 
346 #endif // NDN_UTIL_IN_MEMORY_STORAGE_HPP
bool isFull() const
returns true if the in-memory storage uses up the current capacity, false otherwise ...
Copyright (c) 2011-2015 Regents of the University of California.
const Name & getFullName() const
Returns the full name (including implicit digest) of the Data packet stored in the in-memory storage ...
#define NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PRIVATE
Definition: common.hpp:43
InMemoryStorage(size_t limit=std::numeric_limits< size_t >::max())
Create a InMemoryStorage with up to limit entries The InMemoryStorage created through this method wil...
shared_ptr< const Data > find(const Interest &interest)
Finds the best match Data for an Interest.
Represents a self-defined const_iterator for the in-memory storage.
STL namespace.
represents an Interest packet
Definition: interest.hpp:42
bool operator!=(const const_iterator &rhs)
virtual bool evictItem()=0
Removes one Data packet from in-memory storage based on derived class implemented replacement policy...
virtual void beforeErase(InMemoryStorageEntry *entry)
Update the entry or other data structures before a entry is successfully erased according to derived ...
void eraseImpl(const Name &name)
deletes in-memory storage entries by the Name with implicit digest.
Table::const_iterator iterator
Definition: cs-internal.hpp:41
InMemoryStorage::const_iterator begin() const
Returns begin iterator of the in-memory storage ordering by name with digest.
Represents in-memory storage.
InMemoryStorage::const_iterator end() const
Returns end iterator of the in-memory storage ordering by name with digest.
boost::multi_index_container< InMemoryStorageEntry *, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< byFullName >, boost::multi_index::const_mem_fun< InMemoryStorageEntry, const Name &, &InMemoryStorageEntry::getFullName >, std::less< Name > > > > Cache
size_t getCapacity() const
returns current capacity of in-memory storage (in packets)
Cache::index< byFullName >::type::iterator findNextFresh(Cache::index< byFullName >::type::iterator startingPoint) const
Get the next iterator (include startingPoint) that satisfies MustBeFresh requirement.
Represents an in-memory storage entry.
Name abstraction to represent an absolute name.
Definition: name.hpp:46
const_iterator(const Data *ptr, const Cache *cache, Cache::index< byFullName >::type::iterator it)
void printCache(std::ostream &os) const
Prints contents of the in-memory storage.
bool operator==(const const_iterator &rhs)
virtual void afterInsert(InMemoryStorageEntry *entry)
Update the entry or other data structures after a entry is successfully inserted according to derived...
void insert(const Data &data, const time::milliseconds &mustBeFreshProcessingWindow=INFINITE_WINDOW)
Inserts a Data packet.
static const time::milliseconds INFINITE_WINDOW
InMemoryStorageEntry * selectChild(const Interest &interest, Cache::index< byFullName >::type::iterator startingPoint) const
Implements child selector (leftmost, rightmost, undeclared).
#define NDN_CXX_PUBLIC_WITH_TESTS_ELSE_PROTECTED
Definition: common.hpp:42
Represents an error might be thrown during reduce the current capacity of the in-memory storage throu...
represents a Data packet
Definition: data.hpp:37
void erase(const Name &prefix, const bool isPrefix=true)
Deletes in-memory storage entry by prefix by default.