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 try { 26 std::basic_string_view<CharT> sv1 = sv.substr(pos, n); 27 const size_t rlen = std::min(n, sv.size() - pos); 28 assert (sv1.size() == rlen); 29 for (size_t i = 0; i <= rlen; ++i) 30 assert(sv[pos+i] == sv1[i]); 31 } 32 catch (const std::out_of_range&) { 33 assert(pos > sv.size()); 34 } 35 } 36 37 38 template<typename CharT> 39 void test ( const CharT *s ) { 40 typedef std::basic_string_view<CharT> string_view_t; 41 42 string_view_t sv1 ( s ); 43 44 test1(sv1, 0, 0); 45 test1(sv1, 1, 0); 46 test1(sv1, 20, 0); 47 test1(sv1, sv1.size(), 0); 48 49 test1(sv1, 0, 3); 50 test1(sv1, 2, 3); 51 test1(sv1, 100, 3); 52 53 test1(sv1, 0, string_view_t::npos); 54 test1(sv1, 2, string_view_t::npos); 55 test1(sv1, sv1.size(), string_view_t::npos); 56 57 test1(sv1, sv1.size() + 1, 0); 58 test1(sv1, sv1.size() + 1, 1); 59 test1(sv1, sv1.size() + 1, string_view_t::npos); 60 } 61 62 int main () { 63 test ( "ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" ); 64 test ( "ABCDE"); 65 test ( "a" ); 66 test ( "" ); 67 68 test ( L"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" ); 69 test ( L"ABCDE" ); 70 test ( L"a" ); 71 test ( L"" ); 72 73 #if TEST_STD_VER >= 11 74 test ( u"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" ); 75 test ( u"ABCDE" ); 76 test ( u"a" ); 77 test ( u"" ); 78 79 test ( U"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" ); 80 test ( U"ABCDE" ); 81 test ( U"a" ); 82 test ( U"" ); 83 #endif 84 85 #if TEST_STD_VER > 11 86 { 87 constexpr std::string_view sv1 { "ABCDE", 5 }; 88 89 { 90 constexpr std::string_view sv2 = sv1.substr ( 0, 3 ); 91 static_assert ( sv2.size() == 3, "" ); 92 static_assert ( sv2[0] == 'A', "" ); 93 static_assert ( sv2[1] == 'B', "" ); 94 static_assert ( sv2[2] == 'C', "" ); 95 } 96 97 { 98 constexpr std::string_view sv2 = sv1.substr ( 3, 0 ); 99 static_assert ( sv2.size() == 0, "" ); 100 } 101 102 { 103 constexpr std::string_view sv2 = sv1.substr ( 3, 3 ); 104 static_assert ( sv2.size() == 2, "" ); 105 static_assert ( sv2[0] == 'D', "" ); 106 static_assert ( sv2[1] == 'E', "" ); 107 } 108 } 109 #endif 110 } 111