optional_reference_spec.hpp
Go to the documentation of this file.
1 // Copyright (C) 2015-2016 Andrzej Krzemienski.
2 //
3 // Use, modification, and distribution is subject to the Boost Software
4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // See http://www.boost.org/libs/optional for documentation.
8 //
9 // You are welcome to contact the author at:
10 // akrzemi1@gmail.com
11 
12 #ifndef BOOST_OPTIONAL_DETAIL_OPTIONAL_REFERENCE_SPEC_AJK_03OCT2015_HPP
13 #define BOOST_OPTIONAL_DETAIL_OPTIONAL_REFERENCE_SPEC_AJK_03OCT2015_HPP
14 
15 #ifdef BOOST_OPTIONAL_CONFIG_NO_PROPER_ASSIGN_FROM_CONST_INT
18 #endif
19 
20 # if 1
21 
22 namespace boost {
23 
24 namespace detail {
25 
26 #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
27 
28 template <class From>
30 {
31 #ifndef BOOST_OPTIONAL_CONFIG_ALLOW_BINDING_TO_RVALUES
33  "binding rvalue references to optional lvalue references is disallowed");
34 #endif
35 }
36 
37 template <class T>
39 {
41  "binding rvalue references to optional lvalue references is disallowed");
42  return boost::forward<T>(r);
43 }
44 
45 #endif // BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
46 
47 template <class From>
49 {
50 #ifndef BOOST_OPTIONAL_CONFIG_ALLOW_BINDING_TO_RVALUES
51 #ifdef BOOST_OPTIONAL_CONFIG_NO_PROPER_ASSIGN_FROM_CONST_INT
52  // MSVC compiler without rvalue refernces: we need to disable the asignment from
53  // const integral lvalue reference, as it may be an invalid temporary
55  "binding const lvalue references to integral types is disabled in this compiler");
56 #endif
57 #endif
58 }
59 
60 template <class T>
62 {
63  static const bool value = false;
64 };
65 
66 template <class U>
68 {
69  static const bool value = true;
70 };
71 
72 template <class T>
74 {
76 };
77 
78 } // namespace detail
79 
80 template <class T>
82 {
83  T* ptr_;
84 
85 public:
86  typedef T& value_type;
87  typedef T& reference_type;
90  typedef T* pointer_type;
92 
93  optional() BOOST_NOEXCEPT : ptr_() {}
95 
96  template <class U>
97  explicit optional(const optional<U&>& rhs) BOOST_NOEXCEPT : ptr_(rhs.ptr_) {}
98  optional(const optional& rhs) BOOST_NOEXCEPT : ptr_(rhs.ptr_) {}
99 
100 
101  optional& operator=(const optional& rhs) BOOST_NOEXCEPT { ptr_ = rhs.ptr_; return *this; }
102  template <class U>
103  optional& operator=(const optional<U&>& rhs) BOOST_NOEXCEPT { ptr_ = rhs.ptr_; return *this; }
104  optional& operator=(none_t) BOOST_NOEXCEPT { ptr_ = 0; return *this; }
105 
106 
107  void swap(optional& rhs) BOOST_NOEXCEPT { std::swap(ptr_, rhs.ptr_); }
108  T& get() const { BOOST_ASSERT(ptr_); return *ptr_; }
109 
110  T* get_ptr() const BOOST_NOEXCEPT { return ptr_; }
111  T* operator->() const { BOOST_ASSERT(ptr_); return ptr_; }
112  T& operator*() const { BOOST_ASSERT(ptr_); return *ptr_; }
113  T& value() const { return ptr_ ? *ptr_ : (throw_exception(bad_optional_access()), *ptr_); }
114 
115  bool operator!() const BOOST_NOEXCEPT { return ptr_ == 0; }
117 
118  void reset() BOOST_NOEXCEPT { ptr_ = 0; }
119 
120  bool is_initialized() const BOOST_NOEXCEPT { return ptr_ != 0; }
121 
122 #ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
123 
124  template <class R>
126  : ptr_(boost::addressof(r)) { detail::prevent_binding_rvalue<R>(); }
127 
128  template <class R>
130  : ptr_(cond ? boost::addressof(r) : 0) { detail::prevent_binding_rvalue<R>(); }
131 
132  template <class R>
134  operator=(R&& r) BOOST_NOEXCEPT { detail::prevent_binding_rvalue<R>(); ptr_ = boost::addressof(r); return *this; }
135 
136  template <class R>
138  { detail::prevent_binding_rvalue<R>(); ptr_ = boost::addressof(r); }
139 
140  template <class R>
142  { detail::prevent_binding_rvalue<R>(); return ptr_ ? *ptr_ : r; }
143 
144  template <class R>
146  { detail::prevent_binding_rvalue<R>(); return ptr_ ? *ptr_ : r; }
147 
148  template <class R>
150  { detail::prevent_binding_rvalue<R>(); ptr_ = boost::addressof(r); }
151 
152  template <class F>
153  T& value_or_eval(F f) const { return ptr_ ? *ptr_ : detail::forward_reference(f()); }
154 
155 #else // BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
156 
157  template <class U>
159 
160  template <class U>
161  optional(bool cond, U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) BOOST_NOEXCEPT : ptr_(cond ? boost::addressof(v) : 0) {}
162 
163  template <class U>
165  operator=(U& v) BOOST_NOEXCEPT
166  {
167  detail::prevent_assignment_from_false_const_integral<U>();
168  ptr_ = boost::addressof(v); return *this;
169  }
170 
171  template <class U>
172  void emplace(U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) BOOST_NOEXCEPT
173  { ptr_ = boost::addressof(v); }
174 
175  template <class U>
176  T& get_value_or(U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) const BOOST_NOEXCEPT
177  { return ptr_ ? *ptr_ : v; }
178 
179  template <class U>
180  T& value_or(U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) const BOOST_NOEXCEPT
181  { return ptr_ ? *ptr_ : v; }
182 
183  template <class U>
184  void reset(U& v, BOOST_DEDUCED_TYPENAME boost::enable_if<detail::is_no_optional<U> >::type* = 0) BOOST_NOEXCEPT
185  { ptr_ = boost::addressof(v); }
186 
187  template <class F>
188  T& value_or_eval(F f) const { return ptr_ ? *ptr_ : f(); }
189 
190 #endif // BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
191 };
192 
193 template <class T>
195 {
196  x.swap(y);
197 }
198 
199 } // namespace boost
200 
201 #endif // 1/0
202 
203 #endif // header guard
boost::optional< T & >::get
T & get() const
Definition: optional_reference_spec.hpp:108
boost::detail::is_no_optional
Definition: optional_reference_spec.hpp:73
boost::optional< T & >::reference_type
T & reference_type
Definition: optional_reference_spec.hpp:87
boost::swap
void swap(any &lhs, any &rhs) BOOST_NOEXCEPT
Definition: any.hpp:223
boost::is_lvalue_reference
Definition: is_lvalue_reference.hpp:32
boost::optional< T & >::emplace
void emplace(R &&r, BOOST_DEDUCED_TYPENAME boost::enable_if< detail::is_no_optional< R > >::type *=0) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:137
R
#define R(x, n)
Definition: SHA256.cpp:50
boost::optional< T & >::optional
optional(none_t) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:94
BOOST_STATIC_ASSERT_MSG
#define BOOST_STATIC_ASSERT_MSG(...)
Definition: static_assert.hpp:31
boost::optional< T & >::operator=
BOOST_DEDUCED_TYPENAME boost::enable_if< detail::is_no_optional< R >, optional< T & > & >::type operator=(R &&r) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:134
T
T
Definition: mem_fn_cc.hpp:25
BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT
#define BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT()
The macro defines a noexcept explicit operator of conversion to bool.
Definition: explicit_operator_bool.hpp:49
boost::optional< T & >::ptr_
T * ptr_
Definition: optional_reference_spec.hpp:83
boost::swap
void swap(optional< T & > &x, optional< T & > &y) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:194
boost::type
Definition: type.hpp:14
boost::throw_exception
BOOST_NORETURN void throw_exception(E const &e)
Definition: throw_exception.hpp:62
boost::optional< T & >::operator*
T & operator*() const
Definition: optional_reference_spec.hpp:112
boost::optional< T & >::reference_const_type
T & reference_const_type
Definition: optional_reference_spec.hpp:88
boost::optional< T & >::value
T & value() const
Definition: optional_reference_spec.hpp:113
boost::optional< T & >
Definition: optional_reference_spec.hpp:81
boost
BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE.
boost::optional< T & >::optional
optional() BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:93
boost::addressof
BOOST_FORCEINLINE T * addressof(T &v)
Definition: core/addressof.hpp:108
boost::none_t
Definition: none_t.hpp:29
boost::optional< T & >::operator=
optional & operator=(const optional< U & > &rhs) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:103
boost::optional< T & >::pointer_type
T * pointer_type
Definition: optional_reference_spec.hpp:90
boost::detail::is_optional_
Definition: optional_reference_spec.hpp:61
boost::optional< T & >::get_value_or
T & get_value_or(R &&r, BOOST_DEDUCED_TYPENAME boost::enable_if< detail::is_no_optional< R > >::type *=0) const BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:141
boost::optional< T & >::operator=
optional & operator=(none_t) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:104
is_integral.hpp
f
f
boost::optional< T & >::rval_reference_type
T & rval_reference_type
Definition: optional_reference_spec.hpp:89
boost::optional< T & >::optional
optional(const optional< U & > &rhs) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:97
boost::optional< T & >::optional
optional(const optional &rhs) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:98
boost::optional< T & >::value_or_eval
T & value_or_eval(F f) const
Definition: optional_reference_spec.hpp:153
BOOST_ASSERT
#define BOOST_ASSERT(expr)
Definition: assert.hpp:60
BOOST_NOEXCEPT
#define BOOST_NOEXCEPT
Definition: suffix.hpp:938
boost::optional_detail::optional_tag
Definition: old_optional_implementation.hpp:75
boost::optional< T & >::optional
optional(R &&r, BOOST_DEDUCED_TYPENAME boost::enable_if< detail::is_no_optional< R > >::type *=0) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:125
boost::optional< T & >::operator=
optional & operator=(const optional &rhs) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:101
boost::is_const
Definition: is_const.hpp:37
boost::optional< T & >::is_initialized
bool is_initialized() const BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:120
boost::bad_optional_access
Definition: bad_optional_access.hpp:22
boost::optional< T & >::reset
void reset(R &&r, BOOST_DEDUCED_TYPENAME boost::enable_if< detail::is_no_optional< R > >::type *=0) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:149
boost::enable_if
Definition: core/enable_if.hpp:41
boost::optional< T & >::operator!
bool operator!() const BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:115
is_const.hpp
BOOST_DEDUCED_TYPENAME
#define BOOST_DEDUCED_TYPENAME
Definition: suffix.hpp:467
boost::optional< T & >::pointer_const_type
T * pointer_const_type
Definition: optional_reference_spec.hpp:91
boost::remove_reference::type
boost::detail::remove_rvalue_ref< T >::type type
Definition: remove_reference.hpp:38
boost::optional< T & >::value_or
T & value_or(R &&r, BOOST_DEDUCED_TYPENAME boost::enable_if< detail::is_no_optional< R > >::type *=0) const BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:145
boost::optional< T & >::value_type
T & value_type
Definition: optional_reference_spec.hpp:86
boost::detail::prevent_assignment_from_false_const_integral
void prevent_assignment_from_false_const_integral()
Definition: optional_reference_spec.hpp:48
boost::optional< T & >::optional
optional(bool cond, R &&r, BOOST_DEDUCED_TYPENAME boost::enable_if< detail::is_no_optional< R > >::type *=0) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:129
boost::optional< T & >::operator->
T * operator->() const
Definition: optional_reference_spec.hpp:111
boost::detail::prevent_binding_rvalue
void prevent_binding_rvalue()
Definition: optional_reference_spec.hpp:29
boost::detail::is_optional_::value
static const bool value
Definition: optional_reference_spec.hpp:63
boost::optional< T & >::get_ptr
T * get_ptr() const BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:110
boost::optional< T & >::swap
void swap(optional &rhs) BOOST_NOEXCEPT
Definition: optional_reference_spec.hpp:107
boost::detail::is_no_optional::value
static const bool value
Definition: optional_reference_spec.hpp:75
boost::is_integral
Definition: is_integral.hpp:22
boost::optional
Definition: old_optional_implementation.hpp:646
boost::detail::forward_reference
BOOST_DEDUCED_TYPENAME boost::remove_reference< T >::type & forward_reference(T &&r)
Definition: optional_reference_spec.hpp:38


sick_visionary_ros
Author(s): SICK AG TechSupport 3D Snapshot
autogenerated on Thu Feb 8 2024 03:45:34