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