Pastebin
API
tools
faq
paste
Login
Sign up
Please fix the following errors:
New Paste
Syntax Highlighting
diff --git a/libcxx/include/compare b/libcxx/include/compare index 4282a1e5fa80..c9d5e10db60e 100644 --- a/libcxx/include/compare +++ b/libcxx/include/compare @@ -1,143 +1,139 @@ // -*- C++ -*- //===-------------------------- compare -----------------------------------===// // // 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_COMPARE #define _LIBCPP_COMPARE /* compare synopsis namespace std { // [cmp.categories], comparison category types class partial_ordering; class weak_ordering; class strong_ordering; // named comparison functions - constexpr bool is_eq (partial_ordering cmp) noexcept { return cmp == 0; } - constexpr bool is_neq (partial_ordering cmp) noexcept { return cmp != 0; } constexpr bool is_lt (partial_ordering cmp) noexcept { return cmp < 0; } constexpr bool is_lteq(partial_ordering cmp) noexcept { return cmp <= 0; } constexpr bool is_gt (partial_ordering cmp) noexcept { return cmp > 0; } constexpr bool is_gteq(partial_ordering cmp) noexcept { return cmp >= 0; } // [cmp.common], common comparison category type template<class... Ts> struct common_comparison_category { using type = see below; }; template<class... Ts> using common_comparison_category_t = typename common_comparison_category<Ts...>::type; // [cmp.alg], comparison algorithms template<class T> constexpr strong_ordering strong_order(const T& a, const T& b); template<class T> constexpr weak_ordering weak_order(const T& a, const T& b); template<class T> constexpr partial_ordering partial_order(const T& a, const T& b); - template<class T> constexpr strong_equality strong_equal(const T& a, const T& b); - template<class T> constexpr weak_equality weak_equal(const T& a, const T& b); // [cmp.partialord], Class partial_ordering class partial_ordering { public: // valid values static const partial_ordering less; static const partial_ordering equivalent; static const partial_ordering greater; static const partial_ordering unordered; // comparisons friend constexpr bool operator==(partial_ordering v, unspecified) noexcept; friend constexpr bool operator==(partial_ordering v, partial_ordering w) noexcept = default; friend constexpr bool operator< (partial_ordering v, unspecified) noexcept; friend constexpr bool operator> (partial_ordering v, unspecified) noexcept; friend constexpr bool operator<=(partial_ordering v, unspecified) noexcept; friend constexpr bool operator>=(partial_ordering v, unspecified) noexcept; friend constexpr bool operator< (unspecified, partial_ordering v) noexcept; friend constexpr bool operator> (unspecified, partial_ordering v) noexcept; friend constexpr bool operator<=(unspecified, partial_ordering v) noexcept; friend constexpr bool operator>=(unspecified, partial_ordering v) noexcept; friend constexpr partial_ordering operator<=>(partial_ordering v, unspecified) noexcept; friend constexpr partial_ordering operator<=>(unspecified, partial_ordering v) noexcept; }; // [cmp.weakord], Class weak_ordering class weak_ordering { public: // valid values static const weak_ordering less; static const weak_ordering equivalent; static const weak_ordering greater; // conversions constexpr operator partial_ordering() const noexcept; // comparisons friend constexpr bool operator==(weak_ordering v, unspecified) noexcept; friend constexpr bool operator==(weak_ordering v, weak_ordering w) noexcept = default; friend constexpr bool operator< (weak_ordering v, unspecified) noexcept; friend constexpr bool operator> (weak_ordering v, unspecified) noexcept; friend constexpr bool operator<=(weak_ordering v, unspecified) noexcept; friend constexpr bool operator>=(weak_ordering v, unspecified) noexcept; friend constexpr bool operator< (unspecified, weak_ordering v) noexcept; friend constexpr bool operator> (unspecified, weak_ordering v) noexcept; friend constexpr bool operator<=(unspecified, weak_ordering v) noexcept; friend constexpr bool operator>=(unspecified, weak_ordering v) noexcept; friend constexpr weak_ordering operator<=>(weak_ordering v, unspecified) noexcept; friend constexpr weak_ordering operator<=>(unspecified, weak_ordering v) noexcept; }; // [cmp.strongord], Class strong_ordering class strong_ordering { public: // valid values static const strong_ordering less; static const strong_ordering equal; static const strong_ordering equivalent; static const strong_ordering greater; // conversions constexpr operator partial_ordering() const noexcept; constexpr operator weak_ordering() const noexcept; // comparisons friend constexpr bool operator==(strong_ordering v, unspecified) noexcept; friend constexpr bool operator==(strong_ordering v, strong_ordering w) noexcept = default; friend constexpr bool operator< (strong_ordering v, unspecified) noexcept; friend constexpr bool operator> (strong_ordering v, unspecified) noexcept; friend constexpr bool operator<=(strong_ordering v, unspecified) noexcept; friend constexpr bool operator>=(strong_ordering v, unspecified) noexcept; friend constexpr bool operator< (unspecified, strong_ordering v) noexcept; friend constexpr bool operator> (unspecified, strong_ordering v) noexcept; friend constexpr bool operator<=(unspecified, strong_ordering v) noexcept; friend constexpr bool operator>=(unspecified, strong_ordering v) noexcept; friend constexpr strong_ordering operator<=>(strong_ordering v, unspecified) noexcept; friend constexpr strong_ordering operator<=>(unspecified, strong_ordering v) noexcept; }; } */ #include <__config> #include <type_traits> #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER #pragma GCC system_header #endif _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER > 17 // exposition only enum class _LIBCPP_ENUM_VIS _EqResult : unsigned char { __zero = 0, __equal = __zero, __equiv = __equal, __nonequal = 1, __nonequiv = __nonequal }; @@ -192,407 +188,403 @@ public: _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (partial_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(partial_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(_CmpUnspecifiedParam, partial_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(_CmpUnspecifiedParam, partial_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (_CmpUnspecifiedParam, partial_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(_CmpUnspecifiedParam, partial_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (_CmpUnspecifiedParam, partial_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(_CmpUnspecifiedParam, partial_ordering __v) noexcept; #ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(partial_ordering, partial_ordering) noexcept = default; _LIBCPP_INLINE_VISIBILITY friend constexpr partial_ordering operator<=>(partial_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr partial_ordering operator<=>(_CmpUnspecifiedParam, partial_ordering __v) noexcept; #endif private: _ValueT __value_; }; _LIBCPP_INLINE_VAR constexpr partial_ordering partial_ordering::less(_OrdResult::__less); _LIBCPP_INLINE_VAR constexpr partial_ordering partial_ordering::equivalent(_EqResult::__equiv); _LIBCPP_INLINE_VAR constexpr partial_ordering partial_ordering::greater(_OrdResult::__greater); _LIBCPP_INLINE_VAR constexpr partial_ordering partial_ordering::unordered(_NCmpResult ::__unordered); _LIBCPP_INLINE_VISIBILITY constexpr bool operator==(partial_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__is_ordered() && __v.__value_ == 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator< (partial_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__is_ordered() && __v.__value_ < 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator<=(partial_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__is_ordered() && __v.__value_ <= 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator> (partial_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__is_ordered() && __v.__value_ > 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator>=(partial_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__is_ordered() && __v.__value_ >= 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator==(_CmpUnspecifiedParam, partial_ordering __v) noexcept { return __v.__is_ordered() && 0 == __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator< (_CmpUnspecifiedParam, partial_ordering __v) noexcept { return __v.__is_ordered() && 0 < __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator<=(_CmpUnspecifiedParam, partial_ordering __v) noexcept { return __v.__is_ordered() && 0 <= __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator> (_CmpUnspecifiedParam, partial_ordering __v) noexcept { return __v.__is_ordered() && 0 > __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator>=(_CmpUnspecifiedParam, partial_ordering __v) noexcept { return __v.__is_ordered() && 0 >= __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator!=(partial_ordering __v, _CmpUnspecifiedParam) noexcept { return !__v.__is_ordered() || __v.__value_ != 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator!=(_CmpUnspecifiedParam, partial_ordering __v) noexcept { return !__v.__is_ordered() || __v.__value_ != 0; } #ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR _LIBCPP_INLINE_VISIBILITY constexpr partial_ordering operator<=>(partial_ordering __v, _CmpUnspecifiedParam) noexcept { return __v; } _LIBCPP_INLINE_VISIBILITY constexpr partial_ordering operator<=>(_CmpUnspecifiedParam, partial_ordering __v) noexcept { return __v < 0 ? partial_ordering::greater : (__v > 0 ? partial_ordering::less : __v); } #endif // _LIBCPP_HAS_NO_SPACESHIP_OPERATOR class weak_ordering { using _ValueT = signed char; _LIBCPP_INLINE_VISIBILITY explicit constexpr weak_ordering(_EqResult __v) noexcept : __value_(_ValueT(__v)) {} _LIBCPP_INLINE_VISIBILITY explicit constexpr weak_ordering(_OrdResult __v) noexcept : __value_(_ValueT(__v)) {} public: static const weak_ordering less; static const weak_ordering equivalent; static const weak_ordering greater; - // conversions _LIBCPP_INLINE_VISIBILITY constexpr operator partial_ordering() const noexcept { return __value_ == 0 ? partial_ordering::equivalent : (__value_ < 0 ? partial_ordering::less : partial_ordering::greater); } // comparisons _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(weak_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(weak_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (weak_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(weak_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (weak_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(weak_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(_CmpUnspecifiedParam, weak_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(_CmpUnspecifiedParam, weak_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (_CmpUnspecifiedParam, weak_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(_CmpUnspecifiedParam, weak_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (_CmpUnspecifiedParam, weak_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(_CmpUnspecifiedParam, weak_ordering __v) noexcept; #ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(weak_ordering, weak_ordering) noexcept = default; _LIBCPP_INLINE_VISIBILITY friend constexpr weak_ordering operator<=>(weak_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr weak_ordering operator<=>(_CmpUnspecifiedParam, weak_ordering __v) noexcept; #endif private: _ValueT __value_; }; _LIBCPP_INLINE_VAR constexpr weak_ordering weak_ordering::less(_OrdResult::__less); _LIBCPP_INLINE_VAR constexpr weak_ordering weak_ordering::equivalent(_EqResult::__equiv); _LIBCPP_INLINE_VAR constexpr weak_ordering weak_ordering::greater(_OrdResult::__greater); _LIBCPP_INLINE_VISIBILITY constexpr bool operator==(weak_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ == 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator!=(weak_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ != 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator< (weak_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ < 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator<=(weak_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ <= 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator> (weak_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ > 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator>=(weak_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ >= 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator==(_CmpUnspecifiedParam, weak_ordering __v) noexcept { return 0 == __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator!=(_CmpUnspecifiedParam, weak_ordering __v) noexcept { return 0 != __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator< (_CmpUnspecifiedParam, weak_ordering __v) noexcept { return 0 < __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator<=(_CmpUnspecifiedParam, weak_ordering __v) noexcept { return 0 <= __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator> (_CmpUnspecifiedParam, weak_ordering __v) noexcept { return 0 > __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator>=(_CmpUnspecifiedParam, weak_ordering __v) noexcept { return 0 >= __v.__value_; } #ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR _LIBCPP_INLINE_VISIBILITY constexpr weak_ordering operator<=>(weak_ordering __v, _CmpUnspecifiedParam) noexcept { return __v; } _LIBCPP_INLINE_VISIBILITY constexpr weak_ordering operator<=>(_CmpUnspecifiedParam, weak_ordering __v) noexcept { return __v < 0 ? weak_ordering::greater : (__v > 0 ? weak_ordering::less : __v); } #endif // _LIBCPP_HAS_NO_SPACESHIP_OPERATOR class strong_ordering { using _ValueT = signed char; _LIBCPP_INLINE_VISIBILITY explicit constexpr strong_ordering(_EqResult __v) noexcept : __value_(_ValueT(__v)) {} _LIBCPP_INLINE_VISIBILITY explicit constexpr strong_ordering(_OrdResult __v) noexcept : __value_(_ValueT(__v)) {} public: static const strong_ordering less; static const strong_ordering equal; static const strong_ordering equivalent; static const strong_ordering greater; - // conversions _LIBCPP_INLINE_VISIBILITY constexpr operator partial_ordering() const noexcept { return __value_ == 0 ? partial_ordering::equivalent : (__value_ < 0 ? partial_ordering::less : partial_ordering::greater); } _LIBCPP_INLINE_VISIBILITY constexpr operator weak_ordering() const noexcept { return __value_ == 0 ? weak_ordering::equivalent : (__value_ < 0 ? weak_ordering::less : weak_ordering::greater); } // comparisons _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(strong_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(strong_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (strong_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(strong_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (strong_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(strong_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(_CmpUnspecifiedParam, strong_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator!=(_CmpUnspecifiedParam, strong_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator< (_CmpUnspecifiedParam, strong_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator<=(_CmpUnspecifiedParam, strong_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator> (_CmpUnspecifiedParam, strong_ordering __v) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator>=(_CmpUnspecifiedParam, strong_ordering __v) noexcept; #ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR _LIBCPP_INLINE_VISIBILITY friend constexpr bool operator==(strong_ordering, strong_ordering) noexcept = default; _LIBCPP_INLINE_VISIBILITY friend constexpr strong_ordering operator<=>(strong_ordering __v, _CmpUnspecifiedParam) noexcept; _LIBCPP_INLINE_VISIBILITY friend constexpr strong_ordering operator<=>(_CmpUnspecifiedParam, strong_ordering __v) noexcept; #endif private: _ValueT __value_; }; _LIBCPP_INLINE_VAR constexpr strong_ordering strong_ordering::less(_OrdResult::__less); _LIBCPP_INLINE_VAR constexpr strong_ordering strong_ordering::equal(_EqResult::__equal); _LIBCPP_INLINE_VAR constexpr strong_ordering strong_ordering::equivalent(_EqResult::__equiv); _LIBCPP_INLINE_VAR constexpr strong_ordering strong_ordering::greater(_OrdResult::__greater); _LIBCPP_INLINE_VISIBILITY constexpr bool operator==(strong_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ == 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator!=(strong_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ != 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator< (strong_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ < 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator<=(strong_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ <= 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator> (strong_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ > 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator>=(strong_ordering __v, _CmpUnspecifiedParam) noexcept { return __v.__value_ >= 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator==(_CmpUnspecifiedParam, strong_ordering __v) noexcept { return 0 == __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator!=(_CmpUnspecifiedParam, strong_ordering __v) noexcept { return 0 != __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator< (_CmpUnspecifiedParam, strong_ordering __v) noexcept { return 0 < __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator<=(_CmpUnspecifiedParam, strong_ordering __v) noexcept { return 0 <= __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator> (_CmpUnspecifiedParam, strong_ordering __v) noexcept { return 0 > __v.__value_; } _LIBCPP_INLINE_VISIBILITY constexpr bool operator>=(_CmpUnspecifiedParam, strong_ordering __v) noexcept { return 0 >= __v.__value_; } #ifndef _LIBCPP_HAS_NO_SPACESHIP_OPERATOR _LIBCPP_INLINE_VISIBILITY constexpr strong_ordering operator<=>(strong_ordering __v, _CmpUnspecifiedParam) noexcept { return __v; } _LIBCPP_INLINE_VISIBILITY constexpr strong_ordering operator<=>(_CmpUnspecifiedParam, strong_ordering __v) noexcept { return __v < 0 ? strong_ordering::greater : (__v > 0 ? strong_ordering::less : __v); } #endif // _LIBCPP_HAS_NO_SPACESHIP_OPERATOR // named comparison functions -_LIBCPP_INLINE_VISIBILITY -constexpr bool is_eq(partial_ordering __cmp) noexcept { return __cmp == 0; } - -_LIBCPP_INLINE_VISIBILITY -constexpr bool is_neq(partial_ordering __cmp) noexcept { return __cmp != 0; } - _LIBCPP_INLINE_VISIBILITY constexpr bool is_lt(partial_ordering __cmp) noexcept { return __cmp < 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool is_lteq(partial_ordering __cmp) noexcept { return __cmp <= 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool is_gt(partial_ordering __cmp) noexcept { return __cmp > 0; } _LIBCPP_INLINE_VISIBILITY constexpr bool is_gteq(partial_ordering __cmp) noexcept { return __cmp >= 0; } namespace __comp_detail { enum _ClassifyCompCategory : unsigned{ _None, + _WeakEq, + _StrongEq, _PartialOrd, _WeakOrd, _StrongOrd, _CCC_Size }; template <class _Tp> _LIBCPP_INLINE_VISIBILITY constexpr _ClassifyCompCategory __type_to_enum() noexcept { if (is_same_v<_Tp, partial_ordering>) return _PartialOrd; if (is_same_v<_Tp, weak_ordering>) return _WeakOrd; if (is_same_v<_Tp, strong_ordering>) return _StrongOrd; return _None; } template <size_t _Size> constexpr _ClassifyCompCategory __compute_comp_type(const _ClassifyCompCategory (&__types)[_Size]) { int __seen[_CCC_Size] = {}; for (auto __type : __types) ++__seen[__type]; if (__seen[_None]) return _None; + if (__seen[_WeakEq]) + return _WeakEq; + if (__seen[_StrongEq] && (__seen[_PartialOrd] || __seen[_WeakOrd])) + return _WeakEq; + if (__seen[_StrongEq]) + return _StrongEq; if (__seen[_PartialOrd]) return _PartialOrd; if (__seen[_WeakOrd]) return _WeakOrd; return _StrongOrd; } template <class ..._Ts> constexpr auto __get_comp_type() { using _CCC = _ClassifyCompCategory; constexpr _CCC __type_kinds[] = {_StrongOrd, __type_to_enum<_Ts>()...}; constexpr _CCC _Cat = __compute_comp_type(__type_kinds); - if constexpr (_Cat == _None) - return void(); - else if constexpr (_Cat == _PartialOrd) + if constexpr (_Cat == _PartialOrd) return partial_ordering::equivalent; else if constexpr (_Cat == _WeakOrd) return weak_ordering::equivalent; - else if constexpr (_Cat == _StrongOrd) - return strong_ordering::equivalent; else - static_assert(_Cat != _Cat, "unhandled case"); + return strong_ordering::equivalent; } } // namespace __comp_detail // [cmp.common], common comparison category type template<class... _Ts> struct _LIBCPP_TEMPLATE_VIS common_comparison_category { using type = decltype(__comp_detail::__get_comp_type<_Ts...>()); }; template<class... _Ts> using common_comparison_category_t = typename common_comparison_category<_Ts...>::type; // [cmp.alg], comparison algorithms // TODO: unimplemented template<class _Tp> constexpr strong_ordering strong_order(const _Tp& __lhs, const _Tp& __rhs); template<class _Tp> constexpr weak_ordering weak_order(const _Tp& __lhs, const _Tp& __rhs); template<class _Tp> constexpr partial_ordering partial_order(const _Tp& __lhs, const _Tp& __rhs); #endif // _LIBCPP_STD_VER > 17 _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP_COMPARE diff --git a/libcxx/test/std/language.support/cmp/cmp.common/common_comparison_category.pass.cpp b/libcxx/test/std/language.support/cmp/cmp.common/common_comparison_category.pass.cpp index 70ee429685b7..3e1f43a069a6 100644 --- a/libcxx/test/std/language.support/cmp/cmp.common/common_comparison_category.pass.cpp +++ b/libcxx/test/std/language.support/cmp/cmp.common/common_comparison_category.pass.cpp @@ -1,75 +1,65 @@ //===----------------------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // <compare> // template <class ...Ts> struct common_comparison_category // template <class ...Ts> using common_comparison_category_t #include <compare> #include <type_traits> #include <cassert> #include "test_macros.h" const volatile void* volatile sink; template <class Expect, class ...Args> void test_cat() { using Cat = std::common_comparison_category<Args...>; using CatT = typename Cat::type; static_assert(std::is_same<CatT, std::common_comparison_category_t<Args...>>::value, ""); static_assert(std::is_same<CatT, Expect>::value, "expected different category"); }; // [class.spaceship]p4: The 'common comparison type' U of a possibly-empty list // of 'n' types T0, T1, ..., TN, is defined as follows: int main(int, char**) { using PO = std::partial_ordering; using WO = std::weak_ordering; using SO = std::strong_ordering; - // [class.spaceship]p4.1: If any Ti is not a comparison category tpe, U is void. - { - test_cat<void, void>(); - test_cat<void, int*>(); - test_cat<void, SO&>(); - test_cat<void, SO const>(); - test_cat<void, SO*>(); - test_cat<void, SO, void, SO>(); - } - - // [class.spaceship]p4.2: Otherwise, if at least one Ti is std::partial_ordering, - // U is std::partial_ordering + // [class.spaceship]p4.1: If at least one Ti is std::partial_ordering, U is + // std::partial_ordering ([cmp.partialord]). { test_cat<PO, PO>(); test_cat<PO, SO, PO, SO>(); test_cat<PO, WO, PO, SO>(); } - // [class.spaceship]p4.3: Otherwise, if at least one Ti is std::weak_ordering, + // [class.spaceship]p4.2: Otherwise, if at least one Ti is std::weak_ordering, // U is std::weak_ordering { test_cat<WO, WO>(); test_cat<WO, SO, WO, SO>(); } - // [class.spaceship]p4.4: Otherwise, U is std::strong_ordering. [Note: in + // [class.spaceship]p4.3: Otherwise, U is std::strong_ordering. [Note: in // particular this is the result when n is 0. -- end note] { test_cat<SO>(); // empty type list test_cat<SO, SO>(); test_cat<SO, SO, SO>(); } return 0; } diff --git a/libcxx/test/std/language.support/cmp/cmp.strongeq/cmp.strongeq.pass.cpp b/libcxx/test/std/language.support/cmp/cmp.strongeq/cmp.strongeq.pass.cpp deleted file mode 100644 index 368a1a436936..000000000000 --- a/libcxx/test/std/language.support/cmp/cmp.strongeq/cmp.strongeq.pass.cpp +++ /dev/null @@ -1,97 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++03, c++11, c++14, c++17 - -// <compare> - -// class strong_equality - - -#include <compare> -#include <type_traits> -#include <cassert> - -#include "test_macros.h" - -const volatile void* volatile sink; - -void test_static_members() { - DoNotOptimize(&std::strong_equality::equal); - DoNotOptimize(&std::strong_equality::nonequal); - DoNotOptimize(&std::strong_equality::equivalent); - DoNotOptimize(&std::strong_equality::nonequivalent); -} - -void test_signatures() { - auto& Eq = std::strong_equality::equivalent; - - ASSERT_NOEXCEPT(Eq == 0); - ASSERT_NOEXCEPT(0 == Eq); - ASSERT_NOEXCEPT(Eq != 0); - ASSERT_NOEXCEPT(0 != Eq); -#ifndef TEST_HAS_NO_SPACESHIP_OPERATOR - ASSERT_NOEXCEPT(0 <=> Eq); - ASSERT_NOEXCEPT(Eq <=> 0); - ASSERT_SAME_TYPE(decltype(Eq <=> 0), std::strong_equality); - ASSERT_SAME_TYPE(decltype(0 <=> Eq), std::strong_equality); -#endif -} - -void test_conversion() { - constexpr std::weak_equality res = std::strong_equality::equivalent; - static_assert(res == 0, ""); - static_assert(std::is_convertible<const std::strong_equality&, - std::weak_equality>::value, ""); - static_assert(res == 0, "expected equal"); - - constexpr std::weak_equality neq_res = std::strong_equality::nonequivalent; - static_assert(neq_res != 0, "expected not equal"); -} - -constexpr bool test_constexpr() { - auto& Eq = std::strong_equality::equal; - auto& NEq = std::strong_equality::nonequal; - auto& Equiv = std::strong_equality::equivalent; - auto& NEquiv = std::strong_equality::nonequivalent; - assert((Eq == 0) == true); - assert((0 == Eq) == true); - assert((Equiv == 0) == true); - assert((0 == Equiv) == true); - assert((NEq == 0) == false); - assert((0 == NEq) == false); - assert((NEquiv == 0) == false); - assert((0 == NEquiv) == false); - - assert((Eq != 0) == false); - assert((0 != Eq) == false); - assert((Equiv != 0) == false); - assert((0 != Equiv) == false); - assert((NEq != 0) == true); - assert((0 != NEq) == true); - assert((NEquiv != 0) == true); - assert((0 != NEquiv) == true); - -#ifndef TEST_HAS_NO_SPACESHIP_OPERATOR - std::strong_equality res = (Eq <=> 0); - ((void)res); - res = (0 <=> Eq); - ((void)res); -#endif - - return true; -} - -int main(int, char**) { - test_static_members(); - test_signatures(); - test_conversion(); - static_assert(test_constexpr(), "constexpr test failed"); - - return 0; -} diff --git a/libcxx/test/std/language.support/cmp/cmp.weakeq/cmp.weakeq.pass.cpp b/libcxx/test/std/language.support/cmp/cmp.weakeq/cmp.weakeq.pass.cpp deleted file mode 100644 index 0d947ec53212..000000000000 --- a/libcxx/test/std/language.support/cmp/cmp.weakeq/cmp.weakeq.pass.cpp +++ /dev/null @@ -1,71 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++03, c++11, c++14, c++17 - -// <compare> - -// class weak_equality - - -#include <compare> -#include <cassert> -#include "test_macros.h" - -const volatile void* volatile sink; - -void test_static_members() { - DoNotOptimize(&std::weak_equality::equivalent); - DoNotOptimize(&std::weak_equality::nonequivalent); -} - -void test_signatures() { - auto& Eq = std::weak_equality::equivalent; - - ASSERT_NOEXCEPT(Eq == 0); - ASSERT_NOEXCEPT(0 == Eq); - ASSERT_NOEXCEPT(Eq != 0); - ASSERT_NOEXCEPT(0 != Eq); -#ifndef TEST_HAS_NO_SPACESHIP_OPERATOR - ASSERT_NOEXCEPT(0 <=> Eq); - ASSERT_NOEXCEPT(Eq <=> 0); - ASSERT_SAME_TYPE(decltype(Eq <=> 0), std::weak_equality); - ASSERT_SAME_TYPE(decltype(0 <=> Eq), std::weak_equality); -#endif -} - -constexpr bool test_constexpr() { - auto& Eq = std::weak_equality::equivalent; - auto& NEq = std::weak_equality::nonequivalent; - assert((Eq == 0) == true); - assert((0 == Eq) == true); - assert((NEq == 0) == false); - assert((0 == NEq) == false); - - assert((Eq != 0) == false); - assert((0 != Eq) == false); - assert((NEq != 0) == true); - assert((0 != NEq) == true); - -#ifndef TEST_HAS_NO_SPACESHIP_OPERATOR - std::weak_equality res = (Eq <=> 0); - ((void)res); - res = (0 <=> Eq); - ((void)res); -#endif - - return true; -} - -int main(int, char**) { - test_static_members(); - test_signatures(); - static_assert(test_constexpr(), "constexpr test failed"); - - return 0; -}
Optional Paste Settings
Category:
None
Cryptocurrency
Cybersecurity
Fixit
Food
Gaming
Haiku
Help
History
Housing
Jokes
Legal
Money
Movies
Music
Pets
Photo
Science
Software
Source Code
Spirit
Sports
Travel
TV
Writing
Tags:
Syntax Highlighting:
None
Bash
C
C#
C++
CSS
HTML
JSON
Java
JavaScript
Lua
Markdown (PRO members only)
Objective C
PHP
Perl
Python
Ruby
Swift
4CS
6502 ACME Cross Assembler
6502 Kick Assembler
6502 TASM/64TASS
ABAP
AIMMS
ALGOL 68
APT Sources
ARM
ASM (NASM)
ASP
ActionScript
ActionScript 3
Ada
Apache Log
AppleScript
Arduino
Asymptote
AutoIt
Autohotkey
Avisynth
Awk
BASCOM AVR
BNF
BOO
Bash
Basic4GL
Batch
BibTeX
Blitz Basic
Blitz3D
BlitzMax
BrainFuck
C
C (WinAPI)
C Intermediate Language
C for Macs
C#
C++
C++ (WinAPI)
C++ (with Qt extensions)
C: Loadrunner
CAD DCL
CAD Lisp
CFDG
CMake
COBOL
CSS
Ceylon
ChaiScript
Chapel
Clojure
Clone C
Clone C++
CoffeeScript
ColdFusion
Cuesheet
D
DCL
DCPU-16
DCS
DIV
DOT
Dart
Delphi
Delphi Prism (Oxygene)
Diff
E
ECMAScript
EPC
Easytrieve
Eiffel
Email
Erlang
Euphoria
F#
FO Language
Falcon
Filemaker
Formula One
Fortran
FreeBasic
FreeSWITCH
GAMBAS
GDB
GDScript
Game Maker
Genero
Genie
GetText
Go
Godot GLSL
Groovy
GwBasic
HQ9 Plus
HTML
HTML 5
Haskell
Haxe
HicEst
IDL
INI file
INTERCAL
IO
ISPF Panel Definition
Icon
Inno Script
J
JCL
JSON
Java
Java 5
JavaScript
Julia
KSP (Kontakt Script)
KiXtart
Kotlin
LDIF
LLVM
LOL Code
LScript
Latex
Liberty BASIC
Linden Scripting
Lisp
Loco Basic
Logtalk
Lotus Formulas
Lotus Script
Lua
M68000 Assembler
MIX Assembler
MK-61/52
MPASM
MXML
MagikSF
Make
MapBasic
Markdown (PRO members only)
MatLab
Mercury
MetaPost
Modula 2
Modula 3
Motorola 68000 HiSoft Dev
MySQL
Nagios
NetRexx
Nginx
Nim
NullSoft Installer
OCaml
OCaml Brief
Oberon 2
Objeck Programming Langua
Objective C
Octave
Open Object Rexx
OpenBSD PACKET FILTER
OpenGL Shading
Openoffice BASIC
Oracle 11
Oracle 8
Oz
PARI/GP
PCRE
PHP
PHP Brief
PL/I
PL/SQL
POV-Ray
ParaSail
Pascal
Pawn
Per
Perl
Perl 6
Phix
Pic 16
Pike
Pixel Bender
PostScript
PostgreSQL
PowerBuilder
PowerShell
ProFTPd
Progress
Prolog
Properties
ProvideX
Puppet
PureBasic
PyCon
Python
Python for S60
QBasic
QML
R
RBScript
REBOL
REG
RPM Spec
Racket
Rails
Rexx
Robots
Roff Manpage
Ruby
Ruby Gnuplot
Rust
SAS
SCL
SPARK
SPARQL
SQF
SQL
SSH Config
Scala
Scheme
Scilab
SdlBasic
Smalltalk
Smarty
StandardML
StoneScript
SuperCollider
Swift
SystemVerilog
T-SQL
TCL
TeXgraph
Tera Term
TypeScript
TypoScript
UPC
Unicon
UnrealScript
Urbi
VB.NET
VBScript
VHDL
VIM
Vala
Vedit
VeriLog
Visual Pro Log
VisualBasic
VisualFoxPro
WHOIS
WhiteSpace
Winbatch
XBasic
XML
XPP
Xojo
Xorg Config
YAML
YARA
Z80 Assembler
ZXBasic
autoconf
jQuery
mIRC
newLISP
q/kdb+
thinBasic
Paste Expiration:
Never
Burn after read
10 Minutes
1 Hour
1 Day
1 Week
2 Weeks
1 Month
6 Months
1 Year
Paste Exposure:
Public
Unlisted
Private
Folder:
(members only)
Password
NEW
Enabled
Disabled
Burn after read
NEW
Paste Name / Title:
Create New Paste
Hello
Guest
Sign Up
or
Login
Sign in with Facebook
Sign in with Twitter
Sign in with Google
You are currently not logged in, this means you can not edit or delete anything you paste.
Sign Up
or
Login
Public Pastes
Untitled
1 hour ago | 12.49 KB
Untitled
3 hours ago | 12.40 KB
programacion_algoritmos_flashcards.tsv
5 hours ago | 2.67 KB
Untitled
5 hours ago | 17.13 KB
Untitled
7 hours ago | 18.40 KB
Untitled
9 hours ago | 17.70 KB
Untitled
11 hours ago | 16.97 KB
Untitled
13 hours ago | 21.75 KB
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the
Cookies Policy
.
OK, I Understand
Not a member of Pastebin yet?
Sign Up
, it unlocks many cool features!