NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.0: NDN, CCN, CCNx, content centric networks
API Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
multi-policy-container.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
20 #ifndef MULTI_POLICY_CONTAINER_H_
21 #define MULTI_POLICY_CONTAINER_H_
22 
24 
25 #include <boost/mpl/inherit_linearly.hpp>
26 #include <boost/mpl/at.hpp>
27 
28 namespace ns3 {
29 namespace ndn {
30 namespace ndnSIM {
31 namespace detail {
32 
33 template<class Base, class Value>
34 struct policy_wrap {
35  policy_wrap(Base& base)
36  : value_(base)
37  {
38  }
39  Value value_;
40 };
41 
42 template<class Base, class Super /*empy_wrap/previous level*/,
43  class Value /*policy_wrap< element in vector >*/>
44 struct inherit_with_base : Super, Value {
45  inherit_with_base(Base& base)
46  : Super(base)
47  , Value(base)
48  {
49  }
50 
51  void
52  update(typename Base::iterator item)
53  {
54  Value::value_.update(item);
55  Super::update(item);
56  }
57 
58  bool
59  insert(typename Base::iterator item)
60  {
61  bool ok = Value::value_.insert(item);
62  if (!ok)
63  return false;
64 
65  ok = Super::insert(item);
66  if (!ok) {
67  Value::value_.erase(item);
68  return false;
69  }
70  return true;
71  }
72 
73  void
74  lookup(typename Base::iterator item)
75  {
76  Value::value_.lookup(item);
77  Super::lookup(item);
78  }
79 
80  void
81  erase(typename Base::iterator item)
82  {
83  Value::value_.erase(item);
84  Super::erase(item);
85  }
86 
87  void
88  clear()
89  {
90  Value::value_.clear();
91  Super::clear();
92  }
93 };
94 
95 template<class Base>
96 struct empty_policy_wrap {
97  empty_policy_wrap(Base& base)
98  {
99  }
100 
101  void
102  update(typename Base::iterator item)
103  {
104  }
105  bool
106  insert(typename Base::iterator item)
107  {
108  return true;
109  }
110  void
111  lookup(typename Base::iterator item)
112  {
113  }
114  void
115  erase(typename Base::iterator item)
116  {
117  }
118  void
119  clear()
120  {
121  }
122 };
123 
124 template<class Base, class Vector>
125 struct multi_policy_container
126  : public boost::mpl::
127  fold<Vector, empty_policy_wrap<Base>,
128  inherit_with_base<Base, boost::mpl::_1 /*empty/previous*/,
129  policy_wrap<Base, boost::mpl::_2> /*element in vector*/>>::type {
130  typedef typename boost::mpl::
131  fold<Vector, empty_policy_wrap<Base>,
132  inherit_with_base<Base, boost::mpl::_1 /*empty/previous*/,
133  policy_wrap<Base, boost::mpl::_2> /*element in vector*/>>::type super;
134 
135  typedef typename boost::mpl::at_c<Vector, 0>::type::iterator iterator;
136  typedef typename boost::mpl::at_c<Vector, 0>::type::const_iterator const_iterator;
137 
138  iterator
139  begin()
140  {
141  return this->get<0>().begin();
142  }
143  const_iterator
144  begin() const
145  {
146  return this->get<0>().begin();
147  }
148 
149  iterator
150  end()
151  {
152  return this->get<0>().end();
153  }
154  const_iterator
155  end() const
156  {
157  return this->get<0>().end();
158  }
159 
160  size_t
161  size() const
162  {
163  return this->get<0>().size();
164  }
165 
166  multi_policy_container(Base& base)
167  : super(base)
168  {
169  }
170 
171  template<int N>
172  struct index {
173  typedef typename boost::mpl::at_c<Vector, N>::type type;
174  };
175 
176  template<class T>
177  T&
178  get()
179  {
180  return static_cast<policy_wrap<Base, T>&>(*this).value_;
181  }
182 
183  template<class T>
184  const T&
185  get() const
186  {
187  return static_cast<const policy_wrap<Base, T>&>(*this).value_;
188  }
189 
190  template<int N>
191  typename boost::mpl::at_c<Vector, N>::type&
192  get()
193  {
194  typedef typename boost::mpl::at_c<Vector, N>::type T;
195  return static_cast<policy_wrap<Base, T>&>(*this).value_;
196  }
197 
198  template<int N>
199  const typename boost::mpl::at_c<Vector, N>::type&
200  get() const
201  {
202  typedef typename boost::mpl::at_c<Vector, N>::type T;
203  return static_cast<const policy_wrap<Base, T>&>(*this).value_;
204  }
205 };
206 
207 } // detail
208 } // ndnSIM
209 } // ndn
210 } // ns3
211 
213 
214 #endif // MULTI_POLICY_CONTAINER_H_