1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <string> 10 // UNSUPPORTED: c++03, c++11, c++14 11 12 // template<class InputIterator> 13 // basic_string(InputIterator begin, InputIterator end, 14 // const Allocator& a = Allocator()); 15 16 // template<class charT, 17 // class traits, 18 // class Allocator = allocator<charT> 19 // > 20 // basic_string(basic_string_view<charT, traits>, const Allocator& = Allocator()) 21 // -> basic_string<charT, traits, Allocator>; 22 // 23 // The deduction guide shall not participate in overload resolution if Allocator 24 // is a type that does not qualify as an allocator. 25 26 #include <string> 27 #include <string_view> 28 #include <iterator> 29 #include <memory> 30 #include <type_traits> 31 #include <cassert> 32 #include <cstddef> 33 34 #include "test_macros.h" 35 #include "test_allocator.h" 36 #include "min_allocator.h" 37 38 bool test() { 39 { 40 std::string_view sv = "12345678901234"; 41 std::basic_string s1(sv); 42 using S = decltype(s1); // what type did we get? 43 static_assert(std::is_same_v<S::value_type, char>, ""); 44 static_assert(std::is_same_v<S::traits_type, std::char_traits<char>>, ""); 45 static_assert(std::is_same_v<S::allocator_type, std::allocator<char>>, ""); 46 assert(s1.size() == sv.size()); 47 assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0); 48 } 49 50 { 51 std::string_view sv = "12345678901234"; 52 std::basic_string s1{sv, std::allocator<char>{}}; 53 using S = decltype(s1); // what type did we get? 54 static_assert(std::is_same_v<S::value_type, char>, ""); 55 static_assert(std::is_same_v<S::traits_type, std::char_traits<char>>, ""); 56 static_assert(std::is_same_v<S::allocator_type, std::allocator<char>>, ""); 57 assert(s1.size() == sv.size()); 58 assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0); 59 } 60 #ifndef TEST_HAS_NO_WIDE_CHARACTERS 61 { 62 std::wstring_view sv = L"12345678901234"; 63 std::basic_string s1{sv, test_allocator<wchar_t>{}}; 64 using S = decltype(s1); // what type did we get? 65 static_assert(std::is_same_v<S::value_type, wchar_t>, ""); 66 static_assert(std::is_same_v<S::traits_type, std::char_traits<wchar_t>>, ""); 67 static_assert(std::is_same_v<S::allocator_type, test_allocator<wchar_t>>, ""); 68 assert(s1.size() == sv.size()); 69 assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0); 70 } 71 #endif 72 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L 73 { 74 std::u8string_view sv = u8"12345678901234"; 75 std::basic_string s1{sv, min_allocator<char8_t>{}}; 76 using S = decltype(s1); // what type did we get? 77 static_assert(std::is_same_v<S::value_type, char8_t>, ""); 78 static_assert(std::is_same_v<S::traits_type, std::char_traits<char8_t>>, ""); 79 static_assert(std::is_same_v<S::allocator_type, min_allocator<char8_t>>, ""); 80 assert(s1.size() == sv.size()); 81 assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0); 82 } 83 #endif 84 { 85 std::u16string_view sv = u"12345678901234"; 86 std::basic_string s1{sv, min_allocator<char16_t>{}}; 87 using S = decltype(s1); // what type did we get? 88 static_assert(std::is_same_v<S::value_type, char16_t>, ""); 89 static_assert(std::is_same_v<S::traits_type, std::char_traits<char16_t>>, ""); 90 static_assert(std::is_same_v<S::allocator_type, min_allocator<char16_t>>, ""); 91 assert(s1.size() == sv.size()); 92 assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0); 93 } 94 { 95 std::u32string_view sv = U"12345678901234"; 96 std::basic_string s1{sv, explicit_allocator<char32_t>{}}; 97 using S = decltype(s1); // what type did we get? 98 static_assert(std::is_same_v<S::value_type, char32_t>, ""); 99 static_assert(std::is_same_v<S::traits_type, std::char_traits<char32_t>>, ""); 100 static_assert(std::is_same_v<S::allocator_type, explicit_allocator<char32_t>>, ""); 101 assert(s1.size() == sv.size()); 102 assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0); 103 } 104 105 return true; 106 } 107 108 int main(int, char**) 109 { 110 test(); 111 #if TEST_STD_VER > 17 112 // static_assert(test()); 113 #endif 114 115 return 0; 116 } 117