$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r66771 - in sandbox/SOC/2010/phoenix3: boost/phoenix/core boost/phoenix/statement libs/phoenix/test libs/phoenix/test/statement
From: thom.heller_at_[hidden]
Date: 2010-11-26 11:15:30
Author: theller
Date: 2010-11-26 11:15:22 EST (Fri, 26 Nov 2010)
New Revision: 66771
URL: http://svn.boost.org/trac/boost/changeset/66771
Log:
switch refactoring complete
Text files modified: 
   sandbox/SOC/2010/phoenix3/boost/phoenix/core/function_equal.hpp        |    85 +++++++++++++++++++++-------            
   sandbox/SOC/2010/phoenix3/boost/phoenix/statement/switch.hpp           |   117 +++++++++++++++++++++++++-------------- 
   sandbox/SOC/2010/phoenix3/libs/phoenix/test/Jamfile                    |     2                                         
   sandbox/SOC/2010/phoenix3/libs/phoenix/test/statement/switch_tests.cpp |     5 -                                       
   4 files changed, 139 insertions(+), 70 deletions(-)
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/core/function_equal.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/core/function_equal.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/core/function_equal.hpp	2010-11-26 11:15:22 EST (Fri, 26 Nov 2010)
@@ -9,6 +9,9 @@
 #define PHOENIX_CORE_FUNCTION_EQUAL_HPP
 
 #include <boost/phoenix/core/terminal.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/identity.hpp>
 
 namespace boost
 {
@@ -33,12 +36,17 @@
             // hard wiring reference_wrapper and weak_ptr here ...
             // **TODO** find out why boost bind does this ...
             template <typename A0, typename A1>
-            result_type operator()(reference_wrapper<A0> const & a0, reference_wrapper<A1> const & a1) const
+            result_type
+            operator()(
+                reference_wrapper<A0> const & a0
+              , reference_wrapper<A1> const & a1
+            ) const
             {
                 return a0.get_pointer() == a1.get_pointer();
             }
             template <typename A0, typename A1>
-            result_type operator()(weak_ptr<A0> const & a0, weak_ptr<A1> const & a1) const
+            result_type
+            operator()(weak_ptr<A0> const & a0, weak_ptr<A1> const & a1) const
             {
                 return !(a0 < a1) && !(a1 < a0);
             }
@@ -51,19 +59,28 @@
                 proto::if_<
                     proto::matches<proto::_, proto::_state>()
                   , proto::or_<
-                        /*proto::when<
-                            rule::custom_terminal
-                          , compare(proto::_value, proto::_value(proto::_state))
-                        >
-                      ,*/ proto::when<
+                        proto::when<
                             proto::terminal<proto::_>
                           , proto::if_<
                                 mpl::false_()//is_custom_terminal<proto::_value>()
                               , compare(
-                                    proto::lazy<custom_terminal<proto::_value>(proto::_value)>
-                                  , proto::lazy<custom_terminal<proto::_value(proto::_state)>(proto::_value(proto::_state))>
+                                    proto::lazy<
+                                        custom_terminal<proto::_value>(
+                                            proto::_value
+                                        )
+                                    >
+                                  , proto::lazy<
+                                        custom_terminal<
+                                            proto::_value(proto::_state)
+                                        >(
+                                            proto::_value(proto::_state)
+                                        )
+                                    >
+                                )
+                              , compare(
+                                    proto::_value
+                                  , proto::_value(proto::_state)
                                 )
-                              , compare(proto::_value, proto::_value(proto::_state))
                             >
                         >
                       , proto::otherwise<test(proto::_, proto::_state)>
@@ -86,27 +103,53 @@
             template <typename Expr1>
             result_type operator()(Expr1 const& e1, Expr1 const& e2) const
             {
-                return eval(e1, e2, typename proto::arity_of<Expr1>::type());
+                return
+                    this->evaluate(
+                        e1
+                      , e2
+                      , typename proto::arity_of<Expr1>::type()
+                    );
             }
 
             private:
-                #define FUNCTION_EQUAL_R(Z, N, DATA)                            \
-                    BOOST_PP_IF(N, &&, BOOST_PP_EMPTY())                        \
-                    function_equal_()(                                          \
+                #define PHOENIX_FUNCTION_EQUAL_R(Z, N, DATA)                    \
+                    && function_equal_()(                                       \
                             proto::child_c< N >(e1)                             \
                           , proto::child_c< N >(e2)                             \
                         )                                                       \
                 /**/
 
-                #define FUNCTION_EQUAL(Z, N, DATA) \
-                    template <typename Expr1> \
-                    result_type eval(Expr1 const& e1, Expr1 const& e2, mpl::long_< N >) const \
-                    { \
-                        return BOOST_PP_REPEAT(N, FUNCTION_EQUAL_R, _); \
-                    } \
+                #define PHOENIX_FUNCTION_EQUAL(Z, N, DATA)                      \
+                    template <typename Expr1>                                   \
+                    result_type                                                 \
+                    evaluate(                                                   \
+                        Expr1 const& e1                                         \
+                      , Expr1 const& e2                                         \
+                      , mpl::long_< N >                                         \
+                    ) const                                                     \
+                    {                                                           \
+                        return                                                  \
+                            function_equal_()(                                  \
+                                proto::child_c<0>(e1)                           \
+                              , proto::child_c<0>(e2)                           \
+                            )                                                   \
+                            BOOST_PP_REPEAT_FROM_TO(                            \
+                                1                                               \
+                              , N                                               \
+                              , PHOENIX_FUNCTION_EQUAL_R                        \
+                              , _                                               \
+                            );                                                  \
+                    }                                                           \
                 /**/
 
-                BOOST_PP_REPEAT(BOOST_PROTO_MAX_ARITY, FUNCTION_EQUAL, _)
+                BOOST_PP_REPEAT_FROM_TO(
+                    1
+                  , BOOST_PROTO_MAX_ARITY
+                  , PHOENIX_FUNCTION_EQUAL
+                  , _
+                )
+                #undef PHOENIX_FUNCTION_EQUAL_R
+                #undef PHOENIX_FUNCTION_EQUAL
         };
     }
 
Modified: sandbox/SOC/2010/phoenix3/boost/phoenix/statement/switch.hpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/boost/phoenix/statement/switch.hpp	(original)
+++ sandbox/SOC/2010/phoenix3/boost/phoenix/statement/switch.hpp	2010-11-26 11:15:22 EST (Fri, 26 Nov 2010)
@@ -77,7 +77,7 @@
                 proto::when<
                     proto::comma<
                         switch_case_is_nullary
-                      , rule::switch_default_case
+                      , proto::or_<rule::switch_default_case, rule::switch_case>
                     >
                   , mpl::and_<
                         switch_case_is_nullary(proto::_child_c<0>, proto::_state)
@@ -85,23 +85,9 @@
                     >()
                 >
               , proto::when<
-                    proto::comma<
-                        switch_case_is_nullary
-                      , rule::switch_case
-                    >
-                  , mpl::and_<
-                        switch_case_is_nullary(proto::_child_c<0>, proto::_state)
-                      , evaluator(proto::_child_c<1>(proto::_child_c<1>), proto::_state)
-                    >()
-                >
-              , proto::when<
-                    rule::switch_default_case
+                    proto::or_<rule::switch_default_case, rule::switch_case>
                   , evaluator(proto::_child_c<0>, proto::_state)
                 >
-              , proto::when<
-                    rule::switch_case
-                  , evaluator(proto::_child_c<1>, proto::_state)
-                >
             >
         {};
 
@@ -116,17 +102,41 @@
         {};
         struct switch_case_grammar
             : proto::or_<
-                proto::comma<switch_case_grammar, rule::switch_case>
-              , rule::switch_case
+                proto::when<
+                    proto::comma<switch_case_grammar, rule::switch_case>
+                  , proto::if_<
+                        is_same<mpl::prior<proto::_data>(), proto::_state>()
+                      , proto::_child_c<1>
+                      , switch_case_grammar(proto::_child_c<0>, proto::_state, mpl::prior<proto::_data>())
+                    >
+                >
+              , proto::when<rule::switch_case, proto::_>
             >
         {};
 
         struct switch_case_with_default_grammar
             : proto::or_<
-                proto::comma<switch_case_grammar, rule::switch_default_case>
-              , rule::switch_default_case
+                proto::when<
+                    proto::comma<switch_case_grammar, rule::switch_default_case>
+                  , proto::if_<
+                        is_same<mpl::prior<proto::_data>(), proto::_state>()
+                      , proto::_child_c<1>
+                      , switch_case_grammar(proto::_child_c<0>, proto::_state, mpl::prior<proto::_data>())
+                    >
+                >
+              , proto::when<rule::switch_default_case, proto::_>
             >
         {};
+
+        struct switch_size
+            : proto::or_<
+                proto::when<
+                    proto::comma<switch_size, proto::_>
+                  , mpl::next<switch_size(proto::_left)>()
+                >
+              , proto::when<proto::_, mpl::int_<1>()>
+            >
+	    {};
     }
 
     struct switch_eval
@@ -143,46 +153,67 @@
         result_type
         operator()(Env & env, Cond const & cond, Cases const & cases) const
         {
-            /*
-            typedef typename fusion::result_of::as_vector<Cases>::type as_vector;
-            std::cout << typeid(Cases).name() << "\n";
-            std::cout << fusion::result_of::size<Cases>::value << "\n";
-            std::cout << typeid(typename fusion::result_of::at_c<as_vector, 0>::type).name() << "\n";
-            std::cout << typeid(typename proto::matches<typename Cases::expr_type, detail::switch_case_with_default_grammar>::type).name() << "\n";
-            */
-            //std::cout << typeid(typename fusion::result_of::at_c<flattened_expr, 2>::type).name() << "\n";
-            this->evaluate(env, cond, fusion::as_vector(cases), mpl::int_<fusion::result_of::size<Cases>::value>(), typename proto::matches<typename Cases::expr_type, detail::switch_case_with_default_grammar>::type());
+            this->evaluate(
+                    env
+                  , cond
+                  , cases
+                  , typename boost::result_of<detail::switch_size(Cases)>::type()
+                  , typename proto::matches<Cases, detail::switch_case_with_default_grammar>::type()
+                );
         }
 
-        //proto::result_of::child_c<typename fusion::result_of::at_c<Cases, N>::type, 0>::type::value :
         private:
-        #define PHOENIX_SWITCH_EVAL_R(Z, N, DATA) \
-        case \
-            proto::value< \
-                typename proto::result_of::child_c<\
-                    typename fusion::result_of::at_c<Cases, N>::type \
-                  , 0 \
+        #define PHOENIX_SWITCH_EVAL_TYPEDEF_R(Z, N, DATA) \
+            typedef                                       \
+                typename boost::result_of<                \
+                    detail::switch_grammar(               \
+                        Cases                             \
+                      , mpl::int_<N>                      \
+                      , mpl::int_<DATA>                   \
+                    )                                     \
+                >::type                                   \
+                BOOST_PP_CAT(case, N);                    \
+            typedef \
+                typename proto::result_of::value<         \
+                    typename proto::result_of::child_c<   \
+                        BOOST_PP_CAT(case, N)             \
+                      , 0                                 \
+                    >::type \
                 >::type \
-            >::type::value : \
-            eval(proto::child_c<1>(fusion::at_c<N>(cases)), env);
+                BOOST_PP_CAT(case_label, N); \
+            mpl::int_<N> BOOST_PP_CAT(idx, N); \
         /**/
+
+        #define PHOENIX_SWITCH_EVAL_R(Z, N, DATA) \
+        case BOOST_PP_CAT(case_label, N)::value : \
+            eval(proto::child_c<1>(detail::switch_grammar()(cases, BOOST_PP_CAT(idx, N), size)), env); \
+            break;
+        /**/
+
         #define PHOENIX_SWITCH_EVAL(Z, N, DATA) \
             template <typename Env, typename Cond, typename Cases> \
-            result_type evaluate(Env & env, Cond const & cond, Cases const & cases, mpl::int_<N>, mpl::false_) const\
+            result_type evaluate(Env & env, Cond const & cond, Cases const & cases, mpl::int_<N> size, mpl::false_) const\
             { \
+                BOOST_PP_REPEAT(N, PHOENIX_SWITCH_EVAL_TYPEDEF_R, N) \
+                switch(eval(cond, env)) \
+                { \
+                    BOOST_PP_REPEAT(N, PHOENIX_SWITCH_EVAL_R, _) \
+                } \
             } \
             \
             template <typename Env, typename Cond, typename Cases> \
-            result_type evaluate(Env & env, Cond const & cond, Cases const & cases, mpl::int_<N>, mpl::true_) const\
+            result_type evaluate(Env & env, Cond const & cond, Cases const & cases, mpl::int_<N> size, mpl::true_) const\
             { \
+                BOOST_PP_REPEAT(BOOST_PP_DEC(N), PHOENIX_SWITCH_EVAL_TYPEDEF_R, N) \
+                mpl::int_<BOOST_PP_DEC(N)> BOOST_PP_CAT(idx, BOOST_PP_DEC(N)); \
                 switch(eval(cond, env)) \
                 { \
                     BOOST_PP_REPEAT(BOOST_PP_DEC(N), PHOENIX_SWITCH_EVAL_R, _) \
-                    default: eval(fusion::at_c<N-1>(cases), env); \
+                    default: eval(proto::child_c<0>(detail::switch_grammar()(cases, BOOST_PP_CAT(idx, BOOST_PP_DEC(N)), size)), env); \
                 } \
             } \
         /**/
-        BOOST_PP_REPEAT(PHOENIX_LIMIT, PHOENIX_SWITCH_EVAL, _)
+        BOOST_PP_REPEAT_FROM_TO(0, PHOENIX_LIMIT, PHOENIX_SWITCH_EVAL, _)
     };
     
     template <typename Dummy>
@@ -191,7 +222,7 @@
             switch_eval(
                 _env
               , proto::_child_c<0> // Cond
-              , proto::functional::flatten(proto::_child_c<1>) // Cases
+              , proto::_child_c<1> // Cases
             )
           >
     {};
Modified: sandbox/SOC/2010/phoenix3/libs/phoenix/test/Jamfile
==============================================================================
--- sandbox/SOC/2010/phoenix3/libs/phoenix/test/Jamfile	(original)
+++ sandbox/SOC/2010/phoenix3/libs/phoenix/test/Jamfile	2010-11-26 11:15:22 EST (Fri, 26 Nov 2010)
@@ -53,7 +53,7 @@
 test-suite phoenix_statement :
     [ run statement/if_tests.cpp ] 
     [ run statement/loops_tests.cpp ] 
-#    [ run statement/switch_tests.cpp ] 
+    [ run statement/switch_tests.cpp ] 
 #    [ run statement/exceptions.cpp ]
     ;
         
Modified: sandbox/SOC/2010/phoenix3/libs/phoenix/test/statement/switch_tests.cpp
==============================================================================
--- sandbox/SOC/2010/phoenix3/libs/phoenix/test/statement/switch_tests.cpp	(original)
+++ sandbox/SOC/2010/phoenix3/libs/phoenix/test/statement/switch_tests.cpp	2010-11-26 11:15:22 EST (Fri, 26 Nov 2010)
@@ -20,7 +20,6 @@
 {
     using boost::phoenix::arg_names::_1;
     using boost::phoenix::case_;
-    //using boost::phoenix::default_;
     using boost::phoenix::switch_;
     using boost::phoenix::ref;
     using boost::phoenix::val;
@@ -33,7 +32,6 @@
     int init[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
     vector<int> v(init, init+10);
 
-    /*
     for_each(v.begin(), v.end(),
         switch_(_1)
         [
@@ -41,7 +39,6 @@
             case_<4>(cout << val("<4>") << endl)
         ]
     );
-    */
 
     cout << endl;
     for_each(v.begin(), v.end(),
@@ -54,7 +51,6 @@
 
     cout << endl;
     
-    /*
     for_each(v.begin(), v.end(),
         switch_(_1)
         [
@@ -64,7 +60,6 @@
             case_<4>(cout << val("<4>") << endl)
         ]
     );
-    */
 
     cout << endl;