$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r54434 - sandbox/monotonic/libs/monotonic/test/clones
From: christian.schladetsch_at_[hidden]
Date: 2009-06-28 02:11:31
Author: cschladetsch
Date: 2009-06-28 02:11:30 EDT (Sun, 28 Jun 2009)
New Revision: 54434
URL: http://svn.boost.org/trac/boost/changeset/54434
Log:
added make_cloneable_allocator
Text files modified: 
   sandbox/monotonic/libs/monotonic/test/clones/main.cpp |    48 ++++++++++++++++++++++++++++++++++++++- 
   1 files changed, 46 insertions(+), 2 deletions(-)
Modified: sandbox/monotonic/libs/monotonic/test/clones/main.cpp
==============================================================================
--- sandbox/monotonic/libs/monotonic/test/clones/main.cpp	(original)
+++ sandbox/monotonic/libs/monotonic/test/clones/main.cpp	2009-06-28 02:11:30 EDT (Sun, 28 Jun 2009)
@@ -34,6 +34,48 @@
         explicit derived2(std::string const &n) : str(n) { }
 };
 
+namespace detail2
+{
+	template <class Alloc>
+	struct cloneable_allocator : Alloc, boost::abstract_allocator
+	{
+		typedef typename Alloc::template rebind<char>::other CharAlloc;
+
+		boost::abstract_allocator::pointer allocate_bytes(size_t num_bytes, size_t alignment)
+		{
+			CharAlloc alloc;
+			// todo: alignment; this is done already for monotonic, copy that here
+			return alloc.allocate(num_bytes);
+		}
+
+		void deallocate_bytes(boost::abstract_allocator::pointer ptr)
+		{
+			CharAlloc alloc;
+			alloc.deallocate(ptr, 1);
+		}
+	};
+
+	template <class Alloc, bool>
+	struct make_cloneable_allocator
+	{		
+		typedef cloneable_allocator<Alloc> type;
+	};
+
+	template <class Alloc>
+	struct make_cloneable_allocator<Alloc, true>
+	{
+		typedef Alloc type;
+	};
+}
+
+template <class Alloc>
+struct make_cloneable_allocator
+{
+	typedef boost::is_convertible<Alloc *, boost::abstract_allocator *> is_convertible;
+	BOOST_STATIC_CONSTANT(bool, is_cloneable = is_convertible::value);
+	typedef typename detail2::make_cloneable_allocator<Alloc, is_cloneable>::type type;
+};
+
 /*
 
 namespace boost { namespace ptr_container {
@@ -48,11 +90,13 @@
 
 int main()
 {
-	typedef ptr_vector<cloneable::common_base, cloneable::allocator, monotonic::allocator<int> > vec;
+	//typedef make_cloneable_allocator<std::allocator<int> >::type alloc_type;
+	typedef make_cloneable_allocator<monotonic::allocator<int> >::type alloc_type;
+	typedef ptr_vector<cloneable::common_base, cloneable::allocator, alloc_type > vec;
 
         {
                 vec bases;
-		BOOST_ASSERT(bases.get_allocator().get_storage() == &monotonic::static_storage<>::get_storage());
+//		BOOST_ASSERT(bases.get_allocator().get_storage() == &monotonic::static_storage<>::get_storage());
 
                 //! bases.push_back(new derived(42));					// this doesn't use the custom allocator!
                 //! derived *obj = bases.get_allocator().allocate(1);	// this has to be recast