//===----------------------------------------------------------------------===// // // 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) // // template // constexpr bool operator==(basic_string_view lhs, basic_string_view rhs); // (plus "sufficient additional overloads" to make implicit conversions work as intended) #include #include #include #include "test_macros.h" #include "constexpr_char_traits.h" #include "make_string.h" template struct ConvertibleTo { T t_; TEST_CONSTEXPR explicit ConvertibleTo(T t) : t_(t) {} TEST_CONSTEXPR operator T() const { return t_; } }; template 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(v[i]) == v[j]) == expected); assert((v[i] == ConvertibleTo(v[j])) == expected); if (TEST_STD_AT_LEAST_20_OR_RUNTIME_EVALUATED) { assert((std::basic_string(v[i]) == v[j]) == expected); assert((v[i] == std::basic_string(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) == false); assert((abc0def == abcdef) == false); assert((abcdef == abc) == false); assert((abcdef == abc0def) == false); assert((abc.data() == abc0def) == false); assert((abc0def == abc.data()) == false); if (TEST_STD_AT_LEAST_20_OR_RUNTIME_EVALUATED) { assert((std::basic_string(abc) == abc0def) == false); assert((abc0def == std::basic_string(abc)) == false); } return true; } int main(int, char**) { test(); #ifndef TEST_HAS_NO_WIDE_CHARACTERS test(); #endif #if TEST_STD_VER >= 11 test(); test(); #endif #if TEST_STD_VER > 14 static_assert(test(), ""); # ifndef TEST_HAS_NO_WIDE_CHARACTERS static_assert(test(), ""); # endif static_assert(test(), ""); static_assert(test(), ""); #endif #if TEST_STD_VER > 11 test>>(); static_assert(test>>(), ""); #endif #if TEST_STD_VER > 17 test(); static_assert(test()); #endif return 0; }