blob: cd515aac68186628f9643dd0773989d545d0ef2b [file] [log] [blame]
//
// Boost.Pointer Container
//
// Copyright Thorsten Ottosen 2003-2005. Use, modification and
// distribution is subject to 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)
//
// For more information, see http://www.boost.org/libs/ptr_container/
//
#ifndef BOOST_PTR_CONTAINER_CLONE_ALLOCATOR_HPP
#define BOOST_PTR_CONTAINER_CLONE_ALLOCATOR_HPP
#include <boost/assert.hpp>
#include <boost/checked_delete.hpp>
#include <typeinfo>
namespace boost
{
/////////////////////////////////////////////////////////////////////////
// Clonable concept
/////////////////////////////////////////////////////////////////////////
template< class T >
inline T* new_clone( const T& r )
{
//
// @remark: if you get a compile-error here,
// it is most likely because you did not
// define new_clone( const T& ) in the namespace
// of T.
//
T* res = new T( r );
BOOST_ASSERT( typeid(r) == typeid(*res) &&
"Default new_clone() sliced object!" );
return res;
}
template< class T >
inline T* new_clone( const T* r )
{
return r ? new_clone( *r ) : 0;
}
//
// @remark: to make new_clone() work
// with scope_ptr/shared_ptr ect.
// simply overload for those types
// in the appropriate namespace.
//
template< class T >
inline void delete_clone( const T* r )
{
checked_delete( r );
}
/////////////////////////////////////////////////////////////////////////
// CloneAllocator concept
/////////////////////////////////////////////////////////////////////////
struct heap_clone_allocator
{
template< class U >
static U* allocate_clone( const U& r )
{
return new_clone( r );
}
template< class U >
static void deallocate_clone( const U* r )
{
delete_clone( r );
}
};
struct view_clone_allocator
{
template< class U >
static U* allocate_clone( const U& r )
{
return const_cast<U*>(&r);
}
template< class U >
static void deallocate_clone( const U* /*r*/ )
{
// do nothing
}
};
} // namespace 'boost'
#endif