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
11*425620ccSNikolas Klauser // explicit basic_string(basic_string_view<CharT, traits> sv, const Allocator& a = Allocator()); // constexpr since C++20
12053d81ceSMarshall Clow
13053d81ceSMarshall Clow #include <algorithm>
14053d81ceSMarshall Clow #include <cassert>
158ec49997SLouis Dionne #include <stdexcept>
168ec49997SLouis Dionne #include <string_view>
178ec49997SLouis Dionne #include <string>
188ec49997SLouis Dionne #include <type_traits>
19053d81ceSMarshall Clow
20053d81ceSMarshall Clow #include "min_allocator.h"
218ec49997SLouis Dionne #include "test_allocator.h"
228ec49997SLouis Dionne #include "test_macros.h"
238ec49997SLouis Dionne
248ec49997SLouis Dionne static_assert(!std::is_convertible<std::string_view, std::string const&>::value, "");
258ec49997SLouis Dionne static_assert(!std::is_convertible<std::string_view, std::string>::value, "");
26053d81ceSMarshall Clow
27053d81ceSMarshall Clow template <class charT>
2885e9b268SNikolas Klauser TEST_CONSTEXPR_CXX20 void
test(std::basic_string_view<charT> sv)29053d81ceSMarshall Clow test(std::basic_string_view<charT> sv)
30053d81ceSMarshall Clow {
31053d81ceSMarshall Clow typedef std::basic_string<charT, std::char_traits<charT>, test_allocator<charT> > S;
32053d81ceSMarshall Clow typedef typename S::traits_type T;
33053d81ceSMarshall Clow typedef typename S::allocator_type A;
3438590b38SEric Fiselier {
35053d81ceSMarshall Clow S s2(sv);
36053d81ceSMarshall Clow LIBCPP_ASSERT(s2.__invariants());
37053d81ceSMarshall Clow assert(s2.size() == sv.size());
38053d81ceSMarshall Clow assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
39053d81ceSMarshall Clow assert(s2.get_allocator() == A());
40053d81ceSMarshall Clow assert(s2.capacity() >= s2.size());
41053d81ceSMarshall Clow }
4238590b38SEric Fiselier {
4338590b38SEric Fiselier S s2;
4438590b38SEric Fiselier s2 = sv;
4538590b38SEric Fiselier LIBCPP_ASSERT(s2.__invariants());
4638590b38SEric Fiselier assert(s2.size() == sv.size());
4738590b38SEric Fiselier assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
4838590b38SEric Fiselier assert(s2.get_allocator() == A());
4938590b38SEric Fiselier assert(s2.capacity() >= s2.size());
5038590b38SEric Fiselier }
5138590b38SEric Fiselier }
52053d81ceSMarshall Clow
53053d81ceSMarshall Clow template <class charT, class A>
5485e9b268SNikolas Klauser TEST_CONSTEXPR_CXX20 void
test(std::basic_string_view<charT> sv,const A & a)55053d81ceSMarshall Clow test(std::basic_string_view<charT> sv, const A& a)
56053d81ceSMarshall Clow {
57053d81ceSMarshall Clow typedef std::basic_string<charT, std::char_traits<charT>, A> S;
58053d81ceSMarshall Clow typedef typename S::traits_type T;
5938590b38SEric Fiselier {
60053d81ceSMarshall Clow S s2(sv, a);
61053d81ceSMarshall Clow LIBCPP_ASSERT(s2.__invariants());
62053d81ceSMarshall Clow assert(s2.size() == sv.size());
63053d81ceSMarshall Clow assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
64053d81ceSMarshall Clow assert(s2.get_allocator() == a);
65053d81ceSMarshall Clow assert(s2.capacity() >= s2.size());
66053d81ceSMarshall Clow }
6738590b38SEric Fiselier {
6838590b38SEric Fiselier S s2(a);
6938590b38SEric Fiselier s2 = sv;
7038590b38SEric Fiselier LIBCPP_ASSERT(s2.__invariants());
7138590b38SEric Fiselier assert(s2.size() == sv.size());
7238590b38SEric Fiselier assert(T::compare(s2.data(), sv.data(), sv.size()) == 0);
7338590b38SEric Fiselier assert(s2.get_allocator() == a);
7438590b38SEric Fiselier assert(s2.capacity() >= s2.size());
7538590b38SEric Fiselier }
7638590b38SEric Fiselier }
77053d81ceSMarshall Clow
test()78*425620ccSNikolas Klauser TEST_CONSTEXPR_CXX20 bool test() {
79053d81ceSMarshall Clow {
80053d81ceSMarshall Clow typedef test_allocator<char> A;
81053d81ceSMarshall Clow typedef std::basic_string_view<char, std::char_traits<char> > SV;
82053d81ceSMarshall Clow
83053d81ceSMarshall Clow test(SV(""));
84053d81ceSMarshall Clow test(SV(""), A(2));
85053d81ceSMarshall Clow
86053d81ceSMarshall Clow test(SV("1"));
87053d81ceSMarshall Clow test(SV("1") ,A(2));
88053d81ceSMarshall Clow
89053d81ceSMarshall Clow test(SV("1234567980"));
90053d81ceSMarshall Clow test(SV("1234567980"), A(2));
91053d81ceSMarshall Clow
92053d81ceSMarshall Clow test(SV("123456798012345679801234567980123456798012345679801234567980"));
93053d81ceSMarshall Clow test(SV("123456798012345679801234567980123456798012345679801234567980"), A(2));
94053d81ceSMarshall Clow }
95053d81ceSMarshall Clow #if TEST_STD_VER >= 11
96053d81ceSMarshall Clow {
97053d81ceSMarshall Clow typedef min_allocator<char> A;
98053d81ceSMarshall Clow typedef std::basic_string_view<char, std::char_traits<char> > SV;
99053d81ceSMarshall Clow
100053d81ceSMarshall Clow test(SV(""));
101053d81ceSMarshall Clow test(SV(""), A());
102053d81ceSMarshall Clow
103053d81ceSMarshall Clow test(SV("1"));
104053d81ceSMarshall Clow test(SV("1") ,A());
105053d81ceSMarshall Clow
106053d81ceSMarshall Clow test(SV("1234567980"));
107053d81ceSMarshall Clow test(SV("1234567980"), A());
108053d81ceSMarshall Clow
109053d81ceSMarshall Clow test(SV("123456798012345679801234567980123456798012345679801234567980"));
110053d81ceSMarshall Clow test(SV("123456798012345679801234567980123456798012345679801234567980"), A());
111053d81ceSMarshall Clow }
112053d81ceSMarshall Clow #endif
1132df59c50SJF Bastien
114e85018b7SNikolas Klauser return true;
115e85018b7SNikolas Klauser }
116e85018b7SNikolas Klauser
main(int,char **)117e85018b7SNikolas Klauser int main(int, char**)
118e85018b7SNikolas Klauser {
119e85018b7SNikolas Klauser test();
120e85018b7SNikolas Klauser #if TEST_STD_VER > 17
121*425620ccSNikolas Klauser static_assert(test());
122e85018b7SNikolas Klauser #endif
123e85018b7SNikolas Klauser
1242df59c50SJF Bastien return 0;
125053d81ceSMarshall Clow }
126