15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 35a83710eSEric Fiselier // The LLVM Compiler Infrastructure 45a83710eSEric Fiselier // 55a83710eSEric Fiselier // This file is dual licensed under the MIT and the University of Illinois Open 65a83710eSEric Fiselier // Source Licenses. See LICENSE.TXT for details. 75a83710eSEric Fiselier // 85a83710eSEric Fiselier //===----------------------------------------------------------------------===// 95a83710eSEric Fiselier 105a83710eSEric Fiselier // <string> 115a83710eSEric Fiselier 125a83710eSEric Fiselier // basic_string(const basic_string& str, const Allocator& alloc); 135a83710eSEric Fiselier 145a83710eSEric Fiselier #include <string> 155a83710eSEric Fiselier #include <cassert> 165a83710eSEric Fiselier 171f4231f8SEric Fiselier #include "test_macros.h" 185a83710eSEric Fiselier #include "test_allocator.h" 195a83710eSEric Fiselier #include "min_allocator.h" 205a83710eSEric Fiselier 21*d107be84SMarshall Clow template <class T> 22*d107be84SMarshall Clow struct alloc_imp { 23*d107be84SMarshall Clow bool active; 24*d107be84SMarshall Clow 25*d107be84SMarshall Clow alloc_imp() : active(true) {} 26*d107be84SMarshall Clow 27*d107be84SMarshall Clow T* allocate(std::size_t n) 28*d107be84SMarshall Clow { 29*d107be84SMarshall Clow if (active) 30*d107be84SMarshall Clow return static_cast<T*>(std::malloc(n * sizeof(T))); 31*d107be84SMarshall Clow else 32*d107be84SMarshall Clow throw std::bad_alloc(); 33*d107be84SMarshall Clow } 34*d107be84SMarshall Clow 35*d107be84SMarshall Clow void deallocate(T* p, std::size_t) { std::free(p); } 36*d107be84SMarshall Clow void activate () { active = true; } 37*d107be84SMarshall Clow void deactivate() { active = false; } 38*d107be84SMarshall Clow }; 39*d107be84SMarshall Clow 40*d107be84SMarshall Clow template <class T> 41*d107be84SMarshall Clow struct poca_alloc { 42*d107be84SMarshall Clow typedef T value_type; 43*d107be84SMarshall Clow typedef std::true_type propagate_on_container_copy_assignment; 44*d107be84SMarshall Clow 45*d107be84SMarshall Clow alloc_imp<T> *imp; 46*d107be84SMarshall Clow 47*d107be84SMarshall Clow poca_alloc(alloc_imp<T> *imp) : imp (imp) {} 48*d107be84SMarshall Clow 49*d107be84SMarshall Clow template <class U> 50*d107be84SMarshall Clow poca_alloc(const poca_alloc<U>& other) : imp(other.imp) {} 51*d107be84SMarshall Clow 52*d107be84SMarshall Clow T* allocate (std::size_t n) { return imp->allocate(n);} 53*d107be84SMarshall Clow void deallocate(T* p, std::size_t n) { imp->deallocate(p, n); } 54*d107be84SMarshall Clow }; 55*d107be84SMarshall Clow 56*d107be84SMarshall Clow template <typename T, typename U> 57*d107be84SMarshall Clow bool operator==(const poca_alloc<T>& lhs, const poca_alloc<U>& rhs) 58*d107be84SMarshall Clow { 59*d107be84SMarshall Clow return lhs.imp == rhs.imp; 60*d107be84SMarshall Clow } 61*d107be84SMarshall Clow 62*d107be84SMarshall Clow template <typename T, typename U> 63*d107be84SMarshall Clow bool operator!=(const poca_alloc<T>& lhs, const poca_alloc<U>& rhs) 64*d107be84SMarshall Clow { 65*d107be84SMarshall Clow return lhs.imp != rhs.imp; 66*d107be84SMarshall Clow } 67*d107be84SMarshall Clow 68*d107be84SMarshall Clow 69*d107be84SMarshall Clow 705a83710eSEric Fiselier template <class S> 715a83710eSEric Fiselier void 725a83710eSEric Fiselier test(S s1, const typename S::allocator_type& a) 735a83710eSEric Fiselier { 745a83710eSEric Fiselier S s2(s1, a); 751f4231f8SEric Fiselier LIBCPP_ASSERT(s2.__invariants()); 765a83710eSEric Fiselier assert(s2 == s1); 775a83710eSEric Fiselier assert(s2.capacity() >= s2.size()); 785a83710eSEric Fiselier assert(s2.get_allocator() == a); 795a83710eSEric Fiselier } 805a83710eSEric Fiselier 81*d107be84SMarshall Clow #ifndef TEST_HAS_NO_EXCEPTIONS 82*d107be84SMarshall Clow template <class S> 83*d107be84SMarshall Clow void test_assign(S &s1, const S& s2) 84*d107be84SMarshall Clow { 85*d107be84SMarshall Clow try { s1 = s2; } 86*d107be84SMarshall Clow catch ( std::bad_alloc &) { return; } 87*d107be84SMarshall Clow assert(false); 88*d107be84SMarshall Clow } 89*d107be84SMarshall Clow #endif 90*d107be84SMarshall Clow 915a83710eSEric Fiselier int main() 925a83710eSEric Fiselier { 935a83710eSEric Fiselier { 945a83710eSEric Fiselier typedef test_allocator<char> A; 955a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, A> S; 965a83710eSEric Fiselier test(S(), A(3)); 975a83710eSEric Fiselier test(S("1"), A(5)); 985a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A(7)); 995a83710eSEric Fiselier } 1001f4231f8SEric Fiselier #if TEST_STD_VER >= 11 1015a83710eSEric Fiselier { 1025a83710eSEric Fiselier typedef min_allocator<char> A; 1035a83710eSEric Fiselier typedef std::basic_string<char, std::char_traits<char>, A> S; 1045a83710eSEric Fiselier test(S(), A()); 1055a83710eSEric Fiselier test(S("1"), A()); 1065a83710eSEric Fiselier test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A()); 1075a83710eSEric Fiselier } 108*d107be84SMarshall Clow 109*d107be84SMarshall Clow #ifndef TEST_HAS_NO_EXCEPTIONS 110*d107be84SMarshall Clow { 111*d107be84SMarshall Clow typedef poca_alloc<char> A; 112*d107be84SMarshall Clow typedef std::basic_string<char, std::char_traits<char>, A> S; 113*d107be84SMarshall Clow const char * p1 = "This is my first string"; 114*d107be84SMarshall Clow const char * p2 = "This is my second string"; 115*d107be84SMarshall Clow 116*d107be84SMarshall Clow alloc_imp<char> imp1; 117*d107be84SMarshall Clow alloc_imp<char> imp2; 118*d107be84SMarshall Clow S s1(p1, A(&imp1)); 119*d107be84SMarshall Clow S s2(p2, A(&imp2)); 120*d107be84SMarshall Clow 121*d107be84SMarshall Clow assert(s1 == p1); 122*d107be84SMarshall Clow assert(s2 == p2); 123*d107be84SMarshall Clow 124*d107be84SMarshall Clow imp2.deactivate(); 125*d107be84SMarshall Clow test_assign(s1, s2); 126*d107be84SMarshall Clow assert(s1 == p1); 127*d107be84SMarshall Clow assert(s2 == p2); 128*d107be84SMarshall Clow } 129*d107be84SMarshall Clow #endif 1305a83710eSEric Fiselier #endif 1315a83710eSEric Fiselier } 132