Fix LWG 2934 - optional<const T> doesn't compare with T
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@299105 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
108
include/optional
108
include/optional
@@ -921,14 +921,14 @@ private:
|
||||
};
|
||||
|
||||
// Comparisons between optionals
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator==(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
operator==(const optional<_Tp>& __x, const optional<_Up>& __y)
|
||||
{
|
||||
if (static_cast<bool>(__x) != static_cast<bool>(__y))
|
||||
return false;
|
||||
@@ -937,14 +937,14 @@ operator==(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
return *__x == *__y;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator!=(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
operator!=(const optional<_Tp>& __x, const optional<_Up>& __y)
|
||||
{
|
||||
if (static_cast<bool>(__x) != static_cast<bool>(__y))
|
||||
return true;
|
||||
@@ -953,14 +953,14 @@ operator!=(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
return *__x != *__y;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator<(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
operator<(const optional<_Tp>& __x, const optional<_Up>& __y)
|
||||
{
|
||||
if (!static_cast<bool>(__y))
|
||||
return false;
|
||||
@@ -969,14 +969,14 @@ operator<(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
return *__x < *__y;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator>(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
operator>(const optional<_Tp>& __x, const optional<_Up>& __y)
|
||||
{
|
||||
if (!static_cast<bool>(__x))
|
||||
return false;
|
||||
@@ -985,14 +985,14 @@ operator>(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
return *__x > *__y;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator<=(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
operator<=(const optional<_Tp>& __x, const optional<_Up>& __y)
|
||||
{
|
||||
if (!static_cast<bool>(__x))
|
||||
return true;
|
||||
@@ -1001,14 +1001,14 @@ operator<=(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
return *__x <= *__y;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator>=(const optional<_Tp>& __x, const optional<_Tp>& __y)
|
||||
operator>=(const optional<_Tp>& __x, const optional<_Up>& __y)
|
||||
{
|
||||
if (!static_cast<bool>(__y))
|
||||
return true;
|
||||
@@ -1115,146 +1115,146 @@ operator>=(nullopt_t, const optional<_Tp>& __x) noexcept
|
||||
}
|
||||
|
||||
// Comparisons with T
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator==(const optional<_Tp>& __x, const _Tp& __v)
|
||||
operator==(const optional<_Tp>& __x, const _Up& __v)
|
||||
{
|
||||
return static_cast<bool>(__x) ? *__x == __v : false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator==(const _Tp& __v, const optional<_Tp>& __x)
|
||||
operator==(const _Tp& __v, const optional<_Up>& __x)
|
||||
{
|
||||
return static_cast<bool>(__x) ? __v == *__x : false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator!=(const optional<_Tp>& __x, const _Tp& __v)
|
||||
operator!=(const optional<_Tp>& __x, const _Up& __v)
|
||||
{
|
||||
return static_cast<bool>(__x) ? *__x != __v : true;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator!=(const _Tp& __v, const optional<_Tp>& __x)
|
||||
operator!=(const _Tp& __v, const optional<_Up>& __x)
|
||||
{
|
||||
return static_cast<bool>(__x) ? __v != *__x : true;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator<(const optional<_Tp>& __x, const _Tp& __v)
|
||||
operator<(const optional<_Tp>& __x, const _Up& __v)
|
||||
{
|
||||
return static_cast<bool>(__x) ? *__x < __v : true;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator<(const _Tp& __v, const optional<_Tp>& __x)
|
||||
operator<(const _Tp& __v, const optional<_Up>& __x)
|
||||
{
|
||||
return static_cast<bool>(__x) ? __v < *__x : false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator<=(const optional<_Tp>& __x, const _Tp& __v)
|
||||
operator<=(const optional<_Tp>& __x, const _Up& __v)
|
||||
{
|
||||
return static_cast<bool>(__x) ? *__x <= __v : true;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator<=(const _Tp& __v, const optional<_Tp>& __x)
|
||||
operator<=(const _Tp& __v, const optional<_Up>& __x)
|
||||
{
|
||||
return static_cast<bool>(__x) ? __v <= *__x : false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator>(const optional<_Tp>& __x, const _Tp& __v)
|
||||
operator>(const optional<_Tp>& __x, const _Up& __v)
|
||||
{
|
||||
return static_cast<bool>(__x) ? *__x > __v : false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator>(const _Tp& __v, const optional<_Tp>& __x)
|
||||
operator>(const _Tp& __v, const optional<_Up>& __x)
|
||||
{
|
||||
return static_cast<bool>(__x) ? __v > *__x : true;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator>=(const optional<_Tp>& __x, const _Tp& __v)
|
||||
operator>=(const optional<_Tp>& __x, const _Up& __v)
|
||||
{
|
||||
return static_cast<bool>(__x) ? *__x >= __v : false;
|
||||
}
|
||||
|
||||
template <class _Tp>
|
||||
template <class _Tp, class _Up>
|
||||
_LIBCPP_INLINE_VISIBILITY constexpr
|
||||
enable_if_t<
|
||||
is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
|
||||
_VSTD::declval<const _Tp&>()), bool>,
|
||||
_VSTD::declval<const _Up&>()), bool>,
|
||||
bool
|
||||
>
|
||||
operator>=(const _Tp& __v, const optional<_Tp>& __x)
|
||||
operator>=(const _Tp& __v, const optional<_Up>& __x)
|
||||
{
|
||||
return static_cast<bool>(__x) ? __v >= *__x : true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user