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 
94fc50236SJoe Loser // UNSUPPORTED: !stdlib=libc++ && (c++03 || c++11 || c++14)
104fc50236SJoe Loser 
11053d81ceSMarshall Clow // <string_view>
12053d81ceSMarshall Clow 
13053d81ceSMarshall Clow // [string.view.capacity], capacity
14053d81ceSMarshall Clow // constexpr size_type size()     const noexcept;
15053d81ceSMarshall Clow // constexpr size_type length()   const noexcept;
16053d81ceSMarshall Clow // constexpr size_type max_size() const noexcept;
17053d81ceSMarshall Clow // constexpr bool empty()         const noexcept;
18053d81ceSMarshall Clow 
19053d81ceSMarshall Clow #include <string_view>
20053d81ceSMarshall Clow #include <cassert>
21*3cd4531bSNikolas Klauser #include <iterator>
222db67e97SLouis Dionne #include <limits>
23053d81ceSMarshall Clow 
24053d81ceSMarshall Clow #include "test_macros.h"
25053d81ceSMarshall Clow 
26053d81ceSMarshall Clow template<typename SV>
test1()27053d81ceSMarshall Clow void test1 () {
280f901c7eSStephan T. Lavavej #if TEST_STD_VER > 11
29053d81ceSMarshall Clow     {
30053d81ceSMarshall Clow     constexpr SV sv1;
31053d81ceSMarshall Clow     static_assert ( sv1.size() == 0, "" );
32053d81ceSMarshall Clow     static_assert ( sv1.empty(), "");
33053d81ceSMarshall Clow     static_assert ( sv1.size() == sv1.length(), "" );
34053d81ceSMarshall Clow     static_assert ( sv1.max_size() > sv1.size(), "");
35053d81ceSMarshall Clow     }
36053d81ceSMarshall Clow #endif
37053d81ceSMarshall Clow 
38053d81ceSMarshall Clow     {
39053d81ceSMarshall Clow     SV sv1;
4025a7ba45SMarshall Clow     ASSERT_NOEXCEPT(sv1.size());
4125a7ba45SMarshall Clow     ASSERT_NOEXCEPT(sv1.empty());
4225a7ba45SMarshall Clow     ASSERT_NOEXCEPT(sv1.max_size());
4325a7ba45SMarshall Clow     ASSERT_NOEXCEPT(sv1.length());
44053d81ceSMarshall Clow     assert ( sv1.size() == 0 );
45053d81ceSMarshall Clow     assert ( sv1.empty());
46053d81ceSMarshall Clow     assert ( sv1.size() == sv1.length());
47053d81ceSMarshall Clow     assert ( sv1.max_size() > sv1.size());
48053d81ceSMarshall Clow     }
492db67e97SLouis Dionne 
502db67e97SLouis Dionne     // Sanity check max_size() -- a string_view can't store more bytes than a single object
512db67e97SLouis Dionne     // can contain. Any implementation that fails this check is certainly lying.
522db67e97SLouis Dionne     {
532db67e97SLouis Dionne         typedef typename SV::value_type CharT;
542db67e97SLouis Dionne         typedef typename SV::size_type Size;
552db67e97SLouis Dionne         SV sv;
562db67e97SLouis Dionne         assert(sv.max_size() <= std::numeric_limits<Size>::max() / sizeof(CharT));
572db67e97SLouis Dionne         LIBCPP_ASSERT(sv.max_size() == std::numeric_limits<Size>::max() / sizeof(CharT));
582db67e97SLouis Dionne     }
59053d81ceSMarshall Clow }
60053d81ceSMarshall Clow 
61053d81ceSMarshall Clow template<typename CharT>
test2(const CharT * s,size_t len)62053d81ceSMarshall Clow void test2 ( const CharT *s, size_t len ) {
63053d81ceSMarshall Clow     {
64053d81ceSMarshall Clow     std::basic_string_view<CharT> sv1 ( s );
65053d81ceSMarshall Clow     assert ( sv1.size() == len );
66053d81ceSMarshall Clow     assert ( sv1.data() == s );
67053d81ceSMarshall Clow     assert ( sv1.empty() == (len == 0));
68053d81ceSMarshall Clow     assert ( sv1.size() == sv1.length());
69053d81ceSMarshall Clow     assert ( sv1.max_size() > sv1.size());
70aafb3151SMarshall Clow #if TEST_STD_VER > 14
71aafb3151SMarshall Clow //  make sure we pick up std::size, too!
72aafb3151SMarshall Clow     assert ( sv1.size() == std::size(sv1));
73aafb3151SMarshall Clow     assert ( sv1.empty() == std::empty(sv1));
74aafb3151SMarshall Clow #endif
75053d81ceSMarshall Clow     }
76053d81ceSMarshall Clow }
77053d81ceSMarshall Clow 
main(int,char **)782df59c50SJF Bastien int main(int, char**) {
797dad0bd6SMarshall Clow     test1<std::string_view> ();
807dad0bd6SMarshall Clow #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
817dad0bd6SMarshall Clow     test1<std::u8string_view> ();
827dad0bd6SMarshall Clow #endif
837dad0bd6SMarshall Clow     test1<std::u16string_view> ();
847dad0bd6SMarshall Clow     test1<std::u32string_view> ();
85f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
867dad0bd6SMarshall Clow     test1<std::wstring_view> ();
87f4c1258dSLouis Dionne #endif
88053d81ceSMarshall Clow 
89053d81ceSMarshall Clow     test2 ( "ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE", 105 );
90053d81ceSMarshall Clow     test2 ( "ABCDE", 5 );
91053d81ceSMarshall Clow     test2 ( "a", 1 );
92053d81ceSMarshall Clow     test2 ( "", 0 );
93053d81ceSMarshall Clow 
94f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
95053d81ceSMarshall Clow     test2 ( L"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE", 105 );
96053d81ceSMarshall Clow     test2 ( L"ABCDE", 5 );
97053d81ceSMarshall Clow     test2 ( L"a", 1 );
98053d81ceSMarshall Clow     test2 ( L"", 0 );
99f4c1258dSLouis Dionne #endif
100053d81ceSMarshall Clow 
1017dad0bd6SMarshall Clow #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
1027dad0bd6SMarshall Clow     test2 ( u8"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE", 105 );
1037dad0bd6SMarshall Clow     test2 ( u8"ABCDE", 5 );
1047dad0bd6SMarshall Clow     test2 ( u8"a", 1 );
1057dad0bd6SMarshall Clow     test2 ( u8"", 0 );
1067dad0bd6SMarshall Clow #endif
1077dad0bd6SMarshall Clow 
108053d81ceSMarshall Clow #if TEST_STD_VER >= 11
109053d81ceSMarshall Clow     test2 ( u"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE", 105 );
110053d81ceSMarshall Clow     test2 ( u"ABCDE", 5 );
111053d81ceSMarshall Clow     test2 ( u"a", 1 );
112053d81ceSMarshall Clow     test2 ( u"", 0 );
113053d81ceSMarshall Clow 
114053d81ceSMarshall Clow     test2 ( U"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE", 105 );
115053d81ceSMarshall Clow     test2 ( U"ABCDE", 5 );
116053d81ceSMarshall Clow     test2 ( U"a", 1 );
117053d81ceSMarshall Clow     test2 ( U"", 0 );
118053d81ceSMarshall Clow #endif
1192df59c50SJF Bastien 
1202df59c50SJF Bastien   return 0;
121053d81ceSMarshall Clow }
122