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*2df59c50SJF Bastien int main(int, char**)
75053d81ceSMarshall Clow {
76053d81ceSMarshall Clow     {
77053d81ceSMarshall Clow     typedef test_allocator<char> A;
78053d81ceSMarshall Clow     typedef std::basic_string_view<char, std::char_traits<char> > SV;
79053d81ceSMarshall Clow 
80053d81ceSMarshall Clow     test(SV(""));
81053d81ceSMarshall Clow     test(SV(""), A(2));
82053d81ceSMarshall Clow 
83053d81ceSMarshall Clow     test(SV("1"));
84053d81ceSMarshall Clow     test(SV("1") ,A(2));
85053d81ceSMarshall Clow 
86053d81ceSMarshall Clow     test(SV("1234567980"));
87053d81ceSMarshall Clow     test(SV("1234567980"), A(2));
88053d81ceSMarshall Clow 
89053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"));
90053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"), A(2));
91053d81ceSMarshall Clow     }
92053d81ceSMarshall Clow #if TEST_STD_VER >= 11
93053d81ceSMarshall Clow     {
94053d81ceSMarshall Clow     typedef min_allocator<char> A;
95053d81ceSMarshall Clow     typedef std::basic_string_view<char, std::char_traits<char> > SV;
96053d81ceSMarshall Clow 
97053d81ceSMarshall Clow     test(SV(""));
98053d81ceSMarshall Clow     test(SV(""), A());
99053d81ceSMarshall Clow 
100053d81ceSMarshall Clow     test(SV("1"));
101053d81ceSMarshall Clow     test(SV("1") ,A());
102053d81ceSMarshall Clow 
103053d81ceSMarshall Clow     test(SV("1234567980"));
104053d81ceSMarshall Clow     test(SV("1234567980"), A());
105053d81ceSMarshall Clow 
106053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"));
107053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"), A());
108053d81ceSMarshall Clow     }
109053d81ceSMarshall Clow #endif
110*2df59c50SJF Bastien 
111*2df59c50SJF Bastien   return 0;
112053d81ceSMarshall Clow }
113