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 
9*425620ccSNikolas Klauser // XFAIL: LIBCXX-AIX-FIXME
10*425620ccSNikolas Klauser 
11053d81ceSMarshall Clow // <string>
12053d81ceSMarshall Clow 
13*425620ccSNikolas Klauser // explicit basic_string(basic_string_view<CharT, traits> sv, const Allocator& a = Allocator()); // constexpr since C++20
14053d81ceSMarshall Clow 
15053d81ceSMarshall Clow #include <algorithm>
16053d81ceSMarshall Clow #include <cassert>
178ec49997SLouis Dionne #include <stdexcept>
188ec49997SLouis Dionne #include <string_view>
198ec49997SLouis Dionne #include <string>
208ec49997SLouis Dionne #include <type_traits>
21053d81ceSMarshall Clow 
22053d81ceSMarshall Clow #include "min_allocator.h"
238ec49997SLouis Dionne #include "test_allocator.h"
248ec49997SLouis Dionne #include "test_macros.h"
258ec49997SLouis Dionne 
268ec49997SLouis Dionne static_assert(!std::is_convertible<std::string_view, std::string const&>::value, "");
278ec49997SLouis Dionne static_assert(!std::is_convertible<std::string_view, std::string>::value, "");
28053d81ceSMarshall Clow 
29053d81ceSMarshall Clow template <class charT>
3085e9b268SNikolas Klauser TEST_CONSTEXPR_CXX20 void
31053d81ceSMarshall Clow test(std::basic_string_view<charT> sv)
32053d81ceSMarshall Clow {
33053d81ceSMarshall Clow     typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S;
34053d81ceSMarshall Clow     typedef typename S::traits_type T;
35053d81ceSMarshall Clow     typedef typename S::allocator_type A;
3638590b38SEric Fiselier   {
37053d81ceSMarshall Clow     S s2(sv);
38053d81ceSMarshall Clow     LIBCPP_ASSERT(s2.__invariants());
39053d81ceSMarshall Clow     assert(s2.size() == sv.size());
40053d81ceSMarshall Clow     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
41053d81ceSMarshall Clow     assert(s2.get_allocator() == A());
42053d81ceSMarshall Clow     assert(s2.capacity() >= s2.size());
43053d81ceSMarshall Clow   }
4438590b38SEric Fiselier   {
4538590b38SEric Fiselier     S s2;
4638590b38SEric Fiselier     s2 = sv;
4738590b38SEric Fiselier     LIBCPP_ASSERT(s2.__invariants());
4838590b38SEric Fiselier     assert(s2.size() == sv.size());
4938590b38SEric Fiselier     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
5038590b38SEric Fiselier     assert(s2.get_allocator() == A());
5138590b38SEric Fiselier     assert(s2.capacity() >= s2.size());
5238590b38SEric Fiselier   }
5338590b38SEric Fiselier }
54053d81ceSMarshall Clow 
55053d81ceSMarshall Clow template <class charT, class A>
5685e9b268SNikolas Klauser TEST_CONSTEXPR_CXX20 void
57053d81ceSMarshall Clow test(std::basic_string_view<charT> sv, const A& a)
58053d81ceSMarshall Clow {
59053d81ceSMarshall Clow     typedef std::basic_string<charT, std::char_traits<charT>, A> S;
60053d81ceSMarshall Clow     typedef typename S::traits_type T;
6138590b38SEric Fiselier   {
62053d81ceSMarshall Clow     S s2(sv, a);
63053d81ceSMarshall Clow     LIBCPP_ASSERT(s2.__invariants());
64053d81ceSMarshall Clow     assert(s2.size() == sv.size());
65053d81ceSMarshall Clow     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
66053d81ceSMarshall Clow     assert(s2.get_allocator() == a);
67053d81ceSMarshall Clow     assert(s2.capacity() >= s2.size());
68053d81ceSMarshall Clow   }
6938590b38SEric Fiselier   {
7038590b38SEric Fiselier     S s2(a);
7138590b38SEric Fiselier     s2 = sv;
7238590b38SEric Fiselier     LIBCPP_ASSERT(s2.__invariants());
7338590b38SEric Fiselier     assert(s2.size() == sv.size());
7438590b38SEric Fiselier     assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
7538590b38SEric Fiselier     assert(s2.get_allocator() == a);
7638590b38SEric Fiselier     assert(s2.capacity() >= s2.size());
7738590b38SEric Fiselier   }
7838590b38SEric Fiselier }
79053d81ceSMarshall Clow 
80*425620ccSNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() {
81053d81ceSMarshall Clow   {
82053d81ceSMarshall Clow     typedef test_allocator<char> A;
83053d81ceSMarshall Clow     typedef std::basic_string_view<char, std::char_traits<char> > SV;
84053d81ceSMarshall Clow 
85053d81ceSMarshall Clow     test(SV(""));
86053d81ceSMarshall Clow     test(SV(""), A(2));
87053d81ceSMarshall Clow 
88053d81ceSMarshall Clow     test(SV("1"));
89053d81ceSMarshall Clow     test(SV("1") ,A(2));
90053d81ceSMarshall Clow 
91053d81ceSMarshall Clow     test(SV("1234567980"));
92053d81ceSMarshall Clow     test(SV("1234567980"), A(2));
93053d81ceSMarshall Clow 
94053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"));
95053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"), A(2));
96053d81ceSMarshall Clow   }
97053d81ceSMarshall Clow #if TEST_STD_VER >= 11
98053d81ceSMarshall Clow   {
99053d81ceSMarshall Clow     typedef min_allocator<char> A;
100053d81ceSMarshall Clow     typedef std::basic_string_view<char, std::char_traits<char> > SV;
101053d81ceSMarshall Clow 
102053d81ceSMarshall Clow     test(SV(""));
103053d81ceSMarshall Clow     test(SV(""), A());
104053d81ceSMarshall Clow 
105053d81ceSMarshall Clow     test(SV("1"));
106053d81ceSMarshall Clow     test(SV("1") ,A());
107053d81ceSMarshall Clow 
108053d81ceSMarshall Clow     test(SV("1234567980"));
109053d81ceSMarshall Clow     test(SV("1234567980"), A());
110053d81ceSMarshall Clow 
111053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"));
112053d81ceSMarshall Clow     test(SV("123456798012345679801234567980123456798012345679801234567980"), A());
113053d81ceSMarshall Clow   }
114053d81ceSMarshall Clow #endif
1152df59c50SJF Bastien 
116e85018b7SNikolas Klauser   return true;
117e85018b7SNikolas Klauser }
118e85018b7SNikolas Klauser 
119e85018b7SNikolas Klauser int main(int, char**)
120e85018b7SNikolas Klauser {
121e85018b7SNikolas Klauser   test();
122e85018b7SNikolas Klauser #if TEST_STD_VER > 17
123*425620ccSNikolas Klauser   static_assert(test());
124e85018b7SNikolas Klauser #endif
125e85018b7SNikolas Klauser 
1262df59c50SJF Bastien   return 0;
127053d81ceSMarshall Clow }
128