$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r70938 - in sandbox/assign_v2/boost/assign/v2: . detail/functor interpreter put
From: erwann.rogard_at_[hidden]
Date: 2011-04-03 11:13:33
Author: e_r
Date: 2011-04-03 11:13:31 EDT (Sun, 03 Apr 2011)
New Revision: 70938
URL: http://svn.boost.org/trac/boost/changeset/70938
Log:
upd assign_v2
Added:
   sandbox/assign_v2/boost/assign/v2/detail/functor/iterate.hpp   (contents, props changed)
   sandbox/assign_v2/boost/assign/v2/interpreter/csv.hpp   (contents, props changed)
   sandbox/assign_v2/boost/assign/v2/put/
   sandbox/assign_v2/boost/assign/v2/put/csv_put.hpp   (contents, props changed)
   sandbox/assign_v2/boost/assign/v2/put/delayed_csv_put.hpp   (contents, props changed)
   sandbox/assign_v2/boost/assign/v2/put/put.hpp   (contents, props changed)
Text files modified: 
   sandbox/assign_v2/boost/assign/v2/pipe.hpp |     2 --                                      
   1 files changed, 0 insertions(+), 2 deletions(-)
Added: sandbox/assign_v2/boost/assign/v2/detail/functor/iterate.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/functor/iterate.hpp	2011-04-03 11:13:31 EDT (Sun, 03 Apr 2011)
@@ -0,0 +1,43 @@
+//////////////////////////////////////////////////////////////////////////////
+//  Boost.Assign v2                                                         //
+//                                                                          //
+//  Copyright (C) 2003-2004 Thorsten Ottosen                                //
+//  Copyright (C) 2010 Erwann Rogard                                        //
+//  Use, modification and distribution are 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)        //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_DETAIL_FUNCTOR_ITERATE_ER_2010_HPP
+#define BOOST_ASSIGN_V2_DETAIL_FUNCTOR_ITERATE_ER_2010_HPP
+#include <cstddef>
+
+namespace boost{
+namespace assign{
+namespace v2{
+//syntax_detail_functor_iterate
+namespace functor_aux{
+
+    struct iterate
+    {
+        
+        typedef std::size_t result_type;
+        
+        iterate():i( 0 ){}
+        iterate( result_type i_ ):i( i_ ){}
+        
+        result_type operator()()const{ return this->i++; }
+
+        typedef iterate type;
+
+        private:
+        mutable result_type i;
+
+    };
+
+}// functor_aux
+//]
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_DETAIL_FUNCTOR_ITERATE_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/interpreter/csv.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/interpreter/csv.hpp	2011-04-03 11:13:31 EDT (Sun, 03 Apr 2011)
@@ -0,0 +1,98 @@
+//////////////////////////////////////////////////////////////////////////////
+//  Boost.Assign v2                                                         //
+//                                                                          //
+//  Copyright (C) 2003-2004 Thorsten Ottosen                                //
+//  Copyright (C) 2010 Erwann Rogard                                        //
+//  Use, modification and distribution are 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)        //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_INTERPRETER_CSV_ER_2010_HPP
+#define BOOST_ASSIGN_V2_INTERPRETER_CSV_ER_2010_HPP
+#include <boost/assign/v2/detail/config/enable_cpp0x.hpp>
+#include <boost/assign/v2/detail/pp/ignore.hpp>
+#include <boost/assign/v2/interpreter/fwd.hpp>
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#if BOOST_ASSIGN_V2_ENABLE_CPP0X
+#include <utility>
+#else
+#include <boost/assign/v2/detail/config/limit_csv_arity.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition.hpp>
+#endif // BOOST_ASSIGN_V2_ENABLE_CPP0X
+
+namespace boost{
+namespace assign{
+namespace v2{
+//[syntax_interpreter_csv
+namespace interpreter_aux{
+
+	template<typename C, typename F, typename MTag, typename DTag, typename D>
+	void csv( 
+    	interpreter_crtp<C, F, MTag, DTag, D> const& interpreter
+    )/*<-*/
+    {
+    }BOOST_ASSIGN_V2_IGNORE(/*->*/;/*<-*/)/*->*/
+
+//<-
+#if BOOST_ASSIGN_V2_ENABLE_CPP0X
+//->
+
+	template<typename C, typename F, typename MTag, typename DTag, typename D>
+    void csv( 
+    	interpreter_crtp<C, F, MTag, DTag, D> const& interpreter, 
+    	T&& t, Args&&... args 
+    )/*<-*/
+    {
+        return csv( interpreter( t ), std::forward<Args>( args )... );
+    }BOOST_ASSIGN_V2_IGNORE(/*->*/;/*<-*/)/*->*/
+
+//]
+#else
+#define BOOST_ASSIGN_V2_MACRO1(z, i, data) BOOST_PP_CAT(T, i) data
+#define BOOST_ASSIGN_V2_MACRO2(z, i, data) ( BOOST_PP_CAT(_, i) )
+#define BOOST_ASSIGN_V2_MACRO3(z, N, data)\
+\
+    template<\
+    	typename C, typename F, typename MTag, typename DTag, typename D\
+        BOOST_PP_ENUM_TRAILING_PARAMS(N, typename T)\
+    >\
+    void csv( \
+    	interpreter_crtp<C, F, MTag, DTag, D> const& interpreter\
+        BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, T, & _)\
+    )\
+    {\
+        interpreter BOOST_PP_REPEAT(N, BOOST_ASSIGN_V2_MACRO2, ~ );\
+    }\
+\
+    template<\
+    	typename C, typename F, typename MTag, typename DTag, typename D\
+        BOOST_PP_ENUM_TRAILING_PARAMS(N, typename T)\
+    >\
+    void csv( \
+    	interpreter_crtp<C, F, MTag, DTag, D> const& interpreter\
+        BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(N, T, const & _)\
+    )\
+    {\
+        interpreter BOOST_PP_REPEAT(N, BOOST_ASSIGN_V2_MACRO2, ~ );\
+    }\
+\
+/**/
+BOOST_PP_REPEAT_FROM_TO(
+    1,
+    BOOST_PP_INC(BOOST_ASSIGN_V2_LIMIT_CSV_ARITY),
+    BOOST_ASSIGN_V2_MACRO3,
+    ~
+)
+#undef BOOST_ASSIGN_V2_MACRO1
+#undef BOOST_ASSIGN_V2_MACRO2
+#undef BOOST_ASSIGN_V2_MACRO3
+#endif // BOOST_ASSIGN_V2_ENABLE_CPP0X
+
+}// interpreter_aux
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_INTERPRETER_CSV_ER_2010_HPP
Modified: sandbox/assign_v2/boost/assign/v2/pipe.hpp
==============================================================================
--- sandbox/assign_v2/boost/assign/v2/pipe.hpp	(original)
+++ sandbox/assign_v2/boost/assign/v2/pipe.hpp	2011-04-03 11:13:31 EDT (Sun, 03 Apr 2011)
@@ -10,8 +10,6 @@
 #ifndef BOOST_ASSIGN_V2_PIPE_ER_2010_HPP
 #define BOOST_ASSIGN_V2_PIPE_ER_2010_HPP
 
-#include <boost/assign/v2/pipe/chain.hpp>
-#include <boost/assign/v2/pipe/convert.hpp>
 #include <boost/assign/v2/pipe/csv_put.hpp>
 
 #endif // BOOST_ASSIGN_V2_PIPE_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/put/csv_put.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/put/csv_put.hpp	2011-04-03 11:13:31 EDT (Sun, 03 Apr 2011)
@@ -0,0 +1,189 @@
+//////////////////////////////////////////////////////////////////////////////
+//  Boost.Assign v2                                                         //
+//                                                                          //
+//  Copyright (C) 2003-2004 Thorsten Ottosen                                //
+//  Copyright (C) 2010 Erwann Rogard                                        //
+//  Use, modification and distribution are 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)        //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_PUT_CSV_PUT_ER_2010_HPP
+#define BOOST_ASSIGN_V2_PUT_CSV_PUT_ER_2010_HPP
+#include <boost/assign/v2/detail/config/enable_cpp0x.hpp>
+#include <boost/assign/v2/interpreter/csv.hpp>
+#include <boost/assign/v2/put/put.hpp>
+#include <boost/assign/v2/option/data_generator.hpp>
+#include <boost/assign/v2/option/list.hpp>
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/utility/enable_if.hpp>
+#if BOOST_ASSIGN_V2_ENABLE_CPP0X
+#include <utility>
+#else
+#include <boost/assign/v2/detail/config/limit_csv_arity.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/repetition.hpp>
+#endif // BOOST_ASSIGN_V2_ENABLE_CPP0X
+
+namespace boost{
+namespace assign{
+namespace v2{
+//[syntax_csv_put
+namespace interpreter_aux{
+
+	template<typename F>
+    struct csv_suitable
+    	: ::boost::mpl::true_
+    {};
+
+	template<typename T, typename K, typename M>
+    struct csv_suitable<
+		functor_aux::pair<T, K, M>
+    > 
+    	: ::boost::mpl::false_
+    {};
+
+namespace result_of{
+
+	template<typename C, typename F, typename MTag, typename DTag>
+	struct if_make_csv_suitable : ::boost::mpl::identity<
+    	put_interpreter<C, F, MTag, DTag>
+    >
+    {};
+
+	template<typename C, typename F, typename MTag, typename DTag>
+	struct else_make_csv_suitable : result_of::option_data_generator<
+    	put_interpreter<C, F, MTag, DTag>, C, value_
+    >
+    {};
+
+	template<typename C, typename F, typename MTag, typename DTag>
+	struct make_csv_suitable : ::boost::mpl::eval_if<
+		csv_suitable<F>,
+        if_make_csv_suitable<C, F, MTag, DTag>,
+        else_make_csv_suitable<C, F, MTag, DTag>
+    >{};
+
+}// result_of
+
+	template<typename C, typename F, typename MTag, typename DTag>
+    typename result_of::if_make_csv_suitable<C, F, MTag, DTag>::type
+	make_csv_suitable( 
+    	put_interpreter<C, F, MTag, DTag> const& interpreter, 
+        boost::mpl::true_ suitable
+    )
+    {
+		return interpreter;
+	}
+
+	template<typename C, typename F, typename MTag, typename DTag>
+    typename result_of::else_make_csv_suitable<C, F, MTag, DTag>::type
+	make_csv_suitable( 
+    	put_interpreter<C, F, MTag, DTag> const& interpreter, 
+        boost::mpl::false_ suitable
+    )
+    {
+		return interpreter % ( _data = _value );
+	}
+
+	template<typename C, typename F, typename MTag, typename DTag>
+    typename result_of::make_csv_suitable<C, F, MTag, DTag>::type
+	make_csv_suitable( put_interpreter<C, F, MTag, DTag> const& interpreter)
+    {
+		return make_csv_suitable( 
+        	interpreter, 
+            typename csv_suitable<F>::type() 
+        );
+    }
+
+	template<typename C>
+    void csv_put( C& cont ){}
+
+//<-
+#if BOOST_ASSIGN_V2_ENABLE_CPP0X
+//->
+
+
+	template<typename C, typename T, typename Args>
+    typename boost::disable_if< is_option_listable<T> >::type
+    csv_put( C& cont, T&& t, Args&&... args)
+    {
+    	csv(
+    		make_csv_suitable( put( cont ) ),
+            std::forward<T>( t ),
+          	std::forward<Args>( args )...  
+        );
+    }
+
+	template<typename C, typename Options, typename Args>
+    typename boost::enable_if< is_option_listable<Options> >::type
+    csv_put( C& cont, Options&& options, Args&&... args)
+    {
+    	csv(
+    		make_csv_suitable( 
+        		options.apply( put( cont ) )
+        	),
+          	std::forward<Args>( args )...  
+        );
+    }
+
+//]
+#else
+#define BOOST_ASSIGN_V2_MACRO1(z, i, data) BOOST_PP_CAT(T, i) data
+#define BOOST_ASSIGN_V2_MACRO2(z, i, data) ( BOOST_PP_CAT(_, i) )
+#define BOOST_ASSIGN_V2_MACRO3(z, N, data)\
+    template<typename C, BOOST_PP_ENUM_PARAMS(N, typename T)>\
+    typename boost::disable_if< is_option_listable<T0> >::type\
+    csv_put( C& cont, BOOST_PP_ENUM_BINARY_PARAMS(N, T, & _) )\
+    {\
+        csv(\
+        	make_csv_suitable( put( cont ) ) \
+        	, BOOST_PP_ENUM_PARAMS(N, _)\
+        );\
+    }\
+    template<typename C, typename Os, BOOST_PP_ENUM_PARAMS(N, typename T)>\
+    typename boost::enable_if< is_option_listable<Os> >::type\
+    csv_put( C& cont, Os const& options, BOOST_PP_ENUM_BINARY_PARAMS(N, T, & _) )\
+    {\
+        csv(\
+        	make_csv_suitable( put( cont ) % options ) \
+        	, BOOST_PP_ENUM_PARAMS(N, _)\
+        );\
+    }\
+    template<typename C, BOOST_PP_ENUM_PARAMS(N, typename T)>\
+    typename boost::disable_if< is_option_listable<T0> >::type\
+    csv_put( C& cont, BOOST_PP_ENUM_BINARY_PARAMS(N, T, const & _) )\
+    {\
+        csv(\
+        	make_csv_suitable( put( cont ) ) \
+        	, BOOST_PP_ENUM_PARAMS(N, _)\
+        );\
+    }\
+    template<typename C, typename Os, BOOST_PP_ENUM_PARAMS(N, typename T)>\
+    typename boost::enable_if< is_option_listable<Os> >::type\
+    csv_put( C& cont, Os const& options, BOOST_PP_ENUM_BINARY_PARAMS(N, T, const & _) )\
+    {\
+        csv(\
+        	make_csv_suitable( put( cont ) % options ) \
+        	, BOOST_PP_ENUM_PARAMS(N, _)\
+        );\
+    }\
+/**/
+BOOST_PP_REPEAT_FROM_TO(
+    1,
+    BOOST_PP_INC(BOOST_ASSIGN_V2_LIMIT_CSV_ARITY),
+    BOOST_ASSIGN_V2_MACRO3,
+    ~
+)
+#undef BOOST_ASSIGN_V2_MACRO1
+#undef BOOST_ASSIGN_V2_MACRO2
+#undef BOOST_ASSIGN_V2_MACRO3
+#endif // BOOST_ASSIGN_V2_ENABLE_CPP0X
+
+}// interpreter_aux
+using interpreter_aux::csv_put;
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_PUT_CSV_PUT_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/put/delayed_csv_put.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/put/delayed_csv_put.hpp	2011-04-03 11:13:31 EDT (Sun, 03 Apr 2011)
@@ -0,0 +1,219 @@
+//////////////////////////////////////////////////////////////////////////////
+//  Boost.Assign v2                                                         //
+//                                                                          //
+//  Copyright (C) 2003-2004 Thorsten Ottosen                                //
+//  Copyright (C) 2010 Erwann Rogard                                        //
+//  Use, modification and distribution are 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)        //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_PUT_DELAYED_CSV_PUT_HPP_ER_2010
+#define BOOST_ASSIGN_V2_PUT_DELAYED_CSV_PUT_HPP_ER_2010
+#include <boost/assign/v2/detail/config/enable_cpp0x.hpp>
+#include <boost/assign/v2/detail/keyword.hpp>
+#include <boost/assign/v2/detail/traits.hpp>
+#include <boost/assign/v2/put/put.hpp>
+#include <boost/assign/v2/option/list.hpp>
+#include <boost/assign/v2/option/data_generator.hpp>
+#include <boost/assign/v2/ref/array/as_arg_list.hpp>
+#include <boost/assign/v2/ref/array/csv_array.hpp>
+#include <boost/assign/v2/ref/wrapper/copy.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/vector/vector0.hpp>
+#if !BOOST_ASSIGN_V2_ENABLE_CPP0X
+#include <boost/assign/v2/detail/config/limit_csv_arity.hpp>
+#include <boost/mpl/aux_/na.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/repetition.hpp>
+#endif
+
+namespace boost{
+    struct use_default;
+namespace assign{
+namespace v2{
+//[syntax_pipe_csv_put
+namespace interpreter_aux{
+
+    typedef ref::array_aux::size_type arg_list_size_type;
+
+    template<typename H, typename Tail, arg_list_size_type N, typename U>
+    struct arg_list : list_option<H, Tail>/*<-*/
+    {
+        typedef list_option<H, Tail> list_option_;
+        typedef typename v2::ref::nth_result_of::csv_array<
+            N, U
+        >::type arg_list_cont_type; //notice it's arg, not args
+
+        arg_list(){}
+        arg_list(list_option_ const& l, arg_list_cont_type const& a)
+            : list_option_( l ), 
+            arg_list_cont_( a )
+        {}
+
+        arg_list_cont_type const& arg_list_cont() const
+        {
+            return this->arg_list_cont_;
+        }
+
+        protected:
+        arg_list_cont_type arg_list_cont_;
+
+    }/*->*/;
+
+    template<
+        typename Head/*<-*/ = typename empty_list_option::head_type/*->*/, 
+        typename Tail/*<-*/ = typename empty_list_option::tail_type/*->*/
+    >
+    class arg_list_generator : public list_option<Head, Tail>/*<-*/
+    {
+
+        typedef ::boost::mpl::na na_;
+        typedef list_option<Head, Tail> list_option_;
+
+        public:
+
+        arg_list_generator(){}
+        explicit arg_list_generator(Tail const& t, Head const& h)
+            : list_option_( t, h )
+        {}
+
+        template<typename Option>
+        struct modulo_result
+        {
+            typedef arg_list_generator<Option, arg_list_generator> type;
+        };
+    
+        template<typename Option>
+        typename modulo_result<Option>::type
+        operator%(Option option)const
+        {
+            typedef typename modulo_result<Option>::type result_;
+            return result_( *this, option );
+        }
+
+        template<arg_list_size_type N, typename U = na_>
+        struct result{
+            typedef interpreter_aux::arg_list<Head, Tail, N, U> type;
+        };
+
+        typename result<0>::type
+        operator()()const
+        {
+            typedef typename result<0>::type result_;
+            return result_(
+                *this,
+                ref::csv_array<na_>( _nil )
+            );
+        }
+ 
+#if BOOST_ASSIGN_V2_ENABLE_CPP0X    
+
+        protected:
+        template<typename T, typename...Args>
+        typename result<sizeof...(Args) + 1, T>::type
+        impl(T& t, Args&...args)const
+        {
+            typedef typename result<sizeof...(Args)+1, T>::type result_;
+            namespace ns = ref::assign_copy;
+            return result_(*this, ref::csv_array( t, args... ) );
+        }
+
+        public:
+
+        template<typename T, typename...Args>
+        typename boost::lazy_disable_if<
+            v2::type_traits::or_const<T, Args...>,
+            result<sizeof...(Args)+1, T>
+        >::type
+        operator()(T& t, Args&...args)const
+        {
+            return this->impl(t, args...);
+        }
+
+        template<typename T, typename...Args>
+        typename result<sizeof...(Args)+1, T const>::type
+        operator()(T const& t, Args const&...args)const
+        {
+            return this->impl(t, args...);
+        }
+
+#else
+
+#define BOOST_ASSIGN_V2_MACRO1(N, U)\
+        return result_( \
+            *this, \
+            ref::csv_array<U>( BOOST_PP_ENUM_PARAMS(N, _) ) \
+        );\
+/**/
+#define BOOST_ASSIGN_V2_MACRO2(z, N, data)\
+        template<typename T>\
+        typename result<N, T>::type\
+        operator()( BOOST_PP_ENUM_PARAMS(N, T &_) )const \
+        { \
+            typedef typename result<N, T>::type result_;\
+            BOOST_ASSIGN_V2_MACRO1( N, T )\
+        } \
+        template<typename T>\
+        typename result<N, T const>::type\
+        operator()( BOOST_PP_ENUM_PARAMS(N, T const &_) )const \
+        { \
+            typedef typename result<N, T const>::type result_;\
+            BOOST_ASSIGN_V2_MACRO1( N, T const )\
+        } \
+/**/
+
+BOOST_PP_REPEAT_FROM_TO(
+    1,
+    BOOST_PP_INC(BOOST_ASSIGN_V2_LIMIT_CSV_ARITY),
+    BOOST_ASSIGN_V2_MACRO2,
+    ~
+)
+#undef BOOST_ASSIGN_V2_MACRO1
+#undef BOOST_ASSIGN_V2_MACRO2
+
+#endif // BOOST_ASSIGN_V2_ENABLE_CPP0X
+
+    }/*->*/;
+
+    template<
+        typename C, typename H, typename T, 
+        arg_list_size_type N, typename U
+    >
+    C& operator|(C& cont, interpreter_aux::arg_list<H, T, N, U> const& arg_list)/*<-*/
+    {
+    	typedef typename ::boost::mpl::if_c<
+        	!container_aux::is_map<C>::value,
+            use_default_,
+            value_
+        >::type arg_;
+
+        v2::ref::as_arg_list(    
+            arg_list.apply( 
+            	put( cont ) % ( _data = arg_() ) 
+            ),
+            arg_list.arg_list_cont()
+        );
+        return cont;
+
+    }BOOST_ASSIGN_V2_IGNORE(/*->*/;/*<-*/)/*->*/
+
+}// interpreter_aux 
+//<-
+namespace{
+//->
+
+    interpreter_aux::arg_list_generator<> const _csv_put/*<-*/
+        = interpreter_aux::arg_list_generator<>()/*->*/;
+
+//<-
+}
+//->
+//]
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_PUT_DELAYED_CSV_PUT_HPP_ER_2010
+
Added: sandbox/assign_v2/boost/assign/v2/put/put.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/put/put.hpp	2011-04-03 11:13:31 EDT (Sun, 03 Apr 2011)
@@ -0,0 +1,141 @@
+//////////////////////////////////////////////////////////////////////////////
+//  Boost.Assign v2                                                         //
+//                                                                          //
+//  Copyright (C) 2003-2004 Thorsten Ottosen                                //
+//  Copyright (C) 2010 Erwann Rogard                                        //
+//  Use, modification and distribution are 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)        //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_PUT_PUT_ER_2010_HPP
+#define BOOST_ASSIGN_V2_PUT_PUT_ER_2010_HPP
+#include <boost/assign/v2/interpreter/crtp.hpp>
+#include <boost/assign/v2/interpreter/data_generator.hpp>
+#include <boost/assign/v2/interpreter/modifier.hpp>
+#include <boost/assign/v2/interpreter/replace.hpp>
+#include <boost/assign/v2/detail/pp/ignore.hpp>
+#include <boost/assign/v2/ref/wrapper/copy.hpp>
+
+namespace boost{
+namespace assign{
+namespace v2{
+//[syntax_put_put
+namespace interpreter_aux{
+
+    template<typename C, typename F, typename ModifierTag, typename DataTag>
+    class put_interpreter :
+//<-
+        protected ref::wrapper< ref::assign_tag::copy, C >,
+//->
+        public interpreter_aux::interpreter_crtp< 
+            C, 
+            F, 
+            ModifierTag, DataTag, put_interpreter<C, F, ModifierTag, DataTag> 
+        >
+    {
+//<-
+        typedef interpreter_aux::interpreter_crtp< 
+            C, F, ModifierTag, DataTag, put_interpreter 
+        > super2_t;
+//->
+        public:
+
+        typedef /*<-*/ typename super2_t::result_type 
+            BOOST_ASSIGN_V2_IGNORE(/*->*/ unspecified /*<-*/)/*->*/
+        result_type;
+//<-
+        protected:
+
+        typedef interpreter_aux::interpreter_modifier<ModifierTag> modifier_;
+        typedef ref::assign_tag::copy assign_tag_;
+        typedef ref::wrapper<assign_tag_,C> super1_t;
+//->
+        public:
+
+        put_interpreter()/*<-*/
+            {}BOOST_ASSIGN_V2_IGNORE(/*->*/;/*<-*/)/*->*/
+        explicit put_interpreter( C& cont )/*<-*/
+            : super1_t( cont )
+        {}BOOST_ASSIGN_V2_IGNORE(/*->*/;/*<-*/)/*->*/
+        explicit put_interpreter( C& cont, F const& f, modifier_ const& m )/*<-*/
+            : super1_t( cont ), super2_t( f, m )
+        {}BOOST_ASSIGN_V2_IGNORE(/*->*/;/*<-*/)/*->*/
+
+        C& container()const/*<-*/{
+            return static_cast<super1_t const&>(*this).get();
+        }BOOST_ASSIGN_V2_IGNORE(/*->*/;/*<-*/)/*->*/
+
+    };
+
+    template<typename C, typename F, typename ModifierTag, typename DataTag>
+    struct replace_data_generator< 
+        interpreter_aux::put_interpreter<C, F, ModifierTag, DataTag> 
+    >{
+        template<typename F1>
+        struct apply/*<-*/{ 
+            typedef interpreter_aux::put_interpreter<
+                C, F1, ModifierTag, DataTag
+            > type; 
+        }/*->*/;
+    };
+
+    template<typename C, typename F, typename ModifierTag, typename DataTag>
+    struct replace_modifier_tag< 
+        interpreter_aux::put_interpreter<C, F, ModifierTag, DataTag> 
+    >{
+        template<typename ModifierTag1>
+        struct apply/*<-*/{ 
+            typedef interpreter_aux::put_interpreter<
+                C, F, ModifierTag1, DataTag
+            > type; 
+        }/*->*/;
+    };
+
+    template<typename C, typename F, typename ModifierTag, typename DataTag>
+    struct replace_data_tag< 
+        interpreter_aux::put_interpreter<C, F, ModifierTag, DataTag> 
+    >{
+        template<typename DataTag1>
+        struct apply/*<-*/{ 
+            typedef interpreter_aux::put_interpreter<
+                C, F, ModifierTag, DataTag1
+            > type; 
+        }/*->*/;
+    };
+
+}// interpreter_aux
+namespace result_of{
+
+    template<
+        typename C/*<-*/
+        , typename DataGenerator 
+            = typename interpreter_aux::deduce_data_generator<C>::type 
+    >
+    struct put/*<-*/{
+        typedef 
+            interpreter_aux::put_interpreter<
+                C
+                , DataGenerator
+                , typename interpreter_aux::deduce_modifier_tag<C>::type
+                , typename interpreter_aux::deduce_data_tag<C>::type
+            > 
+        type;
+    }/*->*/;
+
+}// result_of
+
+    template<typename C>
+    typename result_of::put<C>::type
+    put( C& cont )/*<-*/
+    {
+        typedef typename result_of::put<C>::type result_;
+        return result_( cont );
+    }BOOST_ASSIGN_V2_IGNORE(/*->*/;/*<-*/)/*->*/
+
+//]
+
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_PUT_PUT_ER_2010_HPP