$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r52913 - in sandbox/mirror: boost/char_type_switch boost/mirror libs/mirror/example/factories
From: chochlik_at_[hidden]
Date: 2009-05-11 13:40:12
Author: matus.chochlik
Date: 2009-05-11 13:40:10 EDT (Mon, 11 May 2009)
New Revision: 52913
URL: http://svn.boost.org/trac/boost/changeset/52913
Log:
[mirror 0.4.x]
- added stringstream to char_type_switch facility
- added support for default values for functor_callers
Added:
   sandbox/mirror/boost/char_type_switch/sstream.hpp   (contents, props changed)
Text files modified: 
   sandbox/mirror/boost/mirror/functor_call.hpp              |   102 ++++++++++++++++++++++++++++++--------  
   sandbox/mirror/libs/mirror/example/factories/input_ui.hpp |   106 +++++++++++++++++++++++++++------------ 
   sandbox/mirror/libs/mirror/example/factories/inserter.cpp |    15 +++++                                   
   3 files changed, 168 insertions(+), 55 deletions(-)
Added: sandbox/mirror/boost/char_type_switch/sstream.hpp
==============================================================================
--- (empty file)
+++ sandbox/mirror/boost/char_type_switch/sstream.hpp	2009-05-11 13:40:10 EDT (Mon, 11 May 2009)
@@ -0,0 +1,25 @@
+/**
+ * \file boost/char_type_switch/sstream.hpp
+ * Narrow/Wide character type switching for sstreams
+ *
+ *  Copyright 2008 Matus Chochlik. 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_CHAR_TYPE_SWITCH_SSTREAM
+#define BOOST_CHAR_TYPE_SWITCH_SSTREAM
+
+#include <boost/char_type_switch/string.hpp>
+// Needed for ::std cout, cin, cerr, wcin, wcout, wcerr
+#include <sstream>
+
+namespace boost {
+namespace cts {
+
+typedef ::std::basic_stringstream<bchar, bchar_traits> bstringstream;
+
+} // namespace cts
+} // namespace boost
+
+#endif //include guard
Modified: sandbox/mirror/boost/mirror/functor_call.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/functor_call.hpp	(original)
+++ sandbox/mirror/boost/mirror/functor_call.hpp	2009-05-11 13:40:10 EDT (Mon, 11 May 2009)
@@ -10,9 +10,12 @@
 #ifndef BOOST_MIRROR_FUNCTOR_CALL_HPP
 #define BOOST_MIRROR_FUNCTOR_CALL_HPP
 
+#include <boost/call_traits.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
 #include <boost/mirror/factory.hpp>
 #include <boost/mirror/meta_mem_functions.hpp>
 
+
 namespace boost {
 namespace mirror {
 namespace detail {
@@ -26,13 +29,16 @@
 
 
 #define BOOST_MIRROR_BASE_FUNCTION_CALLER_DECLARE_FACTORY(Z, INDEX, X)\
-Manufacturer< \
-typename constructor_utils::template adjust_product< \
+typedef typename constructor_utils::template adjust_product< \
         typename meta_function::params:: \
         template param< mpl::int_< INDEX > >:: \
         type::reflected_type \
->::type \
-> BOOST_PP_CAT(_, INDEX);
+>::type BOOST_PP_CAT(T, INDEX); \
+Manufacturer< BOOST_PP_CAT(T, INDEX) > BOOST_PP_CAT(_, INDEX);
+
+#define BOOST_MIRROR_BASE_FUNCTION_CALLER_DECL_DEFAULT_PARAM(Z, INDEX, X) \
+	, typename ::boost::call_traits< BOOST_PP_CAT(T, INDEX) >::param_type \
+	BOOST_PP_CAT(opt_default_, INDEX)
 
 #define BOOST_MIRROR_BASE_FUNCTION_CALLER_INITIALIZE_FACTORY(Z, INDEX, PARAM) \
         , BOOST_PP_CAT(_, INDEX) ( \
@@ -42,11 +48,36 @@
                 mpl::int_< INDEX >() \
         )
 
+#define BOOST_MIRROR_BASE_FUNCTION_CALLER_INITIALIZE_FACTORY_W_DEF(Z, INDEX, PARAM) \
+	, BOOST_PP_CAT(_, INDEX) ( \
+		PARAM, \
+		_meta_functions, \
+		FuncIndex(), \
+		mpl::int_< INDEX >(), \
+		& BOOST_PP_CAT(opt_default_, INDEX) \
+	)
+
+#define BOOST_MIRROR_BASE_FUNCTION_CALLER_DECLARE_CONSTR_W_DEF(PARAM_COUNT) \
+	template <class FactoryParam> \
+	inline base_functor_caller( \
+		FactoryParam factory_param \
+		BOOST_PP_REPEAT( \
+			PARAM_COUNT, \
+			BOOST_MIRROR_BASE_FUNCTION_CALLER_DECL_DEFAULT_PARAM, \
+			_ \
+		) \
+	): _meta_functions() \
+	BOOST_PP_REPEAT( \
+		PARAM_COUNT, \
+		BOOST_MIRROR_BASE_FUNCTION_CALLER_INITIALIZE_FACTORY_W_DEF, \
+		factory_param \
+	) { } 
+
 #define BOOST_MIRROR_BASE_FUNCTION_CALLER_CALL_FACTORY(Z, INDEX, X) \
         BOOST_PP_CAT(_, INDEX)()
 
 
-#define BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER(PARAM_COUNT) \
+#define BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER_BEGIN(PARAM_COUNT)\
 template < \
         template <class> class Manufacturer,  \
         class MetaFunctions, \
@@ -69,19 +100,20 @@
                 0 \
         ) \
  \
-	typedef typename meta_function::result_type::reflected_type result;\
+	typedef typename meta_function::result_type::reflected_type result_type;\
  \
-	template <class Param> \
-	inline base_functor_caller(Param param) \
+	template <class FactoryParam> \
+	inline base_functor_caller(FactoryParam factory_param) \
          : _meta_functions() \
         BOOST_PP_REPEAT( \
                 PARAM_COUNT, \
                 BOOST_MIRROR_BASE_FUNCTION_CALLER_INITIALIZE_FACTORY, \
-		param \
+		factory_param \
         ) { } \
- \
+
+#define BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER_END(PARAM_COUNT)\
         template <class Functor> \
-	inline result call(Functor func) \
+	inline result_type call(Functor func) \
         { \
                 return func( \
                         BOOST_PP_ENUM( \
@@ -93,17 +125,29 @@
         } \
 };
 
+#define BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER(PARAM_COUNT) \
+BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER_BEGIN(PARAM_COUNT) \
+BOOST_MIRROR_BASE_FUNCTION_CALLER_DECLARE_CONSTR_W_DEF(PARAM_COUNT) \
+BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER_END(PARAM_COUNT)
+
 #define BOOST_MIRROR_DO_IMPLEMENT_BASE_FUNCTION_CALLER(Z, PARAM_COUNT, X) \
         BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER(PARAM_COUNT)
 
-BOOST_PP_REPEAT(
-	BOOST_MIRROR_MAX_FUNC_PARAMS(), 
+BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER_BEGIN(0)
+BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER_END(0)
+BOOST_PP_REPEAT_FROM_TO(
+	1, BOOST_MIRROR_MAX_FUNC_PARAMS(), 
         BOOST_MIRROR_DO_IMPLEMENT_BASE_FUNCTION_CALLER, 
         0
 )
 
+#undef BOOST_MIRROR_BASE_FUNCTION_CALLER_DECLARE_CONSTR_W_DEF
+#undef BOOST_MIRROR_BASE_FUNCTION_CALLER_DECL_DEFAULT_PARAM
+#undef BOOST_MIRROR_BASE_FUNCTION_CALLER_INITIALIZE_FACTORY_W_DEF
 #undef BOOST_MIRROR_DO_IMPLEMENT_BASE_FUNCTION_CALLER
 #undef BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER
+#undef BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER_BEGIN
+#undef BOOST_MIRROR_IMPLEMENT_BASE_FUNCTION_CALLER_END
 #undef BOOST_MIRROR_BASE_FUNCTION_CALLER_CALL_FACTORY
 #undef BOOST_MIRROR_BASE_FUNCTION_CALLER_INITIALIZE_FACTORY
 #undef BOOST_MIRROR_BASE_FUNCTION_CALLER_DECLARE_FACTORY
@@ -132,22 +176,29 @@
                 template function<FunctionIndex>::params::size
 	> base_class;
 
-	typedef typename base_class::result result;
+	typedef typename base_class::result_type result_type;
         typedef typename base_class::meta_function meta_function;
 
 public:
-	template <class Param>
-	functor_caller(Param param)
-	 : base_class(param)
+	template <class FactoryParam>
+	functor_caller(FactoryParam factory_param)
+	 : base_class(factory_param)
+	{ }
+
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+	template <class FactoryParam, class ...Defaults>
+	functor_caller(FactoryParam factory_param, Defaults ...defs)
+	 : base_class(factory_param, defs...)
         { }
+#endif
 
-	inline result operator()(void)
+	inline result_type operator()(void)
         {
                 return base_class::call(meta_function::wrap());
         }	
 
         template <class Class>
-	inline result operator()(Class& instance)
+	inline result_type operator()(Class& instance)
         {
                 return base_class::call(meta_function::wrap(instance));
         }
@@ -174,10 +225,17 @@
          : base_class(0)
         { }
 
-	template <class Param>
-	member_function_caller(Param param)
-	 : base_class(param)
+	template <class FactoryParam>
+	member_function_caller(FactoryParam factory_param)
+	 : base_class(factory_param)
+	{ }
+
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+	template <class FactoryParam, class ...Defaults>
+	member_function_caller(FactoryParam factory_param, Defaults ...defs)
+	 : base_class(factory_param, defs...)
         { }
+#endif
 
 };
 
Modified: sandbox/mirror/libs/mirror/example/factories/input_ui.hpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/factories/input_ui.hpp	(original)
+++ sandbox/mirror/libs/mirror/example/factories/input_ui.hpp	2009-05-11 13:40:10 EDT (Mon, 11 May 2009)
@@ -13,6 +13,7 @@
 #define BOOST_MIRROR_EXAMPLES_FACTORIES_INPUT_UI_HPP
 
 #include <boost/char_type_switch/iostream.hpp>
+#include <boost/char_type_switch/sstream.hpp>
 
 #include <boost/mirror/factory.hpp>
 #include <boost/mirror/meta_type.hpp>
@@ -47,8 +48,13 @@
         typename ::boost::mirror::make_factory< input_ui, Product >::type f;
 
         template <class MetaFunctions, class FuncIndex, class ParamIndex>
-	input_ui(int tabs, MetaFunctions mf, FuncIndex fi, ParamIndex pi)
-	 : b(tabs, mf, fi, pi)
+	input_ui(
+		int tabs, 
+		MetaFunctions mf, 
+		FuncIndex fi, 
+		ParamIndex pi, 
+		const Product* opt_default = (const Product*)0
+	): b(tabs, mf, fi, pi)
          , f(tabs)
         { }
 
@@ -85,37 +91,68 @@
                 int tabs, 
                 MetaFunctions mf, 
                 FuncIndex fi, 
-		ParamIndex pi
+		ParamIndex pi,
+		const Product* opt_default
         )
         {
-			typedef typename MetaFunctions::
-                        template function<FuncIndex> meta_function;
-			//
-			::boost::cts::bcout() <<
-			::boost::cts::bstring(tabs, BOOST_CTS_LIT('\t')) << 
-			BOOST_CTS_LIT("Enter ") << 
-			BOOST_MIRRORED_TYPE(Product)::full_name() << 
-			BOOST_CTS_LIT(" ") << 
-			meta_function::params::
-			template param<ParamIndex>::base_name() <<
-			BOOST_CTS_LIT(" for ") <<
-			meta_function::result_type::full_name() << (
-				meta_function::is_constructor::value ?
-				::boost::cts::bstring() :
-				::boost::cts::bstring(BOOST_CTS_LIT(" "))
-			) << (
-				meta_function::is_constructor::value ?
-				::boost::cts::bstring() :
-				meta_function::base_name()
-			) << BOOST_CTS_LIT("(");
-			//
-			meta_function::params::
-			for_each(constr_param_name_printer());
-			//
+		typedef typename MetaFunctions::
+		template function<FuncIndex> meta_function;
+		//
+		::boost::cts::bcout() <<
+		::boost::cts::bstring(tabs, BOOST_CTS_LIT('\t')) << 
+		BOOST_CTS_LIT("Enter ") << 
+		BOOST_MIRRORED_TYPE(Product)::full_name() << 
+		BOOST_CTS_LIT(" ") << 
+		meta_function::params::
+		template param<ParamIndex>::base_name() <<
+		BOOST_CTS_LIT(" for ") <<
+		meta_function::result_type::full_name() << (
+			meta_function::is_constructor::value ?
+			::boost::cts::bstring() :
+			::boost::cts::bstring(BOOST_CTS_LIT(" "))
+		) << (
+			meta_function::is_constructor::value ?
+			::boost::cts::bstring() :
+			meta_function::base_name()
+		) << BOOST_CTS_LIT("(");
+		//
+		meta_function::params::
+		for_each(constr_param_name_printer());
+		//
+		::boost::cts::bcout() <<
+		BOOST_CTS_LIT(") "); 
+		if(opt_default)
+		{
                         ::boost::cts::bcout() <<
-			BOOST_CTS_LIT(") = ") <<
-                        ::std::flush;
-		::boost::cts::bcin() >> x;
+			BOOST_CTS_LIT("[") << 
+			*opt_default <<
+			BOOST_CTS_LIT("]"); 
+			
+		}
+		::boost::cts::bcout() <<
+		BOOST_CTS_LIT(" = ") <<
+		::std::flush;
+		//
+		while(1)
+		{
+			::boost::cts::bstring input;
+			::std::getline(::boost::cts::bcin(), input);
+			if(input.empty())
+			{
+				if(opt_default)
+				{
+					x = *opt_default;
+					break;
+				}
+			}
+			else 
+			{
+				::boost::cts::bstringstream tmp(input);
+				tmp >> x;
+				break;
+				
+			}
+		}
         }
 
         inline Product operator()(void)
@@ -129,8 +166,13 @@
 struct input_ui< TYPE > : console_input_ui< TYPE > \
 { \
         template <class MetaFunctions, class FuncIndex, class ParamIndex> \
-	input_ui(int tabs, MetaFunctions mf, FuncIndex fi, ParamIndex pi) \
-	 : console_input_ui< TYPE >(tabs, mf, fi, pi) \
+	input_ui( \
+		int tabs, \
+		MetaFunctions mf, \
+		FuncIndex fi, \
+		ParamIndex pi, \
+		const TYPE* opt_default = (const TYPE*)0 \
+	): console_input_ui< TYPE >(tabs, mf, fi, pi, opt_default) \
         { } \
 }; 
 
Modified: sandbox/mirror/libs/mirror/example/factories/inserter.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/factories/inserter.cpp	(original)
+++ sandbox/mirror/libs/mirror/example/factories/inserter.cpp	2009-05-11 13:40:10 EDT (Mon, 11 May 2009)
@@ -94,11 +94,23 @@
                                 BOOST_CTS_LIT("Change persons address ? (y/n) ") << 
                                 ::std::flush;
                         cts::bcin() >> change_address;
+			cts::bcin().ignore();
                 } while(change_address != yes && change_address != no);
                 if(change_address == yes)
                 {
+			person& p(persons.back());
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
                         member_function_caller<input_ui, person, 0> func;
-			func(persons.back());
+#else
+			member_function_caller<input_ui, person, 0> func(
+				0,
+				p.street,
+				p.number,
+				p.city,
+				p.postal_code
+			);
+#endif
+			func(p);
                 }
                 // check whether to insert more persons
                 do
@@ -107,6 +119,7 @@
                                 BOOST_CTS_LIT("Insert more ? (y/n) ") << 
                                 ::std::flush;
                         cts::bcin() >> insert_more;
+			cts::bcin().ignore();
                 } while(insert_more != yes && insert_more != no);
         }
         //