29 #ifndef _GLIBCXX_EXPERIMENTAL_PROPAGATE_CONST 30 #define _GLIBCXX_EXPERIMENTAL_PROPAGATE_CONST 1 32 #pragma GCC system_header 34 #if __cplusplus >= 201402L 42 namespace std _GLIBCXX_VISIBILITY(default)
44 _GLIBCXX_BEGIN_NAMESPACE_VERSION
46 namespace experimental
48 inline namespace fundamentals_v2
62 template <
typename _Tp>
69 template <
typename _Up>
73 template <
typename _Up>
77 template <
typename _Up>
78 friend constexpr
const _Up&
80 template <
typename _Up>
84 template <
typename _Up>
85 static constexpr element_type*
86 __to_raw_pointer(_Up* __u)
89 template <
typename _Up>
90 static constexpr element_type*
91 __to_raw_pointer(_Up& __u)
94 template <
typename _Up>
95 static constexpr
const element_type*
96 __to_raw_pointer(
const _Up* __u)
99 template <
typename _Up>
100 static constexpr
const element_type*
101 __to_raw_pointer(
const _Up& __u)
102 {
return __u.get(); }
105 static_assert(__and_<
is_object<
typename remove_pointer<_Tp>::type>,
108 "propagate_const requires a class or a pointer to an" 115 template <
typename _Up,
typename 120 : _M_t(std::move(get_underlying(__pu)))
122 template <
typename _Up,
typename 124 __not_<is_convertible<_Up&&, _Tp>>>::value,
127 : _M_t(std::move(get_underlying(__pu)))
129 template <
typename _Up,
typename 132 __not_<__is_propagate_const<
133 typename decay<_Up>::type>>
134 >::value,
bool>::type=
true>
136 : _M_t(std::forward<_Up>(__u))
138 template <
typename _Up,
typename 140 __not_<is_convertible<_Up&&, _Tp>>,
141 __not_<__is_propagate_const<
142 typename decay<_Up>::type>>
143 >::value,
bool>::type=
false>
145 : _M_t(std::forward<_Up>(__u))
152 template <
typename _Up,
typename =
156 _M_t = std::move(get_underlying(__pu));
160 template <
typename _Up,
typename =
162 __not_<__is_propagate_const<
163 typename decay<_Up>::type>>
167 _M_t = std::forward<_Up>(__u);
172 explicit constexpr
operator bool()
const 177 constexpr
const element_type* operator->()
const 182 template <
typename _Up = _Tp,
186 >::value,
bool>::type =
true>
187 constexpr
operator const element_type*()
const 192 constexpr
const element_type& operator*()
const 197 constexpr
const element_type*
get()
const 199 return __to_raw_pointer(_M_t);
203 constexpr element_type* operator->()
208 template <
typename _Up = _Tp,
212 >::value,
bool>::type =
true>
213 constexpr
operator element_type*()
218 constexpr element_type& operator*()
223 constexpr element_type*
get()
225 return __to_raw_pointer(_M_t);
230 swap(
propagate_const& __pt) noexcept(__is_nothrow_swappable<_Tp>::value)
233 swap(_M_t, get_underlying(__pt));
241 template <
typename _Tp>
245 return get_underlying(__pt) ==
nullptr;
248 template <
typename _Tp>
250 operator==(nullptr_t,
const propagate_const<_Tp>& __pu)
252 return nullptr == get_underlying(__pu);
255 template <
typename _Tp>
257 operator!=(
const propagate_const<_Tp>& __pt, nullptr_t)
259 return get_underlying(__pt) !=
nullptr;
262 template <
typename _Tp>
263 constexpr
bool operator!=(nullptr_t,
const propagate_const<_Tp>& __pu)
265 return nullptr != get_underlying(__pu);
268 template <
typename _Tp,
typename _Up>
270 operator==(
const propagate_const<_Tp>& __pt,
271 const propagate_const<_Up>& __pu)
273 return get_underlying(__pt) == get_underlying(__pu);
276 template <
typename _Tp,
typename _Up>
278 operator!=(
const propagate_const<_Tp>& __pt,
279 const propagate_const<_Up>& __pu)
281 return get_underlying(__pt) != get_underlying(__pu);
284 template <
typename _Tp,
typename _Up>
286 operator<(const propagate_const<_Tp>& __pt,
287 const propagate_const<_Up>& __pu)
289 return get_underlying(__pt) < get_underlying(__pu);
292 template <
typename _Tp,
typename _Up>
294 operator>(
const propagate_const<_Tp>& __pt,
295 const propagate_const<_Up>& __pu)
297 return get_underlying(__pt) > get_underlying(__pu);
300 template <
typename _Tp,
typename _Up>
302 operator<=(const propagate_const<_Tp>& __pt,
303 const propagate_const<_Up>& __pu)
305 return get_underlying(__pt) <= get_underlying(__pu);
308 template <
typename _Tp,
typename _Up>
310 operator>=(
const propagate_const<_Tp>& __pt,
311 const propagate_const<_Up>& __pu)
313 return get_underlying(__pt) >= get_underlying(__pu);
316 template <
typename _Tp,
typename _Up>
318 operator==(
const propagate_const<_Tp>& __pt,
const _Up& __u)
320 return get_underlying(__pt) == __u;
323 template <
typename _Tp,
typename _Up>
325 operator!=(
const propagate_const<_Tp>& __pt,
const _Up& __u)
327 return get_underlying(__pt) != __u;
330 template <
typename _Tp,
typename _Up>
332 operator<(const propagate_const<_Tp>& __pt,
const _Up& __u)
334 return get_underlying(__pt) < __u;
337 template <
typename _Tp,
typename _Up>
339 operator>(
const propagate_const<_Tp>& __pt,
const _Up& __u)
341 return get_underlying(__pt) > __u;
344 template <
typename _Tp,
typename _Up>
346 operator<=(const propagate_const<_Tp>& __pt,
const _Up& __u)
348 return get_underlying(__pt) <= __u;
351 template <
typename _Tp,
typename _Up>
353 operator>=(
const propagate_const<_Tp>& __pt,
const _Up& __u)
355 return get_underlying(__pt) >= __u;
358 template <
typename _Tp,
typename _Up>
360 operator==(
const _Tp& __t,
const propagate_const<_Up>& __pu)
362 return __t == get_underlying(__pu);
365 template <
typename _Tp,
typename _Up>
367 operator!=(
const _Tp& __t,
const propagate_const<_Up>& __pu)
369 return __t != get_underlying(__pu);
372 template <
typename _Tp,
typename _Up>
374 operator<(const _Tp& __t, const propagate_const<_Up>& __pu)
376 return __t < get_underlying(__pu);
379 template <
typename _Tp,
typename _Up>
381 operator>(
const _Tp& __t,
const propagate_const<_Up>& __pu)
383 return __t > get_underlying(__pu);
386 template <
typename _Tp,
typename _Up>
388 operator<=(const _Tp& __t, const propagate_const<_Up>& __pu)
390 return __t <= get_underlying(__pu);
393 template <
typename _Tp,
typename _Up>
395 operator>=(
const _Tp& __t,
const propagate_const<_Up>& __pu)
397 return __t >= get_underlying(__pu);
401 template <
typename _Tp>
403 swap(propagate_const<_Tp>& __pt, propagate_const<_Tp>& __pt2)
404 noexcept(__is_nothrow_swappable<_Tp>::value)
410 template <
typename _Tp>
412 get_underlying(
const propagate_const<_Tp>& __pt) noexcept
417 template <
typename _Tp>
419 get_underlying(propagate_const<_Tp>& __pt) noexcept
429 template <
typename _Tp>
430 struct hash<experimental::propagate_const<_Tp>>
432 using result_type = size_t;
433 using argument_type = experimental::propagate_const<_Tp>;
436 operator()(
const experimental::propagate_const<_Tp>& __t)
const 437 noexcept(noexcept(hash<_Tp>{}(get_underlying(__t))))
439 return hash<_Tp>{}(get_underlying(__t));
444 template <
typename _Tp>
445 struct equal_to<experimental::propagate_const<_Tp>>
448 operator()(
const experimental::propagate_const<_Tp>& __x,
449 const experimental::propagate_const<_Tp>& __y)
const 451 return equal_to<_Tp>{}(get_underlying(__x), get_underlying(__y));
459 template <
typename _Tp>
460 struct not_equal_to<experimental::propagate_const<_Tp>>
463 operator()(
const experimental::propagate_const<_Tp>& __x,
464 const experimental::propagate_const<_Tp>& __y)
const 466 return not_equal_to<_Tp>{}(get_underlying(__x), get_underlying(__y));
474 template <
typename _Tp>
475 struct less<experimental::propagate_const<_Tp>>
478 operator()(
const experimental::propagate_const<_Tp>& __x,
479 const experimental::propagate_const<_Tp>& __y)
const 481 return less<_Tp>{}(get_underlying(__x), get_underlying(__y));
489 template <
typename _Tp>
490 struct greater<experimental::propagate_const<_Tp>>
493 operator()(
const experimental::propagate_const<_Tp>& __x,
494 const experimental::propagate_const<_Tp>& __y)
const 496 return greater<_Tp>{}(get_underlying(__x), get_underlying(__y));
504 template <
typename _Tp>
505 struct less_equal<experimental::propagate_const<_Tp>>
508 operator()(
const experimental::propagate_const<_Tp>& __x,
509 const experimental::propagate_const<_Tp>& __y)
const 511 return less_equal<_Tp>{}(get_underlying(__x), get_underlying(__y));
519 template <
typename _Tp>
520 struct greater_equal<experimental::propagate_const<_Tp>>
523 operator()(
const experimental::propagate_const<_Tp>& __x,
524 const experimental::propagate_const<_Tp>& __y)
const 526 return greater_equal<_Tp>{}(get_underlying(__x), get_underlying(__y));
534 _GLIBCXX_END_NAMESPACE_VERSION
539 #endif // _GLIBCXX_EXPERIMENTAL_PROPAGATE_CONST
ISO C++ entities toplevel namespace is std.
_Tp first_argument_type
first_argument_type is the type of the first argument
typename remove_reference< _Tp >::type remove_reference_t
Alias template for remove_reference.
_Tp second_argument_type
second_argument_type is the type of the second argument
Const-propagating wrapper.
bool result_type
result_type is the return type
Define a member typedef type only if a boolean constant is true.