1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // <string_view> 11 12 // constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const; 13 14 // Throws: out_of_range if pos > size(). 15 // Effects: Determines the effective length rlen of the string to reference as the smaller of n and size() - pos. 16 // Returns: basic_string_view(data()+pos, rlen). 17 18 #include <string_view> 19 #include <cassert> 20 21 #include "test_macros.h" 22 23 template<typename CharT> 24 void test1(std::basic_string_view<CharT> sv, size_t n, size_t pos) { 25 #ifdef TEST_HAS_NO_EXCEPTIONS 26 if (pos <= sv.size()) 27 assert (sign( sv1.compare(pos1, n1, sv2)) == sign(expected)); 28 #else 29 try { 30 std::basic_string_view<CharT> sv1 = sv.substr(pos, n); 31 const size_t rlen = std::min(n, sv.size() - pos); 32 assert (sv1.size() == rlen); 33 for (size_t i = 0; i <= rlen; ++i) 34 assert(sv[pos+i] == sv1[i]); 35 } 36 catch (const std::out_of_range&) { 37 assert(pos > sv.size()); 38 } 39 #endif 40 } 41 42 43 template<typename CharT> 44 void test ( const CharT *s ) { 45 typedef std::basic_string_view<CharT> string_view_t; 46 47 string_view_t sv1 ( s ); 48 49 test1(sv1, 0, 0); 50 test1(sv1, 1, 0); 51 test1(sv1, 20, 0); 52 test1(sv1, sv1.size(), 0); 53 54 test1(sv1, 0, 3); 55 test1(sv1, 2, 3); 56 test1(sv1, 100, 3); 57 58 test1(sv1, 0, string_view_t::npos); 59 test1(sv1, 2, string_view_t::npos); 60 test1(sv1, sv1.size(), string_view_t::npos); 61 62 test1(sv1, sv1.size() + 1, 0); 63 test1(sv1, sv1.size() + 1, 1); 64 test1(sv1, sv1.size() + 1, string_view_t::npos); 65 } 66 67 int main () { 68 test ( "ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" ); 69 test ( "ABCDE"); 70 test ( "a" ); 71 test ( "" ); 72 73 test ( L"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" ); 74 test ( L"ABCDE" ); 75 test ( L"a" ); 76 test ( L"" ); 77 78 #if TEST_STD_VER >= 11 79 test ( u"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" ); 80 test ( u"ABCDE" ); 81 test ( u"a" ); 82 test ( u"" ); 83 84 test ( U"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" ); 85 test ( U"ABCDE" ); 86 test ( U"a" ); 87 test ( U"" ); 88 #endif 89 90 #if TEST_STD_VER > 11 91 { 92 constexpr std::string_view sv1 { "ABCDE", 5 }; 93 94 { 95 constexpr std::string_view sv2 = sv1.substr ( 0, 3 ); 96 static_assert ( sv2.size() == 3, "" ); 97 static_assert ( sv2[0] == 'A', "" ); 98 static_assert ( sv2[1] == 'B', "" ); 99 static_assert ( sv2[2] == 'C', "" ); 100 } 101 102 { 103 constexpr std::string_view sv2 = sv1.substr ( 3, 0 ); 104 static_assert ( sv2.size() == 0, "" ); 105 } 106 107 { 108 constexpr std::string_view sv2 = sv1.substr ( 3, 3 ); 109 static_assert ( sv2.size() == 2, "" ); 110 static_assert ( sv2[0] == 'D', "" ); 111 static_assert ( sv2[1] == 'E', "" ); 112 } 113 } 114 #endif 115 } 116