123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- #include <boost/config.hpp>
- // shared_ptr_alloc2_test.cpp
- //
- // Copyright (c) 2005 Peter Dimov
- //
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/shared_ptr.hpp>
- #include <memory>
- #include <cstddef>
- // test_allocator
- struct test_allocator_base
- {
- int id_;
- static int last_global_id_;
- static int count_;
- explicit test_allocator_base( int id ): id_( id )
- {
- }
- };
- int test_allocator_base::last_global_id_ = 0;
- int test_allocator_base::count_ = 0;
- template<class T> class test_allocator: public test_allocator_base
- {
- public:
- typedef T * pointer;
- typedef T const * const_pointer;
- typedef T & reference;
- typedef T const & const_reference;
- typedef T value_type;
- typedef std::size_t size_type;
- typedef std::ptrdiff_t difference_type;
- private:
- static T * last_pointer_;
- static std::size_t last_n_;
- static int last_id_;
- public:
- template<class U> struct rebind
- {
- typedef test_allocator<U> other;
- };
- pointer address( reference r ) const
- {
- return &r;
- }
- const_pointer address( const_reference s ) const
- {
- return &s;
- }
- explicit test_allocator( int id = 0 ): test_allocator_base( id )
- {
- }
- template<class U> test_allocator( test_allocator<U> const & r ): test_allocator_base( r )
- {
- }
- template<class U> test_allocator & operator=( test_allocator<U> const & r )
- {
- test_allocator_base::operator=( r );
- return *this;
- }
- void deallocate( pointer p, size_type n )
- {
- BOOST_TEST( p == last_pointer_ );
- BOOST_TEST( n == last_n_ );
- BOOST_TEST( id_ == last_id_ );
- --count_;
- ::operator delete( p );
- }
- pointer allocate( size_type n, void const * = 0 )
- {
- T * p = static_cast< T* >( ::operator new( n * sizeof( T ) ) );
- last_pointer_ = p;
- last_n_ = n;
- last_id_ = id_;
- last_global_id_ = id_;
- ++count_;
- return p;
- }
- void construct( pointer p, T const & t )
- {
- ::new( p ) T( t );
- }
- void destroy( pointer p )
- {
- p->~T();
- }
- size_type max_size() const
- {
- return size_type( -1 ) / sizeof( T );
- }
- };
- template<class T> T * test_allocator<T>::last_pointer_ = 0;
- template<class T> std::size_t test_allocator<T>::last_n_ = 0;
- template<class T> int test_allocator<T>::last_id_ = 0;
- template<class T, class U> inline bool operator==( test_allocator<T> const & a1, test_allocator<U> const & a2 )
- {
- return a1.id_ == a2.id_;
- }
- template<class T, class U> inline bool operator!=( test_allocator<T> const & a1, test_allocator<U> const & a2 )
- {
- return a1.id_ != a2.id_;
- }
- template<> class test_allocator<void>: public test_allocator_base
- {
- public:
- typedef void * pointer;
- typedef void const * const_pointer;
- typedef void value_type;
- template<class U> struct rebind
- {
- typedef test_allocator<U> other;
- };
- explicit test_allocator( int id = 0 ): test_allocator_base( id )
- {
- }
- template<class U> test_allocator( test_allocator<U> const & r ): test_allocator_base( r )
- {
- }
- template<class U> test_allocator & operator=( test_allocator<U> const & r )
- {
- test_allocator_base::operator=( r );
- return *this;
- }
- };
- //
- struct X
- {
- static int instances;
- X()
- {
- ++instances;
- }
- ~X()
- {
- --instances;
- }
- private:
- X( X const & );
- X & operator=( X const & );
- };
- int X::instances = 0;
- int main()
- {
- BOOST_TEST( X::instances == 0 );
- boost::shared_ptr<void> pv( new X, boost::checked_deleter<X>(), std::allocator<X>() );
- BOOST_TEST( X::instances == 1 );
- pv.reset( new X, boost::checked_deleter<X>(), test_allocator<float>( 42 ) );
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( test_allocator_base::last_global_id_ == 42 );
- BOOST_TEST( test_allocator_base::count_ > 0 );
- pv.reset();
- BOOST_TEST( X::instances == 0 );
- BOOST_TEST( test_allocator_base::count_ == 0 );
- pv.reset( new X, boost::checked_deleter<X>(), test_allocator<void>( 43 ) );
- BOOST_TEST( X::instances == 1 );
- BOOST_TEST( test_allocator_base::last_global_id_ == 43 );
- pv.reset( new X, boost::checked_deleter<X>(), std::allocator<void>() );
- BOOST_TEST( X::instances == 1 );
- pv.reset();
- BOOST_TEST( X::instances == 0 );
- return boost::report_errors();
- }
|