xref: /netbsd-src/external/apache2/llvm/dist/libcxx/include/experimental/propagate_const (revision 4d6fc14bc9b0c5bf3e30be318c143ee82cadd108)
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