// This file is part of Desktop App Toolkit, // a set of libraries for developing nice desktop applications. // // For license and copyright information please follow this link: // https://github.com/desktop-app/legal/blob/master/LEGAL // #pragma once #include #include #include #include #if !defined(__apple_build_version__) || (__apple_build_version__ > 12000032) template [[nodiscard]] inline std::strong_ordering operator<=>( const gsl::not_null

&a, const gsl::not_null

&b) noexcept { return a.get() <=> b.get(); } #if QT_VERSION < QT_VERSION_CHECK(6, 8, 0) || !defined __cpp_lib_three_way_comparison [[nodiscard]] inline std::strong_ordering operator<=>( const QString &a, const QString &b) noexcept { return a.compare(b) <=> 0; } #endif // Qt < 6.8.0 || !__cpp_lib_three_way_comparison template [[nodiscard]] inline std::strong_ordering operator<=>( const QVector &a, const QVector &b) noexcept { const auto as = a.size(); const auto bs = b.size(); const auto s = int(std::min(as, bs)); for (auto i = 0; i != s; ++i) { const auto result = (a[i] <=> b[i]); if (result != std::strong_ordering::equal && result != std::strong_ordering::equivalent) { return result; } } return (as <=> bs); } #ifndef _MSC_VER namespace base::details { template using compare_three_way_result_t = decltype( (std::declval&>() <=> std::declval&>())); template using variant_compare_result = std::common_comparison_category_t< compare_three_way_result_t...>; template constexpr variant_compare_result variant_comparator( const std::variant &a, const std::variant &b, int index) { if (index == Index) { return *std::get_if(&a) <=> *std::get_if(&b); } else if constexpr (Index + 1 < sizeof...(Types)) { return variant_comparator(a, b, index); } else { Unexpected("Index value in variant_comparator."); } } } // namespace base::details template inline constexpr auto operator<=>( const std::variant &a, const std::variant &b) -> base::details::variant_compare_result { const auto index = a.index(); if (const auto result = (index <=> b.index()) ; result != std::strong_ordering::equal) { return result; } return base::details::variant_comparator<0>(a, b, index); } template () <=> std::declval())> inline constexpr auto operator<=>( const std::vector &a, const std::vector &b) -> Result { const auto asize = a.size(); const auto bsize = b.size(); const auto min = std::min(asize, bsize); for (auto i = std::size_t(); i != min; ++i) { const auto result = (a[i] <=> b[i]); if (result != Result::equivalent) { return result; } } if (asize < bsize) { return Result::less; } else if (asize > bsize) { return Result::greater; } return Result::equivalent; } #endif // _MSC_VER #endif // __apple_build_version__