blob: c80e90a04788f9cb2e6ff82a4bacfc767e6702f5 [file] [log] [blame]
Marshall Clow5aa8fa22014-06-11 16:44:55 +00001//===----------------------------------------------------------------------===//
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
Asiri Rathnayakef520c142015-11-10 11:41:22 +000011// XFAIL: libcpp-no-exceptions
Marshall Clow5aa8fa22014-06-11 16:44:55 +000012// <string_view>
13
14// constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const;
15
16// Throws: out_of_range if pos > size().
17// Effects: Determines the effective length rlen of the string to reference as the smaller of n and size() - pos.
18// Returns: basic_string_view(data()+pos, rlen).
19
20#include <experimental/string_view>
21#include <cassert>
22
23template<typename CharT>
24void test1 ( std::experimental::basic_string_view<CharT> sv, size_t n, size_t pos ) {
25 try {
26 std::experimental::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 & ) { assert ( pos > sv.size()); }
33}
34
35
36template<typename CharT>
37void test ( const CharT *s ) {
38 typedef std::experimental::basic_string_view<CharT> string_view_t;
39
40 string_view_t sv1 ( s );
41
42 test1(sv1, 0, 0);
43 test1(sv1, 1, 0);
44 test1(sv1, 20, 0);
45 test1(sv1, sv1.size(), 0);
46
47 test1(sv1, 0, 3);
48 test1(sv1, 2, 3);
49 test1(sv1, 100, 3);
50
51 test1(sv1, 0, string_view_t::npos);
52 test1(sv1, 2, string_view_t::npos);
53 test1(sv1, sv1.size(), string_view_t::npos);
54
55 test1(sv1, sv1.size() + 1, 0);
56 test1(sv1, sv1.size() + 1, 1);
57 test1(sv1, sv1.size() + 1, string_view_t::npos);
58}
59
60int main () {
61 test ( "ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
62 test ( "ABCDE");
63 test ( "a" );
64 test ( "" );
65
66 test ( L"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
67 test ( L"ABCDE" );
68 test ( L"a" );
69 test ( L"" );
70
71#if __cplusplus >= 201103L
72 test ( u"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
73 test ( u"ABCDE" );
74 test ( u"a" );
75 test ( u"" );
76
77 test ( U"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE" );
78 test ( U"ABCDE" );
79 test ( U"a" );
80 test ( U"" );
81#endif
82
83#if _LIBCPP_STD_VER > 11
84 {
85 constexpr std::experimental::string_view sv1 { "ABCDE", 5 };
86
87 {
88 constexpr std::experimental::string_view sv2 = sv1.substr ( 0, 3 );
89 static_assert ( sv2.size() == 3, "" );
90 static_assert ( sv2[0] == 'A', "" );
91 static_assert ( sv2[1] == 'B', "" );
92 static_assert ( sv2[2] == 'C', "" );
93 }
94
95 {
96 constexpr std::experimental::string_view sv2 = sv1.substr ( 3, 0 );
97 static_assert ( sv2.size() == 0, "" );
98 }
99
100 {
101 constexpr std::experimental::string_view sv2 = sv1.substr ( 3, 3 );
102 static_assert ( sv2.size() == 2, "" );
103 static_assert ( sv2[0] == 'D', "" );
104 static_assert ( sv2[1] == 'E', "" );
105 }
106 }
107#endif
Eric Fiseliercc2e1ab2015-02-10 17:32:49 +0000108}