$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r60169 - in sandbox/statistics/detail/assign: boost/assign/auto_size/array boost/assign/auto_size/detail libs/assign/src
From: erwann.rogard_at_[hidden]
Date: 2010-03-04 22:48:54
Author: e_r
Date: 2010-03-04 22:48:53 EST (Thu, 04 Mar 2010)
New Revision: 60169
URL: http://svn.boost.org/trac/boost/changeset/60169
Log:
m
Added:
   sandbox/statistics/detail/assign/boost/assign/auto_size/detail/expr.hpp   (contents, props changed)
   sandbox/statistics/detail/assign/boost/assign/auto_size/detail/expr_elem.hpp   (contents, props changed)
   sandbox/statistics/detail/assign/boost/assign/auto_size/detail/policy.hpp   (contents, props changed)
Text files modified: 
   sandbox/statistics/detail/assign/boost/assign/auto_size/array/static.hpp |     4 ++--                                    
   sandbox/statistics/detail/assign/boost/assign/auto_size/detail/csv.hpp   |     3 +--                                     
   sandbox/statistics/detail/assign/libs/assign/src/main.cpp                |     4 ++--                                    
   3 files changed, 5 insertions(+), 6 deletions(-)
Modified: sandbox/statistics/detail/assign/boost/assign/auto_size/array/static.hpp
==============================================================================
--- sandbox/statistics/detail/assign/boost/assign/auto_size/array/static.hpp	(original)
+++ sandbox/statistics/detail/assign/boost/assign/auto_size/array/static.hpp	2010-03-04 22:48:53 EST (Thu, 04 Mar 2010)
@@ -22,8 +22,8 @@
     }
  
          // tag::static_array designates a data-structure that has the functonality 
-    // of array_interface<> and is allocated at construction. It is therefore 
-    // suitable as the result of functions that have the csv form :
+    // of array_interface<> and is allocated at construction. It is recommended
+    // as the result of functions that have the csv form :
     //  fun(a,b,c)
     // Unlike lazy_array, it is not a suitable policy for auto_size::expr<>. 
     // This is desirable as otherwise the result from fun(a,b,c) would be 
Modified: sandbox/statistics/detail/assign/boost/assign/auto_size/detail/csv.hpp
==============================================================================
--- sandbox/statistics/detail/assign/boost/assign/auto_size/detail/csv.hpp	(original)
+++ sandbox/statistics/detail/assign/boost/assign/auto_size/detail/csv.hpp	2010-03-04 22:48:53 EST (Thu, 04 Mar 2010)
@@ -14,7 +14,7 @@
 #include <boost/preprocessor/repetition/enum_params.hpp>
 #include <boost/preprocessor/repetition/enum_binary_params.hpp>
 #include <boost/assign/auto_size/detail/expr.hpp>
-#include <boost/assign/auto_size/array/wrapper.hpp>
+#include <boost/assign/auto_size/array/static.hpp>
 
 // Whereas adjacent unary function calls is the usual way to create a collec-
 // tion in Boost.Assign, this macro provides, as an alternative, functions that 
@@ -31,7 +31,6 @@
 // 	cfun<P>(a1,..,.ai)              r<const T,i,P>
 // 	fun(a1,..,.ai)                  r<T,i,P0>
 // 	cfun(a1,..,.ai)                 r<const T,i,P0>
-// which return instances of w<T,i> and w<const T,i>, respectively.
 
 #ifndef BOOST_ASSIGN_CSV_SIZE
 #define BOOST_ASSIGN_CSV_SIZE 20
Added: sandbox/statistics/detail/assign/boost/assign/auto_size/detail/expr.hpp
==============================================================================
--- (empty file)
+++ sandbox/statistics/detail/assign/boost/assign/auto_size/detail/expr.hpp	2010-03-04 22:48:53 EST (Thu, 04 Mar 2010)
@@ -0,0 +1,194 @@
+//////////////////////////////////////////////////////////////////////////////
+// assign::detail::expr.hpp                                                 //
+//                                                                          //
+//  (C) Copyright 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_AUTO_SIZE_DETAIL_EXPR_ER_2010_HPP
+#define BOOST_ASSIGN_AUTO_SIZE_DETAIL_EXPR_ER_2010_HPP
+#include <boost/mpl/void.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/equal_to.hpp>
+#include <boost/mpl/empty_base.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/assign/list_of.hpp> // needed for assign_reference
+#include <boost/assign/auto_size/detail/assign_reference_copy.hpp>
+#include <boost/assign/auto_size/detail/policy.hpp>
+#include <boost/assign/auto_size/detail/types.hpp>
+#include <boost/assign/auto_size/detail/expr_size.hpp>
+#include <boost/assign/auto_size/detail/expr_elem.hpp>
+#include <boost/assign/auto_size/array/lazy.hpp>
+
+// Creates a collection of references by deducing the number of arguments
+// at compile time. The functionality is controlled by parameter Ref which
+// specifies a reference wrapper, and P, an abitrary policy, usually intended
+// to expose a container interface.
+//
+// Note:
+// In most situations, a reference wrapper that has copy rather than rebind 
+// semantics for operator= is preferable. 
+//    
+// Acknowledgement: The idea of this class was developed in collaboration 
+// with M.P.G
+
+namespace boost{
+namespace assign{
+namespace detail{
+namespace auto_size{
+                        
+	// ----fwd declare ---- //
+
+    template<
+    	typename E,typename T,int N,template<typename> class Ref,typename P>
+    class expr;
+
+	// ---- Traits --- //
+    
+    template<typename E,typename T,int N,template<typename>class Ref,typename P>
+    struct expr_size<expr<E,T,N,Ref,P> >
+     	: boost::mpl::int_<N>{};
+
+    template<typename E,typename T,int N,template<typename>class Ref,typename P>
+    struct expr_elem<expr<E,T,N,Ref,P> >
+    {
+    	typedef T type;
+    };
+
+    // ---- Collection builder ---- //
+
+    template<
+    	typename E,typename T,int N,template<typename> class Ref,typename P>
+    class expr : public policy<P>::template apply<expr<E,T,N,Ref,P>,Ref>::type{
+        typedef boost::mpl::int_<1> int_1_;
+        typedef boost::mpl::int_<N> int_n_;
+        typedef typename Ref<T>::type ref_;
+        typedef typename policy<P>::template apply<expr,Ref>::type super_;
+
+		template<typename E1>
+        struct next{
+        	typedef expr<E1,T,N+1,Ref,P> type;
+        };
+
+        public:       
+
+        typedef typename boost::mpl::equal_to<int_n_,int_1_>::type is_1st_;
+        typedef typename boost::mpl::if_<is_1st_,E,const E&>::type previous_;
+        typedef typename next<expr>::type result_type;
+
+        expr(const E& p,T& t):previous(p),ref(t){} 
+        result_type operator()(T& t)const{ return result_type(*this,t); }
+
+		// TODO maybe dangerous, narrow genus
+		template<typename E1>
+		expr(const E1& that)
+        	:super_(that),
+            previous(that.previous),
+            ref(that.ref){}
+
+
+        mutable previous_ previous;
+        mutable ref_ ref;
+                
+    };
+
+    // ---- write_to_array ---- //
+
+    template<int Nshift,typename A,typename E,typename T,int N,
+    	template<typename> class Ref,typename P>
+    void write_to_array(A& a,const expr<E,T,N,Ref,P>& e,false_ /*exit*/){
+        a[Nshift+N-1] = e.ref;
+        write_to_array(a,e.previous);
+    }
+            
+    template<int Nshift,typename A,typename E,typename T,int N,
+    	template<typename> class Ref,typename P>
+    void write_to_array(A& a,const expr<E,T,N,Ref,P>& e,true_ /*exit*/){
+        a[Nshift+N-1] = e.ref;
+    }
+
+    template<int Nshift,typename A,typename E,typename T,int N,
+    	template<typename> class Ref,typename P>
+    void write_to_array(A& a,const expr<E,T,N,Ref,P>& e){
+        typedef expr<E,T,N,Ref,P> expr_;
+        typedef typename expr_::is_1st_ exit_;
+        write_to_array<Nshift>(a,e,exit_());
+    }
+
+    template<typename A,typename E,typename T,int N,
+    	template<typename> class Ref,typename P>
+    void write_to_array(A& a,const expr<E,T,N,Ref,P>& e){
+		return write_to_array<0>(a,e);
+	}
+
+    // ---- ref wrappers ---- //
+
+    template<typename T>
+    struct ref_copy{
+        typedef boost::assign::detail::assign_reference_copy<T> type;
+    };
+
+    template<typename T>
+    struct ref_rebind{
+        typedef boost::assign_detail::assign_reference<T> type;
+    };
+
+    // ---- first expr ---- //
+
+    template<typename T,template<typename> class Ref,typename P>
+    struct first_expr{
+        typedef detail::auto_size::expr<detail::auto_size::top_,T,1,Ref,P> type;   
+        static type call(T& a){ return type(top_(),a); }
+    };
+
+    template<typename T,template<typename> class Ref>
+    struct first_expr_no_policy : first_expr<T,Ref,no_policy>{};
+
+    template<template<typename> class Ref,typename T>
+    typename first_expr_no_policy<T,Ref>::type 
+    make_first_expr_no_policy(T& a){
+    	return first_expr_no_policy<T,Ref>::call(a);
+    }
+
+    template<template<typename> class Ref,typename T>
+    typename first_expr_no_policy<const T,Ref>::type 
+    make_first_expr_no_policy(const T& a){
+    	return first_expr_no_policy<const T,Ref>::call(a);
+    }
+
+    template<typename T,typename P = default_policy>
+    struct first_copy : first_expr<T,ref_copy,P>{};
+
+    template<typename T,typename P = default_policy>
+    struct first_rebind : first_expr<T,ref_rebind,P>{};
+
+    // ---- result_of ---- //
+	
+    namespace result_of{
+    
+    	template<typename T,int N,template<typename> class Ref,typename P>
+    	struct expr{
+        	typedef typename result_of::expr<T,N-1,Ref,P>::type previous;
+    		typedef auto_size::expr<previous,T,N,Ref,P> type;
+    	};
+
+    	template<typename T,template<typename> class Ref,typename P>
+    	struct expr<T,1,Ref,P> : first_expr<T,Ref,P>{};
+
+    	template<typename T,int N,typename P = default_policy>
+    	struct copy : result_of::expr<T,N,ref_copy,P>{};	
+
+    	template<typename T,int N,typename P = default_policy>
+    	struct rebind : result_of::expr<T,N,ref_rebind,P>{};	
+
+	}
+            
+}// auto_size  
+}// detail      
+}// assign
+}// boost
+
+#endif
+
Added: sandbox/statistics/detail/assign/boost/assign/auto_size/detail/expr_elem.hpp
==============================================================================
--- (empty file)
+++ sandbox/statistics/detail/assign/boost/assign/auto_size/detail/expr_elem.hpp	2010-03-04 22:48:53 EST (Thu, 04 Mar 2010)
@@ -0,0 +1,26 @@
+//////////////////////////////////////////////////////////////////////////////
+// assign::detail::auto_size::expr_elem.hpp                                 //
+//                                                                          //
+//  (C) Copyright 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_DETAIL_AUTO_SIZE_EXPR_ELEM_ER_2010_HPP
+#define BOOST_ASSIGN_DETAIL_AUTO_SIZE_EXPR_ELEM_ER_2010_HPP
+#include <boost/mpl/empty_base.hpp>
+
+namespace boost{
+namespace assign{
+namespace detail{
+namespace auto_size{
+
+    template<typename E>
+    struct expr_elem{};
+    
+}// auto_size
+}// detail
+}// assign
+}// boost
+
+#endif
Added: sandbox/statistics/detail/assign/boost/assign/auto_size/detail/policy.hpp
==============================================================================
--- (empty file)
+++ sandbox/statistics/detail/assign/boost/assign/auto_size/detail/policy.hpp	2010-03-04 22:48:53 EST (Thu, 04 Mar 2010)
@@ -0,0 +1,42 @@
+//////////////////////////////////////////////////////////////////////////////
+// assign::detail::auto_size::policy.hpp                                    //
+//                                                                          //
+//  (C) Copyright 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_DETAIL_AUTO_SIZE_POLICY_ER_2010_HPP
+#define BOOST_ASSIGN_DETAIL_AUTO_SIZE_POLICY_ER_2010_HPP
+#include <boost/mpl/empty_base.hpp>
+
+namespace boost{
+namespace assign{
+namespace detail{
+namespace auto_size{
+
+	namespace tag{
+		struct no_policy{};
+	}
+	
+    template<typename Tag>
+	struct policy{
+    	typedef Tag tag;
+    };
+
+
+    template<>
+	struct policy<tag::no_policy>{
+        template<typename E,template<typename> class  Ref>
+        struct apply{
+            typedef boost::mpl::empty_base type;
+    	};
+    };
+
+    
+}// auto_size
+}// detail
+}// assign
+}// boost
+
+#endif
Modified: sandbox/statistics/detail/assign/libs/assign/src/main.cpp
==============================================================================
--- sandbox/statistics/detail/assign/libs/assign/src/main.cpp	(original)
+++ sandbox/statistics/detail/assign/libs/assign/src/main.cpp	2010-03-04 22:48:53 EST (Thu, 04 Mar 2010)
@@ -1,13 +1,13 @@
 #include <iostream>
 #include <libs/assign/example/ref_list_of.h>
 //#include <libs/assign/test/speed.h>
-//#include <libs/assign/test/speed2.h>
+#include <libs/assign/test/speed2.h>
 
 int main (int argc, char * const argv[]) {
 
     example_ref_list_of(std::cout);
     //test_speed(std::cout);
-    //test_speed2(std::cout);
+    test_speed2(std::cout);
 
     return 0;