1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===------------------------ propagate_const -----------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_EXPERIMENTAL_PROPAGATE_CONST 11*4d6fc14bSjoerg#define _LIBCPP_EXPERIMENTAL_PROPAGATE_CONST 12*4d6fc14bSjoerg/* 13*4d6fc14bSjoerg propagate_const synopsis 14*4d6fc14bSjoerg 15*4d6fc14bSjoerg namespace std { namespace experimental { inline namespace fundamentals_v2 { 16*4d6fc14bSjoerg 17*4d6fc14bSjoerg // [propagate_const] 18*4d6fc14bSjoerg template <class T> class propagate_const; 19*4d6fc14bSjoerg 20*4d6fc14bSjoerg // [propagate_const.underlying], underlying pointer access 21*4d6fc14bSjoerg constexpr const _Tp& _VSTD_LFTS_V2::get_underlying(const propagate_const<T>& pt) noexcept; 22*4d6fc14bSjoerg constexpr T& _VSTD_LFTS_V2::get_underlying(propagate_const<T>& pt) noexcept; 23*4d6fc14bSjoerg 24*4d6fc14bSjoerg // [propagate_const.relational], relational operators 25*4d6fc14bSjoerg template <class T> constexpr bool operator==(const propagate_const<T>& pt, nullptr_t); 26*4d6fc14bSjoerg template <class T> constexpr bool operator==(nullptr_t, const propagate_const<T>& pu); 27*4d6fc14bSjoerg template <class T> constexpr bool operator!=(const propagate_const<T>& pt, nullptr_t); 28*4d6fc14bSjoerg template <class T> constexpr bool operator!=(nullptr_t, const propagate_const<T>& pu); 29*4d6fc14bSjoerg template <class T, class U> constexpr bool operator==(const propagate_const<T>& pt, const propagate_const<_Up>& pu); 30*4d6fc14bSjoerg template <class T, class U> constexpr bool operator!=(const propagate_const<T>& pt, const propagate_const<_Up>& pu); 31*4d6fc14bSjoerg template <class T, class U> constexpr bool operator<(const propagate_const<T>& pt, const propagate_const<_Up>& pu); 32*4d6fc14bSjoerg template <class T, class U> constexpr bool operator>(const propagate_const<T>& pt, const propagate_const<_Up>& pu); 33*4d6fc14bSjoerg template <class T, class U> constexpr bool operator<=(const propagate_const<T>& pt, const propagate_const<_Up>& pu); 34*4d6fc14bSjoerg template <class T, class U> constexpr bool operator>=(const propagate_const<T>& pt, const propagate_const<_Up>& pu); 35*4d6fc14bSjoerg template <class T, class U> constexpr bool operator==(const propagate_const<T>& pt, const _Up& u); 36*4d6fc14bSjoerg template <class T, class U> constexpr bool operator!=(const propagate_const<T>& pt, const _Up& u); 37*4d6fc14bSjoerg template <class T, class U> constexpr bool operator<(const propagate_const<T>& pt, const _Up& u); 38*4d6fc14bSjoerg template <class T, class U> constexpr bool operator>(const propagate_const<T>& pt, const _Up& u); 39*4d6fc14bSjoerg template <class T, class U> constexpr bool operator<=(const propagate_const<T>& pt, const _Up& u); 40*4d6fc14bSjoerg template <class T, class U> constexpr bool operator>=(const propagate_const<T>& pt, const _Up& u); 41*4d6fc14bSjoerg template <class T, class U> constexpr bool operator==(const _Tp& t, const propagate_const<_Up>& pu); 42*4d6fc14bSjoerg template <class T, class U> constexpr bool operator!=(const _Tp& t, const propagate_const<_Up>& pu); 43*4d6fc14bSjoerg template <class T, class U> constexpr bool operator<(const _Tp& t, const propagate_const<_Up>& pu); 44*4d6fc14bSjoerg template <class T, class U> constexpr bool operator>(const _Tp& t, const propagate_const<_Up>& pu); 45*4d6fc14bSjoerg template <class T, class U> constexpr bool operator<=(const _Tp& t, const propagate_const<_Up>& pu); 46*4d6fc14bSjoerg template <class T, class U> constexpr bool operator>=(const _Tp& t, const propagate_const<_Up>& pu); 47*4d6fc14bSjoerg 48*4d6fc14bSjoerg // [propagate_const.algorithms], specialized algorithms 49*4d6fc14bSjoerg template <class T> constexpr void swap(propagate_const<T>& pt, propagate_const<T>& pu) noexcept(see below); 50*4d6fc14bSjoerg 51*4d6fc14bSjoerg template <class T> 52*4d6fc14bSjoerg class propagate_const 53*4d6fc14bSjoerg { 54*4d6fc14bSjoerg 55*4d6fc14bSjoerg public: 56*4d6fc14bSjoerg typedef remove_reference_t<decltype(*declval<T&>())> element_type; 57*4d6fc14bSjoerg 58*4d6fc14bSjoerg // [propagate_const.ctor], constructors 59*4d6fc14bSjoerg constexpr propagate_const() = default; 60*4d6fc14bSjoerg propagate_const(const propagate_const& p) = delete; 61*4d6fc14bSjoerg constexpr propagate_const(propagate_const&& p) = default; 62*4d6fc14bSjoerg template <class U> EXPLICIT constexpr propagate_const(propagate_const<_Up>&& pu); // see below 63*4d6fc14bSjoerg template <class U> EXPLICIT constexpr propagate_const(U&& u); // see below 64*4d6fc14bSjoerg 65*4d6fc14bSjoerg // [propagate_const.assignment], assignment 66*4d6fc14bSjoerg propagate_const& operator=(const propagate_const& p) = delete; 67*4d6fc14bSjoerg constexpr propagate_const& operator=(propagate_const&& p) = default; 68*4d6fc14bSjoerg template <class U> constexpr propagate_const& operator=(propagate_const<_Up>&& pu); 69*4d6fc14bSjoerg template <class U> constexpr propagate_const& operator=(U&& u); // see below 70*4d6fc14bSjoerg 71*4d6fc14bSjoerg // [propagate_const.const_observers], const observers 72*4d6fc14bSjoerg explicit constexpr operator bool() const; 73*4d6fc14bSjoerg constexpr const element_type* operator->() const; 74*4d6fc14bSjoerg constexpr operator const element_type*() const; // Not always defined 75*4d6fc14bSjoerg constexpr const element_type& operator*() const; 76*4d6fc14bSjoerg constexpr const element_type* get() const; 77*4d6fc14bSjoerg 78*4d6fc14bSjoerg // [propagate_const.non_const_observers], non-const observers 79*4d6fc14bSjoerg constexpr element_type* operator->(); 80*4d6fc14bSjoerg constexpr operator element_type*(); // Not always defined 81*4d6fc14bSjoerg constexpr element_type& operator*(); 82*4d6fc14bSjoerg constexpr element_type* get(); 83*4d6fc14bSjoerg 84*4d6fc14bSjoerg // [propagate_const.modifiers], modifiers 85*4d6fc14bSjoerg constexpr void swap(propagate_const& pt) noexcept(see below) 86*4d6fc14bSjoerg 87*4d6fc14bSjoerg private: 88*4d6fc14bSjoerg T t_; // exposition only 89*4d6fc14bSjoerg }; 90*4d6fc14bSjoerg 91*4d6fc14bSjoerg } // namespace fundamentals_v2 92*4d6fc14bSjoerg } // namespace experimental 93*4d6fc14bSjoerg 94*4d6fc14bSjoerg // [propagate_const.hash], hash support 95*4d6fc14bSjoerg template <class T> struct hash<experimental::fundamentals_v2::propagate_const<T>>; 96*4d6fc14bSjoerg 97*4d6fc14bSjoerg // [propagate_const.comparison_function_objects], comparison function objects 98*4d6fc14bSjoerg template <class T> struct equal_to<experimental::fundamentals_v2::propagate_const<T>>; 99*4d6fc14bSjoerg template <class T> struct not_equal_to<experimental::fundamentals_v2::propagate_const<T>>; 100*4d6fc14bSjoerg template <class T> struct less<experimental::fundamentals_v2::propagate_const<T>>; 101*4d6fc14bSjoerg template <class T> struct greater<experimental::fundamentals_v2::propagate_const<T>>; 102*4d6fc14bSjoerg template <class T> struct less_equal<experimental::fundamentals_v2::propagate_const<T>>; 103*4d6fc14bSjoerg template <class T> struct greater_equal<experimental::fundamentals_v2::propagate_const<T>>; 104*4d6fc14bSjoerg 105*4d6fc14bSjoerg} // namespace std 106*4d6fc14bSjoerg 107*4d6fc14bSjoerg*/ 108*4d6fc14bSjoerg 109*4d6fc14bSjoerg#include <experimental/__config> 110*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 111*4d6fc14bSjoerg#pragma GCC system_header 112*4d6fc14bSjoerg#endif 113*4d6fc14bSjoerg 114*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 115*4d6fc14bSjoerg 116*4d6fc14bSjoerg#include <type_traits> 117*4d6fc14bSjoerg#include <utility> 118*4d6fc14bSjoerg#include <functional> 119*4d6fc14bSjoerg 120*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_LFTS_V2 121*4d6fc14bSjoerg 122*4d6fc14bSjoerg 123*4d6fc14bSjoergtemplate <class _Tp> 124*4d6fc14bSjoergclass propagate_const; 125*4d6fc14bSjoerg 126*4d6fc14bSjoergtemplate <class _Up> 127*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 128*4d6fc14bSjoergconst _Up& get_underlying(const propagate_const<_Up>& __pu) _NOEXCEPT; 129*4d6fc14bSjoerg 130*4d6fc14bSjoergtemplate <class _Up> 131*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 132*4d6fc14bSjoerg_Up& get_underlying(propagate_const<_Up>& __pu) _NOEXCEPT; 133*4d6fc14bSjoerg 134*4d6fc14bSjoergtemplate <class _Tp> 135*4d6fc14bSjoergclass propagate_const 136*4d6fc14bSjoerg{ 137*4d6fc14bSjoergpublic: 138*4d6fc14bSjoerg typedef remove_reference_t<decltype(*declval<_Tp&>())> element_type; 139*4d6fc14bSjoerg 140*4d6fc14bSjoerg static_assert(!is_array<_Tp>::value, 141*4d6fc14bSjoerg "Instantiation of propagate_const with an array type is ill-formed."); 142*4d6fc14bSjoerg static_assert(!is_reference<_Tp>::value, 143*4d6fc14bSjoerg "Instantiation of propagate_const with a reference type is ill-formed."); 144*4d6fc14bSjoerg static_assert(!(is_pointer<_Tp>::value && is_function<typename remove_pointer<_Tp>::type>::value), 145*4d6fc14bSjoerg "Instantiation of propagate_const with a function-pointer type is ill-formed."); 146*4d6fc14bSjoerg static_assert(!(is_pointer<_Tp>::value && is_same<typename remove_cv<typename remove_pointer<_Tp>::type>::type, void>::value), 147*4d6fc14bSjoerg "Instantiation of propagate_const with a pointer to (possibly cv-qualified) void is ill-formed."); 148*4d6fc14bSjoerg 149*4d6fc14bSjoergprivate: 150*4d6fc14bSjoerg template <class _Up> 151*4d6fc14bSjoerg static _LIBCPP_CONSTEXPR element_type* __get_pointer(_Up* __u) 152*4d6fc14bSjoerg { 153*4d6fc14bSjoerg return __u; 154*4d6fc14bSjoerg } 155*4d6fc14bSjoerg 156*4d6fc14bSjoerg template <class _Up> 157*4d6fc14bSjoerg static _LIBCPP_CONSTEXPR element_type* __get_pointer(_Up& __u) 158*4d6fc14bSjoerg { 159*4d6fc14bSjoerg return __get_pointer(__u.get()); 160*4d6fc14bSjoerg } 161*4d6fc14bSjoerg 162*4d6fc14bSjoerg template <class _Up> 163*4d6fc14bSjoerg static _LIBCPP_CONSTEXPR const element_type* __get_pointer(const _Up* __u) 164*4d6fc14bSjoerg { 165*4d6fc14bSjoerg return __u; 166*4d6fc14bSjoerg } 167*4d6fc14bSjoerg 168*4d6fc14bSjoerg template <class _Up> 169*4d6fc14bSjoerg static _LIBCPP_CONSTEXPR const element_type* __get_pointer(const _Up& __u) 170*4d6fc14bSjoerg { 171*4d6fc14bSjoerg return __get_pointer(__u.get()); 172*4d6fc14bSjoerg } 173*4d6fc14bSjoerg 174*4d6fc14bSjoerg template <class _Up> 175*4d6fc14bSjoerg struct __is_propagate_const : false_type 176*4d6fc14bSjoerg { 177*4d6fc14bSjoerg }; 178*4d6fc14bSjoerg 179*4d6fc14bSjoerg template <class _Up> 180*4d6fc14bSjoerg struct __is_propagate_const<propagate_const<_Up>> : true_type 181*4d6fc14bSjoerg { 182*4d6fc14bSjoerg }; 183*4d6fc14bSjoerg 184*4d6fc14bSjoerg _Tp __t_; 185*4d6fc14bSjoerg 186*4d6fc14bSjoergpublic: 187*4d6fc14bSjoerg 188*4d6fc14bSjoerg template <class _Up> friend _LIBCPP_CONSTEXPR const _Up& ::_VSTD_LFTS_V2::get_underlying(const propagate_const<_Up>& __pu) _NOEXCEPT; 189*4d6fc14bSjoerg template <class _Up> friend _LIBCPP_CONSTEXPR _Up& ::_VSTD_LFTS_V2::get_underlying(propagate_const<_Up>& __pu) _NOEXCEPT; 190*4d6fc14bSjoerg 191*4d6fc14bSjoerg _LIBCPP_CONSTEXPR propagate_const() = default; 192*4d6fc14bSjoerg 193*4d6fc14bSjoerg propagate_const(const propagate_const&) = delete; 194*4d6fc14bSjoerg 195*4d6fc14bSjoerg _LIBCPP_CONSTEXPR propagate_const(propagate_const&&) = default; 196*4d6fc14bSjoerg 197*4d6fc14bSjoerg template <class _Up, enable_if_t<!is_convertible<_Up, _Tp>::value && 198*4d6fc14bSjoerg is_constructible<_Tp, _Up&&>::value,bool> = true> 199*4d6fc14bSjoerg explicit _LIBCPP_CONSTEXPR propagate_const(propagate_const<_Up>&& __pu) 200*4d6fc14bSjoerg : __t_(std::move(_VSTD_LFTS_V2::get_underlying(__pu))) 201*4d6fc14bSjoerg { 202*4d6fc14bSjoerg } 203*4d6fc14bSjoerg 204*4d6fc14bSjoerg template <class _Up, enable_if_t<is_convertible<_Up&&, _Tp>::value && 205*4d6fc14bSjoerg is_constructible<_Tp, _Up&&>::value,bool> = false> 206*4d6fc14bSjoerg _LIBCPP_CONSTEXPR propagate_const(propagate_const<_Up>&& __pu) 207*4d6fc14bSjoerg : __t_(std::move(_VSTD_LFTS_V2::get_underlying(__pu))) 208*4d6fc14bSjoerg { 209*4d6fc14bSjoerg } 210*4d6fc14bSjoerg 211*4d6fc14bSjoerg template <class _Up, enable_if_t<!is_convertible<_Up&&, _Tp>::value && 212*4d6fc14bSjoerg is_constructible<_Tp, _Up&&>::value && 213*4d6fc14bSjoerg !__is_propagate_const<decay_t<_Up>>::value,bool> = true> 214*4d6fc14bSjoerg explicit _LIBCPP_CONSTEXPR propagate_const(_Up&& __u) 215*4d6fc14bSjoerg : __t_(std::forward<_Up>(__u)) 216*4d6fc14bSjoerg { 217*4d6fc14bSjoerg } 218*4d6fc14bSjoerg 219*4d6fc14bSjoerg template <class _Up, enable_if_t<is_convertible<_Up&&, _Tp>::value && 220*4d6fc14bSjoerg is_constructible<_Tp, _Up&&>::value && 221*4d6fc14bSjoerg !__is_propagate_const<decay_t<_Up>>::value,bool> = false> 222*4d6fc14bSjoerg _LIBCPP_CONSTEXPR propagate_const(_Up&& __u) 223*4d6fc14bSjoerg : __t_(std::forward<_Up>(__u)) 224*4d6fc14bSjoerg { 225*4d6fc14bSjoerg } 226*4d6fc14bSjoerg 227*4d6fc14bSjoerg propagate_const& operator=(const propagate_const&) = delete; 228*4d6fc14bSjoerg 229*4d6fc14bSjoerg _LIBCPP_CONSTEXPR propagate_const& operator=(propagate_const&&) = default; 230*4d6fc14bSjoerg 231*4d6fc14bSjoerg template <class _Up> 232*4d6fc14bSjoerg _LIBCPP_CONSTEXPR propagate_const& operator=(propagate_const<_Up>&& __pu) 233*4d6fc14bSjoerg { 234*4d6fc14bSjoerg __t_ = std::move(_VSTD_LFTS_V2::get_underlying(__pu)); 235*4d6fc14bSjoerg return *this; 236*4d6fc14bSjoerg } 237*4d6fc14bSjoerg 238*4d6fc14bSjoerg template <class _Up, class _Vp = enable_if_t<!__is_propagate_const<decay_t<_Up>>::value>> 239*4d6fc14bSjoerg _LIBCPP_CONSTEXPR propagate_const& operator=(_Up&& __u) 240*4d6fc14bSjoerg { 241*4d6fc14bSjoerg __t_ = std::forward<_Up>(__u); 242*4d6fc14bSjoerg return *this; 243*4d6fc14bSjoerg } 244*4d6fc14bSjoerg 245*4d6fc14bSjoerg _LIBCPP_CONSTEXPR const element_type* get() const 246*4d6fc14bSjoerg { 247*4d6fc14bSjoerg return __get_pointer(__t_); 248*4d6fc14bSjoerg } 249*4d6fc14bSjoerg 250*4d6fc14bSjoerg _LIBCPP_CONSTEXPR element_type* get() 251*4d6fc14bSjoerg { 252*4d6fc14bSjoerg return __get_pointer(__t_); 253*4d6fc14bSjoerg } 254*4d6fc14bSjoerg 255*4d6fc14bSjoerg explicit _LIBCPP_CONSTEXPR operator bool() const 256*4d6fc14bSjoerg { 257*4d6fc14bSjoerg return get() != nullptr; 258*4d6fc14bSjoerg } 259*4d6fc14bSjoerg 260*4d6fc14bSjoerg _LIBCPP_CONSTEXPR const element_type* operator->() const 261*4d6fc14bSjoerg { 262*4d6fc14bSjoerg return get(); 263*4d6fc14bSjoerg } 264*4d6fc14bSjoerg 265*4d6fc14bSjoerg template <class _Tp_ = _Tp, class _Up = enable_if_t<is_convertible< 266*4d6fc14bSjoerg const _Tp_, const element_type *>::value>> 267*4d6fc14bSjoerg _LIBCPP_CONSTEXPR operator const element_type *() const { 268*4d6fc14bSjoerg return get(); 269*4d6fc14bSjoerg } 270*4d6fc14bSjoerg 271*4d6fc14bSjoerg _LIBCPP_CONSTEXPR const element_type& operator*() const 272*4d6fc14bSjoerg { 273*4d6fc14bSjoerg return *get(); 274*4d6fc14bSjoerg } 275*4d6fc14bSjoerg 276*4d6fc14bSjoerg _LIBCPP_CONSTEXPR element_type* operator->() 277*4d6fc14bSjoerg { 278*4d6fc14bSjoerg return get(); 279*4d6fc14bSjoerg } 280*4d6fc14bSjoerg 281*4d6fc14bSjoerg template <class _Tp_ = _Tp, class _Up = enable_if_t< 282*4d6fc14bSjoerg is_convertible<_Tp_, element_type *>::value>> 283*4d6fc14bSjoerg _LIBCPP_CONSTEXPR operator element_type *() { 284*4d6fc14bSjoerg return get(); 285*4d6fc14bSjoerg } 286*4d6fc14bSjoerg 287*4d6fc14bSjoerg _LIBCPP_CONSTEXPR element_type& operator*() 288*4d6fc14bSjoerg { 289*4d6fc14bSjoerg return *get(); 290*4d6fc14bSjoerg } 291*4d6fc14bSjoerg 292*4d6fc14bSjoerg _LIBCPP_CONSTEXPR void swap(propagate_const& __pt) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) 293*4d6fc14bSjoerg { 294*4d6fc14bSjoerg using _VSTD::swap; 295*4d6fc14bSjoerg swap(__t_, __pt.__t_); 296*4d6fc14bSjoerg } 297*4d6fc14bSjoerg}; 298*4d6fc14bSjoerg 299*4d6fc14bSjoerg 300*4d6fc14bSjoergtemplate <class _Tp> 301*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 302*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator==(const propagate_const<_Tp>& __pt, nullptr_t) 303*4d6fc14bSjoerg{ 304*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) == nullptr; 305*4d6fc14bSjoerg} 306*4d6fc14bSjoerg 307*4d6fc14bSjoergtemplate <class _Tp> 308*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 309*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator==(nullptr_t, const propagate_const<_Tp>& __pt) 310*4d6fc14bSjoerg{ 311*4d6fc14bSjoerg return nullptr == _VSTD_LFTS_V2::get_underlying(__pt); 312*4d6fc14bSjoerg} 313*4d6fc14bSjoerg 314*4d6fc14bSjoergtemplate <class _Tp> 315*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 316*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator!=(const propagate_const<_Tp>& __pt, nullptr_t) 317*4d6fc14bSjoerg{ 318*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) != nullptr; 319*4d6fc14bSjoerg} 320*4d6fc14bSjoerg 321*4d6fc14bSjoergtemplate <class _Tp> 322*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 323*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator!=(nullptr_t, const propagate_const<_Tp>& __pt) 324*4d6fc14bSjoerg{ 325*4d6fc14bSjoerg return nullptr != _VSTD_LFTS_V2::get_underlying(__pt); 326*4d6fc14bSjoerg} 327*4d6fc14bSjoerg 328*4d6fc14bSjoergtemplate <class _Tp, class _Up> 329*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 330*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator==(const propagate_const<_Tp>& __pt, 331*4d6fc14bSjoerg const propagate_const<_Up>& __pu) 332*4d6fc14bSjoerg{ 333*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) == _VSTD_LFTS_V2::get_underlying(__pu); 334*4d6fc14bSjoerg} 335*4d6fc14bSjoerg 336*4d6fc14bSjoergtemplate <class _Tp, class _Up> 337*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 338*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator!=(const propagate_const<_Tp>& __pt, 339*4d6fc14bSjoerg const propagate_const<_Up>& __pu) 340*4d6fc14bSjoerg{ 341*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) != _VSTD_LFTS_V2::get_underlying(__pu); 342*4d6fc14bSjoerg} 343*4d6fc14bSjoerg 344*4d6fc14bSjoergtemplate <class _Tp, class _Up> 345*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 346*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator<(const propagate_const<_Tp>& __pt, 347*4d6fc14bSjoerg const propagate_const<_Up>& __pu) 348*4d6fc14bSjoerg{ 349*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) < _VSTD_LFTS_V2::get_underlying(__pu); 350*4d6fc14bSjoerg} 351*4d6fc14bSjoerg 352*4d6fc14bSjoergtemplate <class _Tp, class _Up> 353*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 354*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator>(const propagate_const<_Tp>& __pt, 355*4d6fc14bSjoerg const propagate_const<_Up>& __pu) 356*4d6fc14bSjoerg{ 357*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) > _VSTD_LFTS_V2::get_underlying(__pu); 358*4d6fc14bSjoerg} 359*4d6fc14bSjoerg 360*4d6fc14bSjoergtemplate <class _Tp, class _Up> 361*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 362*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator<=(const propagate_const<_Tp>& __pt, 363*4d6fc14bSjoerg const propagate_const<_Up>& __pu) 364*4d6fc14bSjoerg{ 365*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) <= _VSTD_LFTS_V2::get_underlying(__pu); 366*4d6fc14bSjoerg} 367*4d6fc14bSjoerg 368*4d6fc14bSjoergtemplate <class _Tp, class _Up> 369*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 370*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator>=(const propagate_const<_Tp>& __pt, 371*4d6fc14bSjoerg const propagate_const<_Up>& __pu) 372*4d6fc14bSjoerg{ 373*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) >= _VSTD_LFTS_V2::get_underlying(__pu); 374*4d6fc14bSjoerg} 375*4d6fc14bSjoerg 376*4d6fc14bSjoergtemplate <class _Tp, class _Up> 377*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 378*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator==(const propagate_const<_Tp>& __pt, const _Up& __u) 379*4d6fc14bSjoerg{ 380*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) == __u; 381*4d6fc14bSjoerg} 382*4d6fc14bSjoerg 383*4d6fc14bSjoergtemplate <class _Tp, class _Up> 384*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 385*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator!=(const propagate_const<_Tp>& __pt, const _Up& __u) 386*4d6fc14bSjoerg{ 387*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) != __u; 388*4d6fc14bSjoerg} 389*4d6fc14bSjoerg 390*4d6fc14bSjoergtemplate <class _Tp, class _Up> 391*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 392*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator<(const propagate_const<_Tp>& __pt, const _Up& __u) 393*4d6fc14bSjoerg{ 394*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) < __u; 395*4d6fc14bSjoerg} 396*4d6fc14bSjoerg 397*4d6fc14bSjoergtemplate <class _Tp, class _Up> 398*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 399*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator>(const propagate_const<_Tp>& __pt, const _Up& __u) 400*4d6fc14bSjoerg{ 401*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) > __u; 402*4d6fc14bSjoerg} 403*4d6fc14bSjoerg 404*4d6fc14bSjoergtemplate <class _Tp, class _Up> 405*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 406*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator<=(const propagate_const<_Tp>& __pt, const _Up& __u) 407*4d6fc14bSjoerg{ 408*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) <= __u; 409*4d6fc14bSjoerg} 410*4d6fc14bSjoerg 411*4d6fc14bSjoergtemplate <class _Tp, class _Up> 412*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 413*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator>=(const propagate_const<_Tp>& __pt, const _Up& __u) 414*4d6fc14bSjoerg{ 415*4d6fc14bSjoerg return _VSTD_LFTS_V2::get_underlying(__pt) >= __u; 416*4d6fc14bSjoerg} 417*4d6fc14bSjoerg 418*4d6fc14bSjoerg 419*4d6fc14bSjoergtemplate <class _Tp, class _Up> 420*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 421*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator==(const _Tp& __t, const propagate_const<_Up>& __pu) 422*4d6fc14bSjoerg{ 423*4d6fc14bSjoerg return __t == _VSTD_LFTS_V2::get_underlying(__pu); 424*4d6fc14bSjoerg} 425*4d6fc14bSjoerg 426*4d6fc14bSjoergtemplate <class _Tp, class _Up> 427*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 428*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator!=(const _Tp& __t, const propagate_const<_Up>& __pu) 429*4d6fc14bSjoerg{ 430*4d6fc14bSjoerg return __t != _VSTD_LFTS_V2::get_underlying(__pu); 431*4d6fc14bSjoerg} 432*4d6fc14bSjoerg 433*4d6fc14bSjoergtemplate <class _Tp, class _Up> 434*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 435*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator<(const _Tp& __t, const propagate_const<_Up>& __pu) 436*4d6fc14bSjoerg{ 437*4d6fc14bSjoerg return __t < _VSTD_LFTS_V2::get_underlying(__pu); 438*4d6fc14bSjoerg} 439*4d6fc14bSjoerg 440*4d6fc14bSjoergtemplate <class _Tp, class _Up> 441*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 442*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator>(const _Tp& __t, const propagate_const<_Up>& __pu) 443*4d6fc14bSjoerg{ 444*4d6fc14bSjoerg return __t > _VSTD_LFTS_V2::get_underlying(__pu); 445*4d6fc14bSjoerg} 446*4d6fc14bSjoerg 447*4d6fc14bSjoergtemplate <class _Tp, class _Up> 448*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 449*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator<=(const _Tp& __t, const propagate_const<_Up>& __pu) 450*4d6fc14bSjoerg{ 451*4d6fc14bSjoerg return __t <= _VSTD_LFTS_V2::get_underlying(__pu); 452*4d6fc14bSjoerg} 453*4d6fc14bSjoerg 454*4d6fc14bSjoergtemplate <class _Tp, class _Up> 455*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 456*4d6fc14bSjoerg_LIBCPP_CONSTEXPR bool operator>=(const _Tp& __t, const propagate_const<_Up>& __pu) 457*4d6fc14bSjoerg{ 458*4d6fc14bSjoerg return __t >= _VSTD_LFTS_V2::get_underlying(__pu); 459*4d6fc14bSjoerg} 460*4d6fc14bSjoerg 461*4d6fc14bSjoergtemplate <class _Tp> 462*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 463*4d6fc14bSjoerg_LIBCPP_CONSTEXPR void swap(propagate_const<_Tp>& __pc1, propagate_const<_Tp>& __pc2) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value) 464*4d6fc14bSjoerg{ 465*4d6fc14bSjoerg __pc1.swap(__pc2); 466*4d6fc14bSjoerg} 467*4d6fc14bSjoerg 468*4d6fc14bSjoergtemplate <class _Tp> 469*4d6fc14bSjoerg_LIBCPP_CONSTEXPR const _Tp& get_underlying(const propagate_const<_Tp>& __pt) _NOEXCEPT 470*4d6fc14bSjoerg{ 471*4d6fc14bSjoerg return __pt.__t_; 472*4d6fc14bSjoerg} 473*4d6fc14bSjoerg 474*4d6fc14bSjoergtemplate <class _Tp> 475*4d6fc14bSjoerg_LIBCPP_CONSTEXPR _Tp& get_underlying(propagate_const<_Tp>& __pt) _NOEXCEPT 476*4d6fc14bSjoerg{ 477*4d6fc14bSjoerg return __pt.__t_; 478*4d6fc14bSjoerg} 479*4d6fc14bSjoerg 480*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_LFTS_V2 481*4d6fc14bSjoerg 482*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 483*4d6fc14bSjoerg 484*4d6fc14bSjoergtemplate <class _Tp> 485*4d6fc14bSjoergstruct hash<experimental::fundamentals_v2::propagate_const<_Tp>> 486*4d6fc14bSjoerg{ 487*4d6fc14bSjoerg typedef size_t result_type; 488*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> argument_type; 489*4d6fc14bSjoerg 490*4d6fc14bSjoerg size_t operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1) const 491*4d6fc14bSjoerg { 492*4d6fc14bSjoerg return std::hash<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1)); 493*4d6fc14bSjoerg } 494*4d6fc14bSjoerg}; 495*4d6fc14bSjoerg 496*4d6fc14bSjoergtemplate <class _Tp> 497*4d6fc14bSjoergstruct equal_to<experimental::fundamentals_v2::propagate_const<_Tp>> 498*4d6fc14bSjoerg{ 499*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type; 500*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type; 501*4d6fc14bSjoerg 502*4d6fc14bSjoerg bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1, 503*4d6fc14bSjoerg const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const 504*4d6fc14bSjoerg { 505*4d6fc14bSjoerg return std::equal_to<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2)); 506*4d6fc14bSjoerg } 507*4d6fc14bSjoerg}; 508*4d6fc14bSjoerg 509*4d6fc14bSjoergtemplate <class _Tp> 510*4d6fc14bSjoergstruct not_equal_to<experimental::fundamentals_v2::propagate_const<_Tp>> 511*4d6fc14bSjoerg{ 512*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type; 513*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type; 514*4d6fc14bSjoerg 515*4d6fc14bSjoerg bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1, 516*4d6fc14bSjoerg const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const 517*4d6fc14bSjoerg { 518*4d6fc14bSjoerg return std::not_equal_to<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2)); 519*4d6fc14bSjoerg } 520*4d6fc14bSjoerg}; 521*4d6fc14bSjoerg 522*4d6fc14bSjoergtemplate <class _Tp> 523*4d6fc14bSjoergstruct less<experimental::fundamentals_v2::propagate_const<_Tp>> 524*4d6fc14bSjoerg{ 525*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type; 526*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type; 527*4d6fc14bSjoerg 528*4d6fc14bSjoerg bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1, 529*4d6fc14bSjoerg const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const 530*4d6fc14bSjoerg { 531*4d6fc14bSjoerg return std::less<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2)); 532*4d6fc14bSjoerg } 533*4d6fc14bSjoerg}; 534*4d6fc14bSjoerg 535*4d6fc14bSjoergtemplate <class _Tp> 536*4d6fc14bSjoergstruct greater<experimental::fundamentals_v2::propagate_const<_Tp>> 537*4d6fc14bSjoerg{ 538*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type; 539*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type; 540*4d6fc14bSjoerg 541*4d6fc14bSjoerg bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1, 542*4d6fc14bSjoerg const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const 543*4d6fc14bSjoerg { 544*4d6fc14bSjoerg return std::greater<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2)); 545*4d6fc14bSjoerg } 546*4d6fc14bSjoerg}; 547*4d6fc14bSjoerg 548*4d6fc14bSjoergtemplate <class _Tp> 549*4d6fc14bSjoergstruct less_equal<experimental::fundamentals_v2::propagate_const<_Tp>> 550*4d6fc14bSjoerg{ 551*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type; 552*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type; 553*4d6fc14bSjoerg 554*4d6fc14bSjoerg bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1, 555*4d6fc14bSjoerg const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const 556*4d6fc14bSjoerg { 557*4d6fc14bSjoerg return std::less_equal<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2)); 558*4d6fc14bSjoerg } 559*4d6fc14bSjoerg}; 560*4d6fc14bSjoerg 561*4d6fc14bSjoergtemplate <class _Tp> 562*4d6fc14bSjoergstruct greater_equal<experimental::fundamentals_v2::propagate_const<_Tp>> 563*4d6fc14bSjoerg{ 564*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type; 565*4d6fc14bSjoerg typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type; 566*4d6fc14bSjoerg 567*4d6fc14bSjoerg bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1, 568*4d6fc14bSjoerg const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const 569*4d6fc14bSjoerg { 570*4d6fc14bSjoerg return std::greater_equal<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2)); 571*4d6fc14bSjoerg } 572*4d6fc14bSjoerg}; 573*4d6fc14bSjoerg 574*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 575*4d6fc14bSjoerg 576*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER > 11 577*4d6fc14bSjoerg#endif // _LIBCPP_EXPERIMENTAL_PROPAGATE_CONST 578