1*8d3252a8SMark de Wever //===----------------------------------------------------------------------===// 2*8d3252a8SMark de Wever // 3*8d3252a8SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*8d3252a8SMark de Wever // See https://llvm.org/LICENSE.txt for license information. 5*8d3252a8SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*8d3252a8SMark de Wever // 7*8d3252a8SMark de Wever //===----------------------------------------------------------------------===// 8*8d3252a8SMark de Wever 9*8d3252a8SMark de Wever // UNSUPPORTED: !stdlib=libc++ && (c++03 || c++11 || c++14) 10*8d3252a8SMark de Wever 11*8d3252a8SMark de Wever // <string_view> 12*8d3252a8SMark de Wever 13*8d3252a8SMark de Wever // class iterator 14*8d3252a8SMark de Wever 15*8d3252a8SMark de Wever #include <cassert> 16*8d3252a8SMark de Wever #include <concepts> 17*8d3252a8SMark de Wever #include <iterator> 18*8d3252a8SMark de Wever #include <string_view> 19*8d3252a8SMark de Wever 20*8d3252a8SMark de Wever #include "test_macros.h" 21*8d3252a8SMark de Wever #include "make_string.h" 22*8d3252a8SMark de Wever 23*8d3252a8SMark de Wever template <class CharT> 24*8d3252a8SMark de Wever TEST_CONSTEXPR_CXX14 void test_type() { 25*8d3252a8SMark de Wever using C = std::basic_string_view<CharT>; 26*8d3252a8SMark de Wever typename C::iterator ii1 = typename C::iterator(), ii2 = typename C::iterator(); 27*8d3252a8SMark de Wever typename C::iterator ii4 = ii1; 28*8d3252a8SMark de Wever typename C::const_iterator cii = typename C::const_iterator(); 29*8d3252a8SMark de Wever assert(ii1 == ii2); 30*8d3252a8SMark de Wever assert(ii1 == ii4); 31*8d3252a8SMark de Wever assert(ii1 == cii); 32*8d3252a8SMark de Wever 33*8d3252a8SMark de Wever assert(!(ii1 != ii2)); 34*8d3252a8SMark de Wever assert(!(ii1 != cii)); 35*8d3252a8SMark de Wever 36*8d3252a8SMark de Wever #if TEST_STD_VER >= 17 37*8d3252a8SMark de Wever C c = MAKE_STRING_VIEW(CharT, "abc"); 38*8d3252a8SMark de Wever assert(c.begin() == std::begin(c)); 39*8d3252a8SMark de Wever assert(c.rbegin() == std::rbegin(c)); 40*8d3252a8SMark de Wever assert(c.cbegin() == std::cbegin(c)); 41*8d3252a8SMark de Wever assert(c.crbegin() == std::crbegin(c)); 42*8d3252a8SMark de Wever 43*8d3252a8SMark de Wever assert(c.end() == std::end(c)); 44*8d3252a8SMark de Wever assert(c.rend() == std::rend(c)); 45*8d3252a8SMark de Wever assert(c.cend() == std::cend(c)); 46*8d3252a8SMark de Wever assert(c.crend() == std::crend(c)); 47*8d3252a8SMark de Wever 48*8d3252a8SMark de Wever assert(std::begin(c) != std::end(c)); 49*8d3252a8SMark de Wever assert(std::rbegin(c) != std::rend(c)); 50*8d3252a8SMark de Wever assert(std::cbegin(c) != std::cend(c)); 51*8d3252a8SMark de Wever assert(std::crbegin(c) != std::crend(c)); 52*8d3252a8SMark de Wever #endif 53*8d3252a8SMark de Wever 54*8d3252a8SMark de Wever #if TEST_STD_VER >= 20 55*8d3252a8SMark de Wever // P1614 + LWG3352 56*8d3252a8SMark de Wever std::same_as<std::strong_ordering> decltype(auto) r1 = ii1 <=> ii2; 57*8d3252a8SMark de Wever assert(r1 == std::strong_ordering::equal); 58*8d3252a8SMark de Wever 59*8d3252a8SMark de Wever std::same_as<std::strong_ordering> decltype(auto) r2 = ii1 <=> ii2; 60*8d3252a8SMark de Wever assert(r2 == std::strong_ordering::equal); 61*8d3252a8SMark de Wever #endif 62*8d3252a8SMark de Wever } 63*8d3252a8SMark de Wever 64*8d3252a8SMark de Wever TEST_CONSTEXPR_CXX14 bool test() { 65*8d3252a8SMark de Wever test_type<char>(); 66*8d3252a8SMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS 67*8d3252a8SMark de Wever test_type<wchar_t>(); 68*8d3252a8SMark de Wever #endif 69*8d3252a8SMark de Wever #ifndef TEST_HAS_NO_CHAR8_T 70*8d3252a8SMark de Wever test_type<char8_t>(); 71*8d3252a8SMark de Wever #endif 72*8d3252a8SMark de Wever test_type<char16_t>(); 73*8d3252a8SMark de Wever test_type<char32_t>(); 74*8d3252a8SMark de Wever 75*8d3252a8SMark de Wever return true; 76*8d3252a8SMark de Wever } 77*8d3252a8SMark de Wever 78*8d3252a8SMark de Wever int main(int, char**) { 79*8d3252a8SMark de Wever test(); 80*8d3252a8SMark de Wever #if TEST_STD_VER >= 14 81*8d3252a8SMark de Wever static_assert(test(), ""); 82*8d3252a8SMark de Wever #endif 83*8d3252a8SMark de Wever 84*8d3252a8SMark de Wever return 0; 85*8d3252a8SMark de Wever } 86