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 
9053d81ceSMarshall Clow // <string>
10053d81ceSMarshall Clow 
11053d81ceSMarshall Clow // explicit basic_string(basic_string_view<CharT, traits> sv, const Allocator& a = Allocator());
12053d81ceSMarshall Clow 
13053d81ceSMarshall Clow #include <string>
14053d81ceSMarshall Clow #include <string_view>
15053d81ceSMarshall Clow #include <stdexcept>
16053d81ceSMarshall Clow #include <algorithm>
17053d81ceSMarshall Clow #include <cassert>
18053d81ceSMarshall Clow 
19053d81ceSMarshall Clow #include "test_macros.h"
20053d81ceSMarshall Clow #include "test_allocator.h"
21053d81ceSMarshall Clow #include "min_allocator.h"
22053d81ceSMarshall Clow 
23053d81ceSMarshall Clow template <class charT>
24053d81ceSMarshall Clow void
25053d81ceSMarshall Clow test(std::basic_string_view<charT> sv)
26053d81ceSMarshall Clow {
27053d81ceSMarshall Clow     typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S;
28053d81ceSMarshall Clow     typedef typename S::traits_type T;
29053d81ceSMarshall Clow     typedef typename S::allocator_type A;
3038590b38SEric Fiselier   {
31053d81ceSMarshall Clow     S s2(sv);
32053d81ceSMarshall Clow     LIBCPP_ASSERT(s2.__invariants());
33053d81ceSMarshall Clow     assert(s2.size() == sv.size());
34053d81ceSMarshall Clow     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
35053d81ceSMarshall Clow     assert(s2.get_allocator() == A());
36053d81ceSMarshall Clow     assert(s2.capacity() >= s2.size());
37053d81ceSMarshall Clow   }
3838590b38SEric Fiselier   {
3938590b38SEric Fiselier     S s2;
4038590b38SEric Fiselier     s2 = sv;
4138590b38SEric Fiselier     LIBCPP_ASSERT(s2.__invariants());
4238590b38SEric Fiselier     assert(s2.size() == sv.size());
4338590b38SEric Fiselier     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
4438590b38SEric Fiselier     assert(s2.get_allocator() == A());
4538590b38SEric Fiselier     assert(s2.capacity() >= s2.size());
4638590b38SEric Fiselier   }
4738590b38SEric Fiselier }
48053d81ceSMarshall Clow 
49053d81ceSMarshall Clow template <class charT, class A>
50053d81ceSMarshall Clow void
51053d81ceSMarshall Clow test(std::basic_string_view<charT> sv, const A& a)
52053d81ceSMarshall Clow {
53053d81ceSMarshall Clow     typedef std::basic_string<charT, std::char_traits<charT>, A> S;
54053d81ceSMarshall Clow     typedef typename S::traits_type T;
5538590b38SEric Fiselier   {
56053d81ceSMarshall Clow     S s2(sv, a);
57053d81ceSMarshall Clow     LIBCPP_ASSERT(s2.__invariants());
58053d81ceSMarshall Clow     assert(s2.size() == sv.size());
59053d81ceSMarshall Clow     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
60053d81ceSMarshall Clow     assert(s2.get_allocator() == a);
61053d81ceSMarshall Clow     assert(s2.capacity() >= s2.size());
62053d81ceSMarshall Clow   }
6338590b38SEric Fiselier   {
6438590b38SEric Fiselier     S s2(a);
6538590b38SEric Fiselier     s2 = sv;
6638590b38SEric Fiselier     LIBCPP_ASSERT(s2.__invariants());
6738590b38SEric Fiselier     assert(s2.size() == sv.size());
6838590b38SEric Fiselier     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
6938590b38SEric Fiselier     assert(s2.get_allocator() == a);
7038590b38SEric Fiselier     assert(s2.capacity() >= s2.size());
7138590b38SEric Fiselier   }
7238590b38SEric Fiselier }
73053d81ceSMarshall Clow 
74*e85018b7SNikolas Klauser bool test() {
75053d81ceSMarshall Clow   {
76053d81ceSMarshall Clow     typedef test_allocator<char> A;
77053d81ceSMarshall Clow     typedef std::basic_string_view<char, std::char_traits<char> > SV;
78053d81ceSMarshall Clow 
79053d81ceSMarshall Clow     test(SV(""));
80053d81ceSMarshall Clow     test(SV(""), A(2));
81053d81ceSMarshall Clow 
82053d81ceSMarshall Clow     test(SV("1"));
83053d81ceSMarshall Clow     test(SV("1") ,A(2));
84053d81ceSMarshall Clow 
85053d81ceSMarshall Clow     test(SV("1234567980"));
86053d81ceSMarshall Clow     test(SV("1234567980"), A(2));
87053d81ceSMarshall Clow 
88053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"));
89053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"), A(2));
90053d81ceSMarshall Clow   }
91053d81ceSMarshall Clow #if TEST_STD_VER >= 11
92053d81ceSMarshall Clow   {
93053d81ceSMarshall Clow     typedef min_allocator<char> A;
94053d81ceSMarshall Clow     typedef std::basic_string_view<char, std::char_traits<char> > SV;
95053d81ceSMarshall Clow 
96053d81ceSMarshall Clow     test(SV(""));
97053d81ceSMarshall Clow     test(SV(""), A());
98053d81ceSMarshall Clow 
99053d81ceSMarshall Clow     test(SV("1"));
100053d81ceSMarshall Clow     test(SV("1") ,A());
101053d81ceSMarshall Clow 
102053d81ceSMarshall Clow     test(SV("1234567980"));
103053d81ceSMarshall Clow     test(SV("1234567980"), A());
104053d81ceSMarshall Clow 
105053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"));
106053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"), A());
107053d81ceSMarshall Clow   }
108053d81ceSMarshall Clow #endif
1092df59c50SJF Bastien 
110*e85018b7SNikolas Klauser   return true;
111*e85018b7SNikolas Klauser }
112*e85018b7SNikolas Klauser 
113*e85018b7SNikolas Klauser int main(int, char**)
114*e85018b7SNikolas Klauser {
115*e85018b7SNikolas Klauser   test();
116*e85018b7SNikolas Klauser #if TEST_STD_VER > 17
117*e85018b7SNikolas Klauser   // static_assert(test());
118*e85018b7SNikolas Klauser #endif
119*e85018b7SNikolas Klauser 
1202df59c50SJF Bastien   return 0;
121053d81ceSMarshall Clow }
122