1053d81ceSMarshall Clow //===----------------------------------------------------------------------===//
2053d81ceSMarshall Clow //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6053d81ceSMarshall Clow //
7053d81ceSMarshall Clow //===----------------------------------------------------------------------===//
8053d81ceSMarshall Clow 
9*4fc50236SJoe Loser // UNSUPPORTED: !stdlib=libc++ && (c++03 || c++11 || c++14)
10*4fc50236SJoe Loser 
11053d81ceSMarshall Clow // <string_view>
12053d81ceSMarshall Clow 
13053d81ceSMarshall Clow // constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const;
14053d81ceSMarshall Clow 
15053d81ceSMarshall Clow // Throws: out_of_range if pos > size().
16053d81ceSMarshall Clow // Effects: Determines the effective length rlen of the string to reference as the smaller of n and size() - pos.
17053d81ceSMarshall Clow // Returns: basic_string_view(data()+pos, rlen).
18053d81ceSMarshall Clow 
19053d81ceSMarshall Clow #include <string_view>
20aec18766SStephan T. Lavavej #include <algorithm>
21aec18766SStephan T. Lavavej #include <stdexcept>
22053d81ceSMarshall Clow #include <cassert>
23053d81ceSMarshall Clow 
24053d81ceSMarshall Clow #include "test_macros.h"
25053d81ceSMarshall Clow 
26053d81ceSMarshall Clow template<typename CharT>
test1(std::basic_string_view<CharT> sv,size_t n,size_t pos)27053d81ceSMarshall Clow void test1(std::basic_string_view<CharT> sv, size_t n, size_t pos) {
28ef68f26bSMarshall Clow     std::basic_string_view<CharT> sv1;
29187db169SMarshall Clow #ifdef TEST_HAS_NO_EXCEPTIONS
30ef68f26bSMarshall Clow     if (pos > sv.size())
31ef68f26bSMarshall Clow         return ;  // would throw if exceptions were enabled
32ef68f26bSMarshall Clow     sv1 = sv.substr(pos, n);
33187db169SMarshall Clow #else
34053d81ceSMarshall Clow     try {
35ef68f26bSMarshall Clow         sv1 = sv.substr(pos, n);
36ef68f26bSMarshall Clow         assert(pos <= sv.size());
37ef68f26bSMarshall Clow     }
38ef68f26bSMarshall Clow     catch (const std::out_of_range&) {
39ef68f26bSMarshall Clow         assert(pos > sv.size());
40ef68f26bSMarshall Clow         return ;
41ef68f26bSMarshall Clow     }
42ef68f26bSMarshall Clow #endif
43053d81ceSMarshall Clow     const size_t rlen = std::min(n, sv.size() - pos);
44053d81ceSMarshall Clow     assert (sv1.size() == rlen);
45aec18766SStephan T. Lavavej     for (size_t i = 0; i < rlen; ++i)
46053d81ceSMarshall Clow         assert(sv[pos+i] == sv1[i]);
47053d81ceSMarshall Clow }
48053d81ceSMarshall Clow 
49053d81ceSMarshall Clow 
50053d81ceSMarshall Clow template<typename CharT>
test(const CharT * s)51053d81ceSMarshall Clow void test ( const CharT *s ) {
52053d81ceSMarshall Clow     typedef std::basic_string_view<CharT> string_view_t;
53053d81ceSMarshall Clow 
54053d81ceSMarshall Clow     string_view_t sv1 ( s );
55053d81ceSMarshall Clow 
56053d81ceSMarshall Clow     test1(sv1,  0, 0);
57053d81ceSMarshall Clow     test1(sv1,  1, 0);
58053d81ceSMarshall Clow     test1(sv1, 20, 0);
59053d81ceSMarshall Clow     test1(sv1, sv1.size(), 0);
60053d81ceSMarshall Clow 
61053d81ceSMarshall Clow     test1(sv1,   0, 3);
62053d81ceSMarshall Clow     test1(sv1,   2, 3);
63053d81ceSMarshall Clow     test1(sv1, 100, 3);
64053d81ceSMarshall Clow 
65053d81ceSMarshall Clow     test1(sv1, 0, string_view_t::npos);
66053d81ceSMarshall Clow     test1(sv1, 2, string_view_t::npos);
67053d81ceSMarshall Clow     test1(sv1, sv1.size(), string_view_t::npos);
68053d81ceSMarshall Clow 
69053d81ceSMarshall Clow     test1(sv1, sv1.size() + 1, 0);
70053d81ceSMarshall Clow     test1(sv1, sv1.size() + 1, 1);
71053d81ceSMarshall Clow     test1(sv1, sv1.size() + 1, string_view_t::npos);
72053d81ceSMarshall Clow }
73053d81ceSMarshall Clow 
main(int,char **)742df59c50SJF Bastien int main(int, char**) {
75053d81ceSMarshall Clow     test ( "ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
76053d81ceSMarshall Clow     test ( "ABCDE");
77053d81ceSMarshall Clow     test ( "a" );
78053d81ceSMarshall Clow     test ( "" );
79053d81ceSMarshall Clow 
80053d81ceSMarshall Clow     test ( L"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
81053d81ceSMarshall Clow     test ( L"ABCDE" );
82053d81ceSMarshall Clow     test ( L"a" );
83053d81ceSMarshall Clow     test ( L"" );
84053d81ceSMarshall Clow 
85053d81ceSMarshall Clow #if TEST_STD_VER >= 11
86053d81ceSMarshall Clow     test ( u"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
87053d81ceSMarshall Clow     test ( u"ABCDE" );
88053d81ceSMarshall Clow     test ( u"a" );
89053d81ceSMarshall Clow     test ( u"" );
90053d81ceSMarshall Clow 
91053d81ceSMarshall Clow     test ( U"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
92053d81ceSMarshall Clow     test ( U"ABCDE" );
93053d81ceSMarshall Clow     test ( U"a" );
94053d81ceSMarshall Clow     test ( U"" );
95053d81ceSMarshall Clow #endif
96053d81ceSMarshall Clow 
97053d81ceSMarshall Clow #if TEST_STD_VER > 11
98053d81ceSMarshall Clow     {
99053d81ceSMarshall Clow     constexpr std::string_view sv1 { "ABCDE", 5 };
100053d81ceSMarshall Clow 
101053d81ceSMarshall Clow     {
102053d81ceSMarshall Clow     constexpr std::string_view sv2 = sv1.substr ( 0, 3 );
103053d81ceSMarshall Clow     static_assert ( sv2.size() == 3, "" );
104053d81ceSMarshall Clow     static_assert ( sv2[0] == 'A', "" );
105053d81ceSMarshall Clow     static_assert ( sv2[1] == 'B', "" );
106053d81ceSMarshall Clow     static_assert ( sv2[2] == 'C', "" );
107053d81ceSMarshall Clow     }
108053d81ceSMarshall Clow 
109053d81ceSMarshall Clow     {
110053d81ceSMarshall Clow     constexpr std::string_view sv2 = sv1.substr ( 3, 0 );
111053d81ceSMarshall Clow     static_assert ( sv2.size() == 0, "" );
112053d81ceSMarshall Clow     }
113053d81ceSMarshall Clow 
114053d81ceSMarshall Clow     {
115053d81ceSMarshall Clow     constexpr std::string_view sv2 = sv1.substr ( 3, 3 );
116053d81ceSMarshall Clow     static_assert ( sv2.size() == 2, "" );
117053d81ceSMarshall Clow     static_assert ( sv2[0] == 'D', "" );
118053d81ceSMarshall Clow     static_assert ( sv2[1] == 'E', "" );
119053d81ceSMarshall Clow     }
120053d81ceSMarshall Clow     }
121053d81ceSMarshall Clow #endif
1222df59c50SJF Bastien 
1232df59c50SJF Bastien   return 0;
124053d81ceSMarshall Clow }
125