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 <algorithm> 14053d81ceSMarshall Clow #include <cassert> 15*8ec49997SLouis Dionne #include <stdexcept> 16*8ec49997SLouis Dionne #include <string_view> 17*8ec49997SLouis Dionne #include <string> 18*8ec49997SLouis Dionne #include <type_traits> 19053d81ceSMarshall Clow 20053d81ceSMarshall Clow #include "min_allocator.h" 21*8ec49997SLouis Dionne #include "test_allocator.h" 22*8ec49997SLouis Dionne #include "test_macros.h" 23*8ec49997SLouis Dionne 24*8ec49997SLouis Dionne static_assert(!std::is_convertible<std::string_view, std::string const&>::value, ""); 25*8ec49997SLouis 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 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 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 78e85018b7SNikolas Klauser 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 117e85018b7SNikolas Klauser int main(int, char**) 118e85018b7SNikolas Klauser { 119e85018b7SNikolas Klauser test(); 120e85018b7SNikolas Klauser #if TEST_STD_VER > 17 121e85018b7SNikolas Klauser // static_assert(test()); 122e85018b7SNikolas Klauser #endif 123e85018b7SNikolas Klauser 1242df59c50SJF Bastien return 0; 125053d81ceSMarshall Clow } 126