20 #ifndef FRESHNESS_POLICY_H_
21 #define FRESHNESS_POLICY_H_
25 #include "ns3/ndnSIM/model/ndn-common.hpp"
27 #include <boost/intrusive/options.hpp>
28 #include <boost/intrusive/list.hpp>
30 #include <ns3/nstime.h>
31 #include <ns3/simulator.h>
32 #include <ns3/traced-callback.h>
41 struct freshness_policy_traits {
49 struct policy_hook_type :
public boost::intrusive::set_member_hook<> {
50 Time timeWhenShouldExpire;
53 template<
class Container>
54 struct container_hook {
55 typedef boost::intrusive::member_hook<Container, policy_hook_type, &Container::policy_hook_>
59 template<
class Base,
class Container,
class Hook>
62 get_freshness(
typename Container::iterator item)
64 return static_cast<typename policy_container::value_traits::hook_type*
>(
65 policy_container::value_traits::to_node_ptr(*item))->timeWhenShouldExpire;
69 get_freshness(
typename Container::const_iterator item)
71 return static_cast<const typename policy_container::value_traits::hook_type*
>(
72 policy_container::value_traits::to_node_ptr(*item))->timeWhenShouldExpire;
76 struct MemberHookLess {
78 operator()(
const Key& a,
const Key& b)
const
80 return get_freshness(&a) < get_freshness(&b);
84 typedef boost::intrusive::multiset<Container,
85 boost::intrusive::compare<MemberHookLess<Container>>,
86 Hook> policy_container;
88 class type :
public policy_container {
90 typedef policy policy_base;
91 typedef Container parent_trie;
100 update(
typename parent_trie::iterator item)
106 insert(
typename parent_trie::iterator item)
108 time::milliseconds freshness = item->payload()->GetData()->getFreshnessPeriod();
109 if (freshness > time::milliseconds::zero()) {
110 get_freshness(item) = Simulator::Now() + MilliSeconds(freshness.count());
116 policy_container::insert(*item);
123 lookup(
typename parent_trie::iterator item)
129 erase(
typename parent_trie::iterator item)
131 time::milliseconds freshness = item->payload()->GetData()->getFreshnessPeriod();
132 if (freshness > time::milliseconds::zero()) {
134 policy_container::erase(policy_container::s_iterator_to(*item));
141 policy_container::clear();
145 set_max_size(
size_t max_size)
147 max_size_ = max_size;
158 : base_(*((Base*)0)){};
173 #endif // LIFETIME_STATS_POLICY_H