1 //===----------------------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
11 // basic_string(const basic_string& str, const Allocator& alloc); // constexpr since C++20
16 #include "test_macros.h"
17 #include "test_allocator.h"
18 #include "min_allocator.h"
20 #ifndef TEST_HAS_NO_EXCEPTIONS
24 TEST_CONSTEXPR
alloc_imp() : active(true) {}
27 T
* allocate(std::size_t n
) {
29 return static_cast<T
*>(std::malloc(n
* sizeof(T
)));
31 throw std::bad_alloc();
35 void deallocate(T
* p
, std::size_t) {
38 void activate() { active
= true; }
39 void deactivate() { active
= false; }
45 typedef std::true_type propagate_on_container_copy_assignment
;
49 TEST_CONSTEXPR
poca_alloc(alloc_imp
* imp_
) : imp(imp_
) {}
52 TEST_CONSTEXPR
poca_alloc(const poca_alloc
<U
>& other
) : imp(other
.imp
) {}
54 T
* allocate(std::size_t n
) { return imp
->allocate
<T
>(n
); }
55 void deallocate(T
* p
, std::size_t n
) { imp
->deallocate(p
, n
); }
58 template <typename T
, typename U
>
59 bool operator==(const poca_alloc
<T
>& lhs
, const poca_alloc
<U
>& rhs
) {
60 return lhs
.imp
== rhs
.imp
;
63 template <typename T
, typename U
>
64 bool operator!=(const poca_alloc
<T
>& lhs
, const poca_alloc
<U
>& rhs
) {
65 return lhs
.imp
!= rhs
.imp
;
69 TEST_CONSTEXPR_CXX20
void test_assign(S
& s1
, const S
& s2
) {
72 } catch (std::bad_alloc
&) {
80 TEST_CONSTEXPR_CXX20
void test(S s1
, const typename
S::allocator_type
& a
) {
82 LIBCPP_ASSERT(s2
.__invariants());
84 assert(s2
.capacity() >= s2
.size());
85 assert(s2
.get_allocator() == a
);
88 template <class Alloc
>
89 TEST_CONSTEXPR_CXX20
void test_string(const Alloc
& a
) {
90 typedef std::basic_string
<char, std::char_traits
<char>, Alloc
> S
;
92 test(S("1"), Alloc(a
));
93 test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), Alloc(a
));
96 TEST_CONSTEXPR_CXX20
bool test() {
97 test_string(std::allocator
<char>());
98 test_string(test_allocator
<char>());
99 test_string(test_allocator
<char>(3));
100 #if TEST_STD_VER >= 11
101 test_string(min_allocator
<char>());
104 #if TEST_STD_VER >= 11
105 # ifndef TEST_HAS_NO_EXCEPTIONS
106 if (!TEST_IS_CONSTANT_EVALUATED
) {
107 typedef poca_alloc
<char> A
;
108 typedef std::basic_string
<char, std::char_traits
<char>, A
> S
;
109 const char* p1
= "This is my first string";
110 const char* p2
= "This is my second string";
131 int main(int, char**) {
133 #if TEST_STD_VER > 17
134 static_assert(test());