$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r54555 - in sandbox: cloneable/boost/cloneable cloneable/libs/cloneable/test monotonic/boost/ptr_container
From: christian.schladetsch_at_[hidden]
Date: 2009-06-30 20:55:42
Author: cschladetsch
Date: 2009-06-30 20:55:41 EDT (Tue, 30 Jun 2009)
New Revision: 54555
URL: http://svn.boost.org/trac/boost/changeset/54555
Log:
added cloneable/set.hpp
Added:
   sandbox/cloneable/boost/cloneable/set.hpp   (contents, props changed)
Text files modified: 
   sandbox/cloneable/boost/cloneable/forward_declarations.hpp |    19 ++++++++++++---                         
   sandbox/cloneable/libs/cloneable/test/cloneable.vcproj     |     4 +++                                     
   sandbox/cloneable/libs/cloneable/test/tests.cpp            |    50 ++++++++++++++++++++++++++++++++++++--- 
   sandbox/monotonic/boost/ptr_container/indirect_fun.hpp     |     7 +++--                                   
   sandbox/monotonic/boost/ptr_container/ptr_set_adapter.hpp  |     2                                         
   5 files changed, 70 insertions(+), 12 deletions(-)
Modified: sandbox/cloneable/boost/cloneable/forward_declarations.hpp
==============================================================================
--- sandbox/cloneable/boost/cloneable/forward_declarations.hpp	(original)
+++ sandbox/cloneable/boost/cloneable/forward_declarations.hpp	2009-06-30 20:55:41 EDT (Tue, 30 Jun 2009)
@@ -54,20 +54,31 @@
 
                 // TODO: move to boost/heterogenous/foward
                 /// a heterogenous vector of objects
-		template <
+		template 
+		<
                         class Base = default_base_type
                         , class Alloc = monotonic::allocator<int>
-			>//, class AbstractBase = abstract_cloneable<Base> >
+		>
                 struct vector;
 
                 /// a mapping of heterogenous objects to heterogenous objects
-		template <
+		template 
+		<
                         class Base = default_base_type
                         , class Pred = std::less<Base>
                         , class Alloc = monotonic::allocator<int>
-			>//, class AbstractBase = abstract_cloneable<Base> >
+		>
                 struct map;
 
+		/// a set of heterogenous objects
+		template 
+		<
+			class Base = default_base_type
+			, class Pred = std::less<Base>
+			, class Alloc = monotonic::allocator<int>
+		>
+		struct set;
+
         } // namespace cloneable
 
 } // namespace boost
Added: sandbox/cloneable/boost/cloneable/set.hpp
==============================================================================
--- (empty file)
+++ sandbox/cloneable/boost/cloneable/set.hpp	2009-06-30 20:55:41 EDT (Tue, 30 Jun 2009)
@@ -0,0 +1,138 @@
+// Copyright (C) 2009 Christian Schladetsch
+//
+//  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)
+
+#ifndef BOOST_CLONEABLE_SET_HPP
+#define BOOST_CLONEABLE_SET_HPP
+
+#include <boost/ptr_container/ptr_set.hpp>
+#include <boost/foreach.hpp>
+
+#include <boost/cloneable/detail/make_clone_allocator.hpp>
+
+namespace boost 
+{
+	namespace cloneable
+	{
+		/// a vector of heterogenous objects
+		// TODO: move to boost/heterogenous/map
+		template <class Base, class Pred, class Alloc>
+		struct set
+		{
+			typedef typename detail::make_clone_allocator<Alloc>::type allocator_type;
+			typedef Base base_type;
+			typedef Pred predicate_type;
+			typedef abstract_base<Base> abstract_base_type;
+
+			typedef ptr_set<abstract_base_type, predicate_type, allocator, allocator_type> implementation;
+
+			typedef typename implementation::value_type value_type;
+			typedef typename implementation::reference reference;
+			typedef typename implementation::const_reference const_reference;
+			typedef typename implementation::iterator iterator;
+			typedef typename implementation::const_iterator const_iterator;
+			typedef map<Base, Pred, Alloc/*, AbstractBase*/> this_type;
+
+		private:
+			implementation impl;
+
+		public:
+			set()
+			{
+			}
+			set(allocator_type a) 
+				: impl(a)
+			{
+			}
+
+			/* purposefully elided
+			template <class II>
+			set(II F, II L, allocator_type a = allocator_type());
+			*/
+
+
+		public:
+			typedef std::pair<iterator, bool> emplace_result;
+			template <class U>
+			emplace_result emplace()
+			{
+				abstract_base_type *instance = detail::construct<U,base_type>(get_allocator()).to_abstract();
+				return impl.insert(instance);
+			}
+
+			// TODO: use variadic arguments or BOOST_PP to pass ctor args
+			template <class U, class A0>
+			emplace_result emplace(A0 a0)
+			{
+				abstract_base_type *instance = detail::construct<U,base_type>(get_allocator(), a0).to_abstract();
+				return impl.insert(instance);
+			}
+			template <class U, class A0, class A1>
+			emplace_result emplace(A0 a0, A1 a1)
+			{
+				abstract_base_type *instance = detail::construct<U,base_type>(get_allocator(), a0, a1).to_abstract();
+				return impl.insert(instance);
+			}
+			template <class U, class A0, class A1, class A2>
+			emplace_result emplace(A0 a0, A1 a1, A2 a2)
+			{
+				abstract_base_type *instance = detail::construct<U,base_type>(get_allocator(), a0, a1, a2).to_abstract();
+				return impl.insert(instance);
+			}
+
+			template <class Fun>
+			Fun for_each(Fun fun)
+			{
+				BOOST_FOREACH(value_type &value, *this)
+				{
+					fun(value);
+				}
+			}
+
+			size_t size() const
+			{
+				return impl.size();
+			}
+			bool empty() const
+			{
+				return impl.empty();
+			}
+
+			iterator begin()
+			{
+				return impl.begin();
+			}
+			iterator end()
+			{
+				return impl.end();
+			}
+			const_iterator begin() const
+			{
+				return impl.begin();
+			}
+			const_iterator end() const
+			{
+				return impl.end();
+			}
+
+			iterator find(value_type const &key)
+			{
+				return impl.find(key);
+			}
+
+			typename implementation::allocator_type get_allocator()
+			{
+				return impl.get_allocator();
+			}
+		};
+	
+	} // namespace heterogenous
+
+} // namespace boost
+
+#include <boost/cloneable/detail/suffix.hpp>
+
+#endif // BOOST_CLONEABLE_SET_HPP
+
+//EOF
Modified: sandbox/cloneable/libs/cloneable/test/cloneable.vcproj
==============================================================================
--- sandbox/cloneable/libs/cloneable/test/cloneable.vcproj	(original)
+++ sandbox/cloneable/libs/cloneable/test/cloneable.vcproj	2009-06-30 20:55:41 EDT (Tue, 30 Jun 2009)
@@ -238,6 +238,10 @@
 						>
                                         </File>
                                         <File
+						RelativePath="..\..\..\boost\cloneable\set.hpp"
+						>
+					</File>
+					<File
                                                 RelativePath="..\..\..\boost\cloneable\vector.hpp"
 						>
                                         </File>
Modified: sandbox/cloneable/libs/cloneable/test/tests.cpp
==============================================================================
--- sandbox/cloneable/libs/cloneable/test/tests.cpp	(original)
+++ sandbox/cloneable/libs/cloneable/test/tests.cpp	2009-06-30 20:55:41 EDT (Tue, 30 Jun 2009)
@@ -12,6 +12,11 @@
 #include <string>
 #include <iostream>
 
+#include <boost/bind.hpp>
+#include <boost/any.hpp>
+#include <boost/variant.hpp>
+#include <boost/function.hpp>
+
 #define BOOST_HETEROGENOUS
 #include <boost/monotonic/allocator.hpp>
 #include <boost/monotonic/local.hpp>
@@ -19,11 +24,9 @@
 #include <boost/cloneable/clone.hpp>
 #include <boost/cloneable/vector.hpp>
 #include <boost/cloneable/map.hpp>
+#include <boost/cloneable/set.hpp>
+
 #include <boost/cloneable/adaptor.hpp>
-#include <boost/cloneable/allocator.hpp>
-#include <boost/bind.hpp>
-#include <boost/any.hpp>
-#include <boost/variant.hpp>
 
 #define BOOST_TEST_MODULE basic_test test
 #include <boost/test/unit_test.hpp>
@@ -493,4 +496,43 @@
         BOOST_ASSERT(boost::get<T1>(v1[1]).str == "foo");
 }
 
+namespace set_test
+{
+	struct S0 : base<S0> { };
+	struct S1 : base<S1> { };
+	struct S2 : base<S2> { };
+
+	struct set_less 
+		//: std::binary_function<default_base_type const &,default_base_type const &,bool>
+		: boost::function<bool (default_base_type const &,default_base_type const &)>
+	{
+		bool operator()(default_base_type const &a, default_base_type const &b) const
+		{
+			return &a < &b;
+		}
+	};
+}
+
+namespace boost
+{
+	namespace cloneable
+	{
+		// hax due to result_of<> issue with ptr_set and predicates
+		bool operator<(default_base_type const &a, default_base_type const &b)
+		{
+			return &a < &b;
+		}
+	}
+}
+
+BOOST_AUTO_TEST_CASE(test_set)
+{
+	using namespace set_test;
+	cloneable::set<> set;
+	set.emplace<S0>();
+	set.emplace<S1>();
+	set.emplace<S2>();
+}
+
 //EOF
+ 
\ No newline at end of file
Modified: sandbox/monotonic/boost/ptr_container/indirect_fun.hpp
==============================================================================
--- sandbox/monotonic/boost/ptr_container/indirect_fun.hpp	(original)
+++ sandbox/monotonic/boost/ptr_container/indirect_fun.hpp	2009-06-30 20:55:41 EDT (Tue, 30 Jun 2009)
@@ -17,6 +17,7 @@
 #endif
 
 #include <boost/config.hpp>
+#include <boost/utility/result_of.hpp>
 
 #ifdef BOOST_NO_SFINAE
 #else
@@ -85,7 +86,7 @@
         class Fun, 
         class Arg1, 
         class Arg2 = Arg1 
-#ifdef BOOST_NO_SFINAE
+#if 1//def BOOST_NO_SFINAE
       , class Result = bool   
 #endif           
     >
@@ -99,7 +100,7 @@
 
         void_ptr_indirect_fun( Fun f ) : fun(f)
         { }
-#ifdef BOOST_NO_SFINAE
+#if 1//def BOOST_NO_SFINAE
         Result    
 #else            
         BOOST_DEDUCED_TYPENAME result_of< Fun( Arg1 ) >::type 
@@ -110,7 +111,7 @@
             return fun( * static_cast<const Arg1*>( r ) );
         }
 
-#ifdef BOOST_NO_SFINAE
+#if 1//def BOOST_NO_SFINAE
         Result    
 #else                    
         BOOST_DEDUCED_TYPENAME result_of< Fun( Arg1, Arg2 ) >::type 
Modified: sandbox/monotonic/boost/ptr_container/ptr_set_adapter.hpp
==============================================================================
--- sandbox/monotonic/boost/ptr_container/ptr_set_adapter.hpp	(original)
+++ sandbox/monotonic/boost/ptr_container/ptr_set_adapter.hpp	2009-06-30 20:55:41 EDT (Tue, 30 Jun 2009)
@@ -405,7 +405,7 @@
         {       
             this->enforce_null_policy( x, "Null pointer in 'ptr_set::insert()'" );
             
-            auto_type ptr( x );                                
+            auto_type ptr( x, get_allocator() );                                
             std::pair<BOOST_DEDUCED_TYPENAME base_type::ptr_iterator,bool>
                  res = this->base().insert( x );       
             if( res.second )