//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // basic_string(const basic_string& str, const Allocator& alloc); #include #include #include "test_macros.h" #include "test_allocator.h" #include "min_allocator.h" #ifndef TEST_HAS_NO_EXCEPTIONS template struct alloc_imp { bool active; alloc_imp() : active(true) {} T* allocate(std::size_t n) { if (active) return static_cast(std::malloc(n * sizeof(T))); else throw std::bad_alloc(); } void deallocate(T* p, std::size_t) { std::free(p); } void activate () { active = true; } void deactivate() { active = false; } }; template struct poca_alloc { typedef T value_type; typedef std::true_type propagate_on_container_copy_assignment; alloc_imp *imp; poca_alloc(alloc_imp *imp_) : imp (imp_) {} template poca_alloc(const poca_alloc& other) : imp(other.imp) {} T* allocate (std::size_t n) { return imp->allocate(n);} void deallocate(T* p, std::size_t n) { imp->deallocate(p, n); } }; template bool operator==(const poca_alloc& lhs, const poca_alloc& rhs) { return lhs.imp == rhs.imp; } template bool operator!=(const poca_alloc& lhs, const poca_alloc& rhs) { return lhs.imp != rhs.imp; } template void test_assign(S &s1, const S& s2) { try { s1 = s2; } catch ( std::bad_alloc &) { return; } assert(false); } #endif template void test(S s1, const typename S::allocator_type& a) { S s2(s1, a); LIBCPP_ASSERT(s2.__invariants()); assert(s2 == s1); assert(s2.capacity() >= s2.size()); assert(s2.get_allocator() == a); } int main() { { typedef test_allocator A; typedef std::basic_string, A> S; test(S(), A(3)); test(S("1"), A(5)); test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A(7)); } #if TEST_STD_VER >= 11 { typedef min_allocator A; typedef std::basic_string, A> S; test(S(), A()); test(S("1"), A()); test(S("1234567890123456789012345678901234567890123456789012345678901234567890"), A()); } #ifndef TEST_HAS_NO_EXCEPTIONS { typedef poca_alloc A; typedef std::basic_string, A> S; const char * p1 = "This is my first string"; const char * p2 = "This is my second string"; alloc_imp imp1; alloc_imp imp2; S s1(p1, A(&imp1)); S s2(p2, A(&imp2)); assert(s1 == p1); assert(s2 == p2); imp2.deactivate(); test_assign(s1, s2); assert(s1 == p1); assert(s2 == p2); } #endif #endif }