// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_EXPERIMENTAL_PROPAGATE_CONST
#define _LIBCPP_EXPERIMENTAL_PROPAGATE_CONST
/*
    propagate_const synopsis

    namespace std { namespace experimental { inline namespace fundamentals_v2 {

    // [propagate_const]
    template <class T> class propagate_const;

    // [propagate_const.underlying], underlying pointer access
    constexpr const _Tp& _VSTD_LFTS_V2::get_underlying(const propagate_const<T>& pt) noexcept;
    constexpr T& _VSTD_LFTS_V2::get_underlying(propagate_const<T>& pt) noexcept;

    // [propagate_const.relational], relational operators
    template <class T> constexpr bool operator==(const propagate_const<T>& pt, nullptr_t);
    template <class T> constexpr bool operator==(nullptr_t, const propagate_const<T>& pu);
    template <class T> constexpr bool operator!=(const propagate_const<T>& pt, nullptr_t);
    template <class T> constexpr bool operator!=(nullptr_t, const propagate_const<T>& pu);
    template <class T, class U> constexpr bool operator==(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator!=(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator<(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator>(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator<=(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator>=(const propagate_const<T>& pt, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator==(const propagate_const<T>& pt, const _Up& u);
    template <class T, class U> constexpr bool operator!=(const propagate_const<T>& pt, const _Up& u);
    template <class T, class U> constexpr bool operator<(const propagate_const<T>& pt, const _Up& u);
    template <class T, class U> constexpr bool operator>(const propagate_const<T>& pt, const _Up& u);
    template <class T, class U> constexpr bool operator<=(const propagate_const<T>& pt, const _Up& u);
    template <class T, class U> constexpr bool operator>=(const propagate_const<T>& pt, const _Up& u);
    template <class T, class U> constexpr bool operator==(const _Tp& t, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator!=(const _Tp& t, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator<(const _Tp& t, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator>(const _Tp& t, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator<=(const _Tp& t, const propagate_const<_Up>& pu);
    template <class T, class U> constexpr bool operator>=(const _Tp& t, const propagate_const<_Up>& pu);

    // [propagate_const.algorithms], specialized algorithms
    template <class T> constexpr void swap(propagate_const<T>& pt, propagate_const<T>& pu) noexcept(see below);

    template <class T>
    class propagate_const
    {

    public:
      typedef remove_reference_t<decltype(*declval<T&>())> element_type;

      // [propagate_const.ctor], constructors
      constexpr propagate_const() = default;
      propagate_const(const propagate_const& p) = delete;
      constexpr propagate_const(propagate_const&& p) = default;
      template <class U> EXPLICIT constexpr propagate_const(propagate_const<_Up>&& pu); // see below
      template <class U> EXPLICIT constexpr propagate_const(U&& u); // see below

      // [propagate_const.assignment], assignment
      propagate_const& operator=(const propagate_const& p) = delete;
      constexpr propagate_const& operator=(propagate_const&& p) = default;
      template <class U> constexpr propagate_const& operator=(propagate_const<_Up>&& pu);
      template <class U> constexpr propagate_const& operator=(U&& u); // see below

      // [propagate_const.const_observers], const observers
      explicit constexpr operator bool() const;
      constexpr const element_type* operator->() const;
      constexpr operator const element_type*() const; // Not always defined
      constexpr const element_type& operator*() const;
      constexpr const element_type* get() const;

      // [propagate_const.non_const_observers], non-const observers
      constexpr element_type* operator->();
      constexpr operator element_type*(); // Not always defined
      constexpr element_type& operator*();
      constexpr element_type* get();

      // [propagate_const.modifiers], modifiers
      constexpr void swap(propagate_const& pt) noexcept(see below)

    private:
      T t_; // exposition only
    };

  } // namespace fundamentals_v2
  } // namespace experimental

  // [propagate_const.hash], hash support
  template <class T> struct hash<experimental::fundamentals_v2::propagate_const<T>>;

  // [propagate_const.comparison_function_objects], comparison function objects
  template <class T> struct equal_to<experimental::fundamentals_v2::propagate_const<T>>;
  template <class T> struct not_equal_to<experimental::fundamentals_v2::propagate_const<T>>;
  template <class T> struct less<experimental::fundamentals_v2::propagate_const<T>>;
  template <class T> struct greater<experimental::fundamentals_v2::propagate_const<T>>;
  template <class T> struct less_equal<experimental::fundamentals_v2::propagate_const<T>>;
  template <class T> struct greater_equal<experimental::fundamentals_v2::propagate_const<T>>;

} // namespace std

*/

#include <experimental/__config>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#pragma GCC system_header
#endif

#if _LIBCPP_STD_VER > 11

#include <type_traits>
#include <utility>
#include <functional>

_LIBCPP_BEGIN_NAMESPACE_LFTS_V2


template <class _Tp>
class propagate_const;

template <class _Up>
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
const _Up& get_underlying(const propagate_const<_Up>& __pu) _NOEXCEPT;

template <class _Up>
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
_Up& get_underlying(propagate_const<_Up>& __pu) _NOEXCEPT;

template <class _Tp>
class propagate_const
{
public:
  typedef remove_reference_t<decltype(*declval<_Tp&>())> element_type;

  static_assert(!is_array<_Tp>::value,
      "Instantiation of propagate_const with an array type is ill-formed.");
  static_assert(!is_reference<_Tp>::value,
      "Instantiation of propagate_const with a reference type is ill-formed.");
  static_assert(!(is_pointer<_Tp>::value && is_function<typename remove_pointer<_Tp>::type>::value),
      "Instantiation of propagate_const with a function-pointer type is ill-formed.");
  static_assert(!(is_pointer<_Tp>::value && is_same<typename remove_cv<typename remove_pointer<_Tp>::type>::type, void>::value),
      "Instantiation of propagate_const with a pointer to (possibly cv-qualified) void is ill-formed.");

private:
  template <class _Up>
  static _LIBCPP_CONSTEXPR element_type* __get_pointer(_Up* __u)
  {
    return __u;
  }

  template <class _Up>
  static _LIBCPP_CONSTEXPR element_type* __get_pointer(_Up& __u)
  {
    return __get_pointer(__u.get());
  }

  template <class _Up>
  static _LIBCPP_CONSTEXPR const element_type* __get_pointer(const _Up* __u)
  {
    return __u;
  }

  template <class _Up>
  static _LIBCPP_CONSTEXPR const element_type* __get_pointer(const _Up& __u)
  {
    return __get_pointer(__u.get());
  }

  template <class _Up>
  struct __is_propagate_const : false_type
  {
  };

  template <class _Up>
  struct __is_propagate_const<propagate_const<_Up>> : true_type
  {
  };

  _Tp __t_;

public:

  template <class _Up> friend _LIBCPP_CONSTEXPR const _Up& ::_VSTD_LFTS_V2::get_underlying(const propagate_const<_Up>& __pu) _NOEXCEPT;
  template <class _Up> friend _LIBCPP_CONSTEXPR _Up& ::_VSTD_LFTS_V2::get_underlying(propagate_const<_Up>& __pu) _NOEXCEPT;

  _LIBCPP_CONSTEXPR propagate_const() = default;

  propagate_const(const propagate_const&) = delete;

  _LIBCPP_CONSTEXPR propagate_const(propagate_const&&) = default;

  template <class _Up, enable_if_t<!is_convertible<_Up, _Tp>::value &&
                                 is_constructible<_Tp, _Up&&>::value,bool> = true>
  explicit _LIBCPP_CONSTEXPR propagate_const(propagate_const<_Up>&& __pu)
      : __t_(std::move(_VSTD_LFTS_V2::get_underlying(__pu)))
  {
  }

  template <class _Up, enable_if_t<is_convertible<_Up&&, _Tp>::value &&
                                 is_constructible<_Tp, _Up&&>::value,bool> = false>
  _LIBCPP_CONSTEXPR propagate_const(propagate_const<_Up>&& __pu)
      : __t_(std::move(_VSTD_LFTS_V2::get_underlying(__pu)))
  {
  }

  template <class _Up, enable_if_t<!is_convertible<_Up&&, _Tp>::value &&
                                 is_constructible<_Tp, _Up&&>::value &&
                                 !__is_propagate_const<decay_t<_Up>>::value,bool> = true>
  explicit _LIBCPP_CONSTEXPR propagate_const(_Up&& __u)
      : __t_(std::forward<_Up>(__u))
  {
  }

  template <class _Up, enable_if_t<is_convertible<_Up&&, _Tp>::value &&
                                 is_constructible<_Tp, _Up&&>::value &&
                                 !__is_propagate_const<decay_t<_Up>>::value,bool> = false>
  _LIBCPP_CONSTEXPR propagate_const(_Up&& __u)
      : __t_(std::forward<_Up>(__u))
  {
  }

  propagate_const& operator=(const propagate_const&) = delete;

  _LIBCPP_CONSTEXPR propagate_const& operator=(propagate_const&&) = default;

  template <class _Up>
  _LIBCPP_CONSTEXPR propagate_const& operator=(propagate_const<_Up>&& __pu)
  {
    __t_ = std::move(_VSTD_LFTS_V2::get_underlying(__pu));
    return *this;
  }

  template <class _Up, class _Vp = enable_if_t<!__is_propagate_const<decay_t<_Up>>::value>>
  _LIBCPP_CONSTEXPR propagate_const& operator=(_Up&& __u)
  {
    __t_ = std::forward<_Up>(__u);
    return *this;
  }

  _LIBCPP_CONSTEXPR const element_type* get() const
  {
    return __get_pointer(__t_);
  }

  _LIBCPP_CONSTEXPR element_type* get()
  {
    return __get_pointer(__t_);
  }

  explicit _LIBCPP_CONSTEXPR operator bool() const
  {
    return get() != nullptr;
  }

  _LIBCPP_CONSTEXPR const element_type* operator->() const
  {
    return get();
  }

  template <class _Tp_ = _Tp, class _Up = enable_if_t<is_convertible<
                                  const _Tp_, const element_type *>::value>>
  _LIBCPP_CONSTEXPR operator const element_type *() const {
    return get();
  }

  _LIBCPP_CONSTEXPR const element_type& operator*() const
  {
    return *get();
  }

  _LIBCPP_CONSTEXPR element_type* operator->()
  {
    return get();
  }

  template <class _Tp_ = _Tp, class _Up = enable_if_t<
                                  is_convertible<_Tp_, element_type *>::value>>
  _LIBCPP_CONSTEXPR operator element_type *() {
    return get();
  }

  _LIBCPP_CONSTEXPR element_type& operator*()
  {
    return *get();
  }

  _LIBCPP_CONSTEXPR void swap(propagate_const& __pt) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
  {
    using _VSTD::swap;
    swap(__t_, __pt.__t_);
  }
};


template <class _Tp>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator==(const propagate_const<_Tp>& __pt, nullptr_t)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) == nullptr;
}

template <class _Tp>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator==(nullptr_t, const propagate_const<_Tp>& __pt)
{
  return nullptr == _VSTD_LFTS_V2::get_underlying(__pt);
}

template <class _Tp>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator!=(const propagate_const<_Tp>& __pt, nullptr_t)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) != nullptr;
}

template <class _Tp>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator!=(nullptr_t, const propagate_const<_Tp>& __pt)
{
  return nullptr != _VSTD_LFTS_V2::get_underlying(__pt);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator==(const propagate_const<_Tp>& __pt,
                          const propagate_const<_Up>& __pu)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) == _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator!=(const propagate_const<_Tp>& __pt,
                          const propagate_const<_Up>& __pu)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) != _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator<(const propagate_const<_Tp>& __pt,
                         const propagate_const<_Up>& __pu)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) < _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator>(const propagate_const<_Tp>& __pt,
                         const propagate_const<_Up>& __pu)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) > _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator<=(const propagate_const<_Tp>& __pt,
                          const propagate_const<_Up>& __pu)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) <= _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator>=(const propagate_const<_Tp>& __pt,
                          const propagate_const<_Up>& __pu)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) >= _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator==(const propagate_const<_Tp>& __pt, const _Up& __u)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) == __u;
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator!=(const propagate_const<_Tp>& __pt, const _Up& __u)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) != __u;
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator<(const propagate_const<_Tp>& __pt, const _Up& __u)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) < __u;
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator>(const propagate_const<_Tp>& __pt, const _Up& __u)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) > __u;
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator<=(const propagate_const<_Tp>& __pt, const _Up& __u)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) <= __u;
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator>=(const propagate_const<_Tp>& __pt, const _Up& __u)
{
  return _VSTD_LFTS_V2::get_underlying(__pt) >= __u;
}


template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator==(const _Tp& __t, const propagate_const<_Up>& __pu)
{
  return __t == _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator!=(const _Tp& __t, const propagate_const<_Up>& __pu)
{
  return __t != _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator<(const _Tp& __t, const propagate_const<_Up>& __pu)
{
  return __t < _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator>(const _Tp& __t, const propagate_const<_Up>& __pu)
{
  return __t > _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator<=(const _Tp& __t, const propagate_const<_Up>& __pu)
{
  return __t <= _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp, class _Up>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR bool operator>=(const _Tp& __t, const propagate_const<_Up>& __pu)
{
  return __t >= _VSTD_LFTS_V2::get_underlying(__pu);
}

template <class _Tp>
_LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR void swap(propagate_const<_Tp>& __pc1, propagate_const<_Tp>& __pc2) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
{
  __pc1.swap(__pc2);
}

template <class _Tp>
_LIBCPP_CONSTEXPR const _Tp& get_underlying(const propagate_const<_Tp>& __pt) _NOEXCEPT
{
  return __pt.__t_;
}

template <class _Tp>
_LIBCPP_CONSTEXPR _Tp& get_underlying(propagate_const<_Tp>& __pt) _NOEXCEPT
{
  return __pt.__t_;
}

_LIBCPP_END_NAMESPACE_LFTS_V2

_LIBCPP_BEGIN_NAMESPACE_STD

template <class _Tp>
struct hash<experimental::fundamentals_v2::propagate_const<_Tp>>
{
  typedef size_t result_type;
  typedef experimental::fundamentals_v2::propagate_const<_Tp> argument_type;

  size_t operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1) const
  {
    return std::hash<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1));
  }
};

template <class _Tp>
struct equal_to<experimental::fundamentals_v2::propagate_const<_Tp>>
{
  typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
  typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;

  bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
      const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
  {
    return std::equal_to<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
  }
};

template <class _Tp>
struct not_equal_to<experimental::fundamentals_v2::propagate_const<_Tp>>
{
  typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
  typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;

  bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
      const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
  {
    return std::not_equal_to<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
  }
};

template <class _Tp>
struct less<experimental::fundamentals_v2::propagate_const<_Tp>>
{
  typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
  typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;

  bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
      const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
  {
    return std::less<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
  }
};

template <class _Tp>
struct greater<experimental::fundamentals_v2::propagate_const<_Tp>>
{
  typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
  typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;

  bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
      const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
  {
    return std::greater<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
  }
};

template <class _Tp>
struct less_equal<experimental::fundamentals_v2::propagate_const<_Tp>>
{
  typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
  typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;

  bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
      const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
  {
    return std::less_equal<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
  }
};

template <class _Tp>
struct greater_equal<experimental::fundamentals_v2::propagate_const<_Tp>>
{
  typedef experimental::fundamentals_v2::propagate_const<_Tp> first_argument_type;
  typedef experimental::fundamentals_v2::propagate_const<_Tp> second_argument_type;

  bool operator()(const experimental::fundamentals_v2::propagate_const<_Tp>& __pc1,
      const experimental::fundamentals_v2::propagate_const<_Tp>& __pc2) const
  {
    return std::greater_equal<_Tp>()(_VSTD_LFTS_V2::get_underlying(__pc1), _VSTD_LFTS_V2::get_underlying(__pc2));
  }
};

_LIBCPP_END_NAMESPACE_STD

#endif // _LIBCPP_STD_VER > 11
#endif // _LIBCPP_EXPERIMENTAL_PROPAGATE_CONST
