29 #ifndef _GLIBCXX_EXPERIMENTAL_PROPAGATE_CONST 30 #define _GLIBCXX_EXPERIMENTAL_PROPAGATE_CONST 1 32 #pragma GCC system_header 34 #if __cplusplus <= 201103L 44 namespace std _GLIBCXX_VISIBILITY(default)
46 namespace experimental
48 inline namespace fundamentals_v2
50 _GLIBCXX_BEGIN_NAMESPACE_VERSION
64 template <
typename _Tp>
68 typedef remove_reference_t<decltype(*std::declval<_Tp&>())> element_type;
71 template <
typename _Up>
75 template <
typename _Up>
76 struct __is_propagate_const<propagate_const<_Up>> :
true_type 79 template <
typename _Up>
80 friend constexpr
const _Up&
82 template <
typename _Up>
86 template <
typename _Up>
87 static constexpr element_type*
88 __to_raw_pointer(_Up* __u)
91 template <
typename _Up>
92 static constexpr element_type*
93 __to_raw_pointer(_Up& __u)
96 template <
typename _Up>
97 static constexpr
const element_type*
98 __to_raw_pointer(
const _Up* __u)
101 template <
typename _Up>
102 static constexpr
const element_type*
103 __to_raw_pointer(
const _Up& __u)
104 {
return __u.get(); }
107 static_assert(__and_<
is_object<
typename remove_pointer<_Tp>::type>,
110 "propagate_const requires a class or a pointer to an" 114 constexpr propagate_const() =
default;
115 propagate_const(
const propagate_const& __p) =
delete;
116 constexpr propagate_const(propagate_const&& __p) =
default;
117 template <
typename _Up,
typename 118 enable_if<__and_<is_constructible<_Tp, _Up&&>,
119 is_convertible<_Up&&, _Tp>>::value,
bool 122 : _M_t(std::move(get_underlying(__pu)))
124 template <
typename _Up,
typename 125 enable_if<__and_<is_constructible<_Tp, _Up&&>,
126 __not_<is_convertible<_Up&&, _Tp>>>::value,
129 : _M_t(std::move(get_underlying(__pu)))
131 template <
typename _Up,
typename 132 enable_if<__and_<is_constructible<_Tp, _Up&&>,
133 is_convertible<_Up&&, _Tp>,
134 __not_<__is_propagate_const<
135 typename decay<_Up>::type>>
136 >::value,
bool>::type=
true>
137 constexpr propagate_const(_Up&& __u)
138 : _M_t(std::forward<_Up>(__u))
140 template <
typename _Up,
typename 141 enable_if<__and_<is_constructible<_Tp, _Up&&>,
142 __not_<is_convertible<_Up&&, _Tp>>,
143 __not_<__is_propagate_const<
144 typename decay<_Up>::type>>
145 >::value,
bool>::type=
false>
146 constexpr
explicit propagate_const(_Up&& __u)
147 : _M_t(std::forward<_Up>(__u))
151 propagate_const& operator=(
const propagate_const& __p) =
delete;
152 constexpr propagate_const& operator=(propagate_const&& __p) =
default;
154 template <
typename _Up,
typename =
155 typename enable_if<is_convertible<_Up&&, _Tp>::value>::type>
158 _M_t = std::move(get_underlying(__pu));
162 template <
typename _Up,
typename =
163 typename enable_if<__and_<is_convertible<_Up&&, _Tp>,
164 __not_<__is_propagate_const<
165 typename decay<_Up>::type>>
167 constexpr propagate_const& operator=(_Up&& __u)
169 _M_t = std::forward<_Up>(__u);
174 explicit constexpr
operator bool()
const 179 constexpr
const element_type* operator->()
const 184 template <
typename _Up = _Tp,
185 typename enable_if<__or_<is_pointer<_Up>,
188 >::value,
bool>::type =
true>
189 constexpr
operator const element_type*()
const 194 constexpr
const element_type& operator*()
const 199 constexpr
const element_type*
get()
const 201 return __to_raw_pointer(_M_t);
205 constexpr element_type* operator->()
210 template <
typename _Up = _Tp,
211 typename enable_if<__or_<is_pointer<_Up>,
214 >::value,
bool>::type =
true>
215 constexpr
operator element_type*()
220 constexpr element_type& operator*()
225 constexpr element_type*
get()
227 return __to_raw_pointer(_M_t);
232 swap(propagate_const& __pt) noexcept(__is_nothrow_swappable<_Tp>::value)
235 swap(_M_t, get_underlying(__pt));
243 template <
typename _Tp>
247 return get_underlying(__pt) ==
nullptr;
250 template <
typename _Tp>
254 return nullptr == get_underlying(__pu);
257 template <
typename _Tp>
261 return get_underlying(__pt) !=
nullptr;
264 template <
typename _Tp>
267 return nullptr != get_underlying(__pu);
270 template <
typename _Tp,
typename _Up>
275 return get_underlying(__pt) == get_underlying(__pu);
278 template <
typename _Tp,
typename _Up>
283 return get_underlying(__pt) != get_underlying(__pu);
286 template <
typename _Tp,
typename _Up>
288 operator<(const propagate_const<_Tp>& __pt,
291 return get_underlying(__pt) < get_underlying(__pu);
294 template <
typename _Tp,
typename _Up>
299 return get_underlying(__pt) > get_underlying(__pu);
302 template <
typename _Tp,
typename _Up>
304 operator<=(const propagate_const<_Tp>& __pt,
307 return get_underlying(__pt) <= get_underlying(__pu);
310 template <
typename _Tp,
typename _Up>
315 return get_underlying(__pt) >= get_underlying(__pu);
318 template <
typename _Tp,
typename _Up>
322 return get_underlying(__pt) == __u;
325 template <
typename _Tp,
typename _Up>
329 return get_underlying(__pt) != __u;
332 template <
typename _Tp,
typename _Up>
334 operator<(const propagate_const<_Tp>& __pt,
const _Up& __u)
336 return get_underlying(__pt) < __u;
339 template <
typename _Tp,
typename _Up>
343 return get_underlying(__pt) > __u;
346 template <
typename _Tp,
typename _Up>
348 operator<=(const propagate_const<_Tp>& __pt,
const _Up& __u)
350 return get_underlying(__pt) <= __u;
353 template <
typename _Tp,
typename _Up>
357 return get_underlying(__pt) >= __u;
360 template <
typename _Tp,
typename _Up>
364 return __t == get_underlying(__pu);
367 template <
typename _Tp,
typename _Up>
371 return __t != get_underlying(__pu);
374 template <
typename _Tp,
typename _Up>
376 operator<(const _Tp& __t, const propagate_const<_Up>& __pu)
378 return __t < get_underlying(__pu);
381 template <
typename _Tp,
typename _Up>
385 return __t > get_underlying(__pu);
388 template <
typename _Tp,
typename _Up>
390 operator<=(const _Tp& __t, const propagate_const<_Up>& __pu)
392 return __t <= get_underlying(__pu);
395 template <
typename _Tp,
typename _Up>
399 return __t >= get_underlying(__pu);
403 template <
typename _Tp>
406 noexcept(__is_nothrow_swappable<_Tp>::value)
412 template <
typename _Tp>
419 template <
typename _Tp>
427 _GLIBCXX_END_NAMESPACE_VERSION
432 template <
typename _Tp>
435 using result_type = size_t;
436 using argument_type = experimental::propagate_const<_Tp>;
439 operator()(
const experimental::propagate_const<_Tp>& __t)
const 440 noexcept(noexcept(
hash<_Tp>{}(get_underlying(__t))))
447 template <
typename _Tp>
451 operator()(
const experimental::propagate_const<_Tp>& __x,
452 const experimental::propagate_const<_Tp>& __y)
const 454 return equal_to<_Tp>{}(get_underlying(__x), get_underlying(__y));
457 typedef experimental::propagate_const<_Tp> first_argument_type;
458 typedef experimental::propagate_const<_Tp> second_argument_type;
459 typedef bool result_type;
462 template <
typename _Tp>
466 operator()(
const experimental::propagate_const<_Tp>& __x,
467 const experimental::propagate_const<_Tp>& __y)
const 472 typedef experimental::propagate_const<_Tp> first_argument_type;
473 typedef experimental::propagate_const<_Tp> second_argument_type;
474 typedef bool result_type;
477 template <
typename _Tp>
481 operator()(
const experimental::propagate_const<_Tp>& __x,
482 const experimental::propagate_const<_Tp>& __y)
const 484 return less<_Tp>{}(get_underlying(__x), get_underlying(__y));
487 typedef experimental::propagate_const<_Tp> first_argument_type;
488 typedef experimental::propagate_const<_Tp> second_argument_type;
489 typedef bool result_type;
492 template <
typename _Tp>
496 operator()(
const experimental::propagate_const<_Tp>& __x,
497 const experimental::propagate_const<_Tp>& __y)
const 499 return greater<_Tp>{}(get_underlying(__x), get_underlying(__y));
502 typedef experimental::propagate_const<_Tp> first_argument_type;
503 typedef experimental::propagate_const<_Tp> second_argument_type;
504 typedef bool result_type;
507 template <
typename _Tp>
511 operator()(
const experimental::propagate_const<_Tp>& __x,
512 const experimental::propagate_const<_Tp>& __y)
const 517 typedef experimental::propagate_const<_Tp> first_argument_type;
518 typedef experimental::propagate_const<_Tp> second_argument_type;
519 typedef bool result_type;
522 template <
typename _Tp>
526 operator()(
const experimental::propagate_const<_Tp>& __x,
527 const experimental::propagate_const<_Tp>& __y)
const 532 typedef experimental::propagate_const<_Tp> first_argument_type;
533 typedef experimental::propagate_const<_Tp> second_argument_type;
534 typedef bool result_type;
540 #endif // _GLIBCXX_EXPERIMENTAL_PROPAGATE_CONST
One of the comparison functors.
One of the comparison functors.
ISO C++ entities toplevel namespace is std.
Const-propagating wrapper.
One of the comparison functors.
One of the comparison functors.
One of the comparison functors.
One of the comparison functors.
Primary class template hash.