/* (c) 2012-2015 Glen Joseph Fernandes Distributed under the Boost Software License, Version 1.0. http://boost.org/LICENSE_1_0.txt */ #include #include struct tag { }; template class creator { public: typedef T value_type; creator() { } template creator(const creator&) { } T* allocate(std::size_t size) { void* p = ::operator new(size * sizeof(T)); return static_cast(p); } void deallocate(T* memory, std::size_t) { void* p = memory; ::operator delete(p); } template void construct(U* memory) { void* p = memory; ::new(p) U(tag()); } template void destroy(U* memory) { memory->~U(); } }; class type { public: static unsigned int instances; explicit type(tag) { instances++; } type(const type&) { instances++; } ~type() { instances--; } }; unsigned int type::instances = 0; int main() { #if !defined(BOOST_NO_CXX11_ALLOCATOR) { boost::shared_ptr a1 = boost::allocate_shared(creator(), 3); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(a1.get() != 0); BOOST_TEST(type::instances == 3); a1.reset(); BOOST_TEST(type::instances == 0); } { boost::shared_ptr a1 = boost::allocate_shared(creator()); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(a1.get() != 0); BOOST_TEST(type::instances == 3); a1.reset(); BOOST_TEST(type::instances == 0); } { boost::shared_ptr a1 = boost::allocate_shared(creator(), 2); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 4); a1.reset(); BOOST_TEST(type::instances == 0); } { 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 == 0); } { boost::shared_ptr a1 = boost::allocate_shared(creator(), 3); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 3); a1.reset(); BOOST_TEST(type::instances == 0); } { boost::shared_ptr a1 = boost::allocate_shared(creator()); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 3); a1.reset(); BOOST_TEST(type::instances == 0); } { boost::shared_ptr a1 = boost::allocate_shared(creator(), 2); BOOST_TEST(a1.get() != 0); BOOST_TEST(a1.use_count() == 1); BOOST_TEST(type::instances == 4); a1.reset(); BOOST_TEST(type::instances == 0); } { 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 == 0); } #endif return boost::report_errors(); }