// -*- 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 <__assert> // all public C++ headers provide the assertion handler
#include <__functional/operations.h>
#include <__utility/forward.h>
#include <__utility/move.h>
#include <__utility/swap.h>
#include <experimental/__config>
#include <type_traits>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#  pragma GCC system_header
#endif

#if _LIBCPP_STD_VER > 11

_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
