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