/* * Copyright (c) 2012-2014 Glen Joseph Fernandes * glenfe at live dot com * * Distributed under the Boost Software License, * Version 1.0. (See accompanying file LICENSE_1_0.txt * or copy at http://boost.org/LICENSE_1_0.txt) */ #include #if !defined(BOOST_NO_CXX11_ALLOCATOR) #include template class creator { public: typedef T value_type; #if defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) template struct rebind { typedef creator other; }; #endif creator() { } template creator(const creator&) { } T* allocate(std::size_t size) { void* p1 = ::operator new(size * sizeof(T)); return static_cast(p1); } void deallocate(T* memory, std::size_t) { void* p1 = memory; ::operator delete(p1); } template void construct(U* memory) { void* p1 = memory; ::new(p1) U(); } template void destroy(U* memory) { memory->~U(); } }; class type { friend class creator; public: static unsigned int instances; static const type object; protected: explicit type() { instances++; } type(const type&) { instances++; } ~type() { instances--; } }; unsigned int type::instances; const type type::object; int main() { BOOST_TEST(type::instances == 1); { boost::shared_ptr a1 = boost::allocate_shared(creator(), 3); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(a1.get() != 0); BOOST_TEST(type::instances == 4); a1.reset(); BOOST_TEST(type::instances == 1); } BOOST_TEST(type::instances == 1); { boost::shared_ptr a1 = boost::allocate_shared(creator()); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(a1.get() != 0); BOOST_TEST(type::instances == 4); a1.reset(); BOOST_TEST(type::instances == 1); } BOOST_TEST(type::instances == 1); { boost::shared_ptr a1 = boost::allocate_shared(creator(), 2); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 5); a1.reset(); BOOST_TEST(type::instances == 1); } BOOST_TEST(type::instances == 1); { boost::shared_ptr a1 = boost::allocate_shared(creator()); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 5); a1.reset(); BOOST_TEST(type::instances == 1); } BOOST_TEST(type::instances == 1); { boost::shared_ptr a1 = boost::allocate_shared(creator(), 3); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 4); a1.reset(); BOOST_TEST(type::instances == 1); } BOOST_TEST(type::instances == 1); { boost::shared_ptr a1 = boost::allocate_shared(creator()); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 4); a1.reset(); BOOST_TEST(type::instances == 1); } BOOST_TEST(type::instances == 1); { boost::shared_ptr a1 = boost::allocate_shared(creator(), 2); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 5); a1.reset(); BOOST_TEST(type::instances == 1); } BOOST_TEST(type::instances == 1); { boost::shared_ptr a1 = boost::allocate_shared(creator()); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 5); a1.reset(); BOOST_TEST(type::instances == 1); } return boost::report_errors(); } #else int main() { return 0; } #endif