NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.3: NDN, CCN, CCNx, content centric networks
API Documentation
backports-optional.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
42 #ifndef NDN_UTIL_BACKPORTS_OPTIONAL_HPP
43 #define NDN_UTIL_BACKPORTS_OPTIONAL_HPP
44 
45 #include "../common.hpp"
46 
47 #include <boost/none.hpp>
48 #include <boost/optional.hpp>
49 #include <boost/utility/typed_in_place_factory.hpp>
50 
51 namespace ndn {
52 
53 template<typename T>
54 class optional;
55 
56 struct in_place_t
57 {
58 };
59 constexpr in_place_t in_place{};
60 
61 class nullopt_t
62 {
63 public:
64  constexpr explicit
65  nullopt_t(int)
66  {
67  }
68 };
69 constexpr nullopt_t nullopt(0);
70 
71 #if BOOST_VERSION >= 105600
72 using boost::bad_optional_access;
73 #else
74 class bad_optional_access : public std::logic_error
75 {
76 public:
78  : std::logic_error("bad optional access")
79  {
80  }
81 };
82 #endif
83 
84 template<typename T>
85 constexpr bool
86 operator==(const optional<T>& lhs, const optional<T>& rhs);
87 
88 template<typename T>
89 constexpr bool
90 operator!=(const optional<T>& lhs, const optional<T>& rhs);
91 
92 template<typename T>
93 constexpr bool
94 operator<(const optional<T>& lhs, const optional<T>& rhs);
95 
96 template<typename T>
97 constexpr bool
98 operator<=(const optional<T>& lhs, const optional<T>& rhs);
99 
100 template<typename T>
101 constexpr bool
102 operator>(const optional<T>& lhs, const optional<T>& rhs);
103 
104 template<typename T>
105 constexpr bool
106 operator>=(const optional<T>& lhs, const optional<T>& rhs);
107 
108 template<typename T>
109 class optional
110 {
111 public:
112  static_assert(!std::is_same<typename std::remove_cv<T>::type, in_place_t>::value &&
113  !std::is_same<typename std::remove_cv<T>::type, nullopt_t>::value &&
114  !std::is_reference<T>::value,
115  "Invalid instantiation of optional<T>");
116 
117  typedef T value_type;
118 
119  constexpr
120  optional() noexcept
121  {
122  }
123 
124  constexpr
125  optional(nullopt_t) noexcept
126  {
127  }
128 
129  constexpr
130  optional(const T& value)
131  : m_boostOptional(value)
132  {
133  }
134 
135  template<typename... Args>
136  constexpr explicit
137  optional(in_place_t, Args&&... args)
138  : m_boostOptional(boost::in_place<T>(std::forward<Args>(args)...))
139  {
140  }
141 
142  optional&
144  {
145  m_boostOptional = boost::none;
146  return *this;
147  }
148 
149  optional&
150  operator=(const optional& other)
151  {
152  m_boostOptional = other.m_boostOptional;
153  return *this;
154  }
155 
156  template<typename U,
157  typename = typename std::enable_if<std::is_same<typename std::decay<U>::type, T>::value>::type>
158  optional&
159  operator=(U&& value)
160  {
161  m_boostOptional = std::forward<U>(value);
162  return *this;
163  }
164 
165 public: // observers
166  constexpr const T*
167  operator->() const
168  {
169  return m_boostOptional.get_ptr();
170  }
171 
172  T*
174  {
175  return m_boostOptional.get_ptr();
176  }
177 
178  constexpr const T&
179  operator*() const
180  {
181  return m_boostOptional.get();
182  }
183 
184  T&
186  {
187  return m_boostOptional.get();
188  }
189 
190  constexpr explicit
191  operator bool() const noexcept
192  {
193  return static_cast<bool>(m_boostOptional);
194  }
195 
196  const T&
197  value() const
198  {
199  return const_cast<optional*>(this)->value();
200  }
201 
202  T&
204  {
205 #if BOOST_VERSION >= 105600
206  return m_boostOptional.value();
207 #else
208  if (!m_boostOptional) {
209  BOOST_THROW_EXCEPTION(bad_optional_access());
210  }
211  return m_boostOptional.get();
212 #endif
213  }
214 
215  template<typename U>
216  constexpr T
217  value_or(U&& default_value) const
218  {
219 #if BOOST_VERSION >= 105600
220  return m_boostOptional.value_or(default_value);
221 #else
222  return m_boostOptional.get_value_or(default_value);
223 #endif
224  }
225 
226 public: // modifiers
227  void
228  swap(optional& other)
229  {
230  boost::swap(m_boostOptional, other.m_boostOptional);
231  }
232 
233  template<typename... Args>
234  void
235  emplace(Args&&... args)
236  {
237  m_boostOptional = boost::in_place<T>(std::forward<Args>(args)...);
238  }
239 
240 private:
241  boost::optional<T> m_boostOptional;
242 
243  friend bool operator==<T>(const optional<T>&, const optional<T>&);
244  friend bool operator!=<T>(const optional<T>&, const optional<T>&);
245  friend bool operator< <T>(const optional<T>&, const optional<T>&);
246  friend bool operator<=<T>(const optional<T>&, const optional<T>&);
247  friend bool operator> <T>(const optional<T>&, const optional<T>&);
248  friend bool operator>=<T>(const optional<T>&, const optional<T>&);
249 };
250 
251 template<typename T>
252 constexpr bool
253 operator==(const optional<T>& lhs, const optional<T>& rhs)
254 {
255  return operator==(lhs.m_boostOptional, rhs.m_boostOptional);
256 }
257 
258 template<typename T>
259 constexpr bool
260 operator!=(const optional<T>& lhs, const optional<T>& rhs)
261 {
262  return operator!=(lhs.m_boostOptional, rhs.m_boostOptional);
263 }
264 
265 template<typename T>
266 constexpr bool
267 operator<(const optional<T>& lhs, const optional<T>& rhs)
268 {
269  return operator<(lhs.m_boostOptional, rhs.m_boostOptional);
270 }
271 
272 template<typename T>
273 constexpr bool
274 operator<=(const optional<T>& lhs, const optional<T>& rhs)
275 {
276  return operator<=(lhs.m_boostOptional, rhs.m_boostOptional);
277 }
278 
279 template<typename T>
280 constexpr bool
281 operator>(const optional<T>& lhs, const optional<T>& rhs)
282 {
283  return operator>(lhs.m_boostOptional, rhs.m_boostOptional);
284 }
285 
286 template<typename T>
287 constexpr bool
288 operator>=(const optional<T>& lhs, const optional<T>& rhs)
289 {
290  return operator>=(lhs.m_boostOptional, rhs.m_boostOptional);
291 }
292 
293 template<typename T>
295 make_optional(T&& value)
296 {
297  return optional<typename std::decay<T>::type>(std::forward<T>(value));
298 }
299 
300 template<typename T, typename... Args>
301 constexpr optional<T>
302 make_optional(Args&&... args)
303 {
304  return optional<T>(in_place, std::forward<Args>(args)...);
305 }
306 
307 } // namespace ndn
308 
309 #endif // NDN_UTIL_BACKPORTS_OPTIONAL_HPP
constexpr in_place_t in_place
Copyright (c) 2011-2015 Regents of the University of California.
void swap(optional &other)
Copyright (c) 2013-2016 Regents of the University of California.
optional & operator=(const optional &other)
void emplace(Args &&... args)
constexpr T value_or(U &&default_value) const
constexpr nullopt_t(int)
constexpr nullopt_t nullopt(0)
STL namespace.
constexpr optional(const T &value)
optional & operator=(nullopt_t) noexcept
constexpr optional(in_place_t, Args &&... args)
bool operator>(const Exclude::ExcludeComponent &a, const Exclude::ExcludeComponent &b)
Definition: exclude.cpp:51
constexpr const T & operator*() const
constexpr optional() noexcept
bool operator==(const Exclude::ExcludeComponent &a, const Exclude::ExcludeComponent &b)
Definition: exclude.cpp:44
const T & value() const
constexpr bool operator<(const optional< T > &lhs, const optional< T > &rhs)
constexpr optional< typename std::decay< T >::type > make_optional(T &&value)
constexpr bool operator<=(const optional< T > &lhs, const optional< T > &rhs)
constexpr bool operator!=(const optional< T > &lhs, const optional< T > &rhs)
optional & operator=(U &&value)
constexpr bool operator>=(const optional< T > &lhs, const optional< T > &rhs)
constexpr const T * operator->() const
constexpr optional(nullopt_t) noexcept