| //===----------------------------------------------------------------------===// |
| // |
| // 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: !stdlib=libc++ && (c++03 || c++11 || c++14) |
| |
| // <string_view> |
| |
| // template<class charT, class traits> |
| // constexpr bool operator>(basic_string_view<charT, traits> lhs, basic_string_view<charT, traits> rhs); |
| // (plus "sufficient additional overloads" to make implicit conversions work as intended) |
| |
| #include <string_view> |
| #include <cassert> |
| #include <string> |
| |
| #include "test_macros.h" |
| #include "constexpr_char_traits.h" |
| #include "make_string.h" |
| |
| template <class T> |
| struct ConvertibleTo { |
| T t_; |
| TEST_CONSTEXPR explicit ConvertibleTo(T t) : t_(t) {} |
| TEST_CONSTEXPR operator T() const { return t_; } |
| }; |
| |
| template <class SV> |
| TEST_CONSTEXPR_CXX14 bool test() { |
| typedef typename SV::value_type CharT; |
| typedef typename SV::traits_type Traits; |
| |
| // Test the behavior of the operator, both with and without implicit conversions. |
| SV v[] = { |
| SV(MAKE_CSTRING(CharT, "")), |
| SV(MAKE_CSTRING(CharT, "abc")), |
| SV(MAKE_CSTRING(CharT, "abcdef")), |
| SV(MAKE_CSTRING(CharT, "acb")), |
| }; |
| for (int i = 0; i < 4; ++i) { |
| for (int j = 0; j < 4; ++j) { |
| // See http://eel.is/c++draft/string.view#tab:string.view.comparison.overloads |
| bool expected = (i > j); |
| assert((v[i] > v[j]) == expected); |
| assert((v[i].data() > v[j]) == expected); |
| assert((v[i] > v[j].data()) == expected); |
| assert((ConvertibleTo<SV>(v[i]) > v[j]) == expected); |
| assert((v[i] > ConvertibleTo<SV>(v[j])) == expected); |
| |
| if (TEST_STD_AT_LEAST_20_OR_RUNTIME_EVALUATED) { |
| assert((std::basic_string<CharT, Traits>(v[i]) > v[j]) == expected); |
| assert((v[i] > std::basic_string<CharT, Traits>(v[j])) == expected); |
| } |
| } |
| } |
| |
| // Test its behavior with embedded null bytes. |
| SV abc = SV(MAKE_CSTRING(CharT, "abc")); |
| SV abc0def = SV(MAKE_CSTRING(CharT, "abc\0def"), 7); |
| SV abcdef = SV(MAKE_CSTRING(CharT, "abcdef")); |
| assert((abc > abc0def) == false); |
| assert((abc > abcdef) == false); |
| assert((abc0def > abc) == true); |
| assert((abc0def > abcdef) == false); |
| assert((abcdef > abc) == true); |
| assert((abcdef > abc0def) == true); |
| |
| assert((abc.data() > abc0def) == false); |
| assert((abc0def > abc.data()) == true); |
| |
| if (TEST_STD_AT_LEAST_20_OR_RUNTIME_EVALUATED) { |
| assert((std::basic_string<CharT, Traits>(abc) > abc0def) == false); |
| assert((abc0def > std::basic_string<CharT, Traits>(abc)) == true); |
| } |
| |
| return true; |
| } |
| |
| int main(int, char**) { |
| test<std::string_view>(); |
| #ifndef TEST_HAS_NO_WIDE_CHARACTERS |
| test<std::wstring_view>(); |
| #endif |
| #if TEST_STD_VER >= 11 |
| test<std::u16string_view>(); |
| test<std::u32string_view>(); |
| #endif |
| #if TEST_STD_VER > 14 |
| static_assert(test<std::string_view>(), ""); |
| # ifndef TEST_HAS_NO_WIDE_CHARACTERS |
| static_assert(test<std::wstring_view>(), ""); |
| # endif |
| static_assert(test<std::u16string_view>(), ""); |
| static_assert(test<std::u32string_view>(), ""); |
| #endif |
| |
| #if TEST_STD_VER > 11 |
| test<std::basic_string_view<char, constexpr_char_traits<char>>>(); |
| static_assert(test<std::basic_string_view<char, constexpr_char_traits<char>>>(), ""); |
| #endif |
| |
| #if TEST_STD_VER > 17 |
| test<std::u8string_view>(); |
| static_assert(test<std::u8string_view>()); |
| #endif |
| |
| return 0; |
| } |