$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r50266 - in trunk: boost/proto libs/proto/test
From: eric_at_[hidden]
Date: 2008-12-14 00:53:23
Author: eric_niebler
Date: 2008-12-14 00:53:21 EST (Sun, 14 Dec 2008)
New Revision: 50266
URL: http://svn.boost.org/trac/boost/changeset/50266
Log:
allow 0- and 1-argument variants of proto::or_ and proto::and_
Text files modified: 
   trunk/boost/proto/matches.hpp     |    38 ++++++++++++++++++++++++++++++++++++++  
   trunk/boost/proto/proto_fwd.hpp   |    21 ++-------------------                   
   trunk/libs/proto/test/matches.cpp |     9 +++++++++                               
   3 files changed, 49 insertions(+), 19 deletions(-)
Modified: trunk/boost/proto/matches.hpp
==============================================================================
--- trunk/boost/proto/matches.hpp	(original)
+++ trunk/boost/proto/matches.hpp	2008-12-14 00:53:21 EST (Sun, 14 Dec 2008)
@@ -89,6 +89,18 @@
             template<typename And>
             struct last;
 
+            template<>
+            struct last<proto::and_<> >
+            {
+                typedef proto::_ type;
+            };
+
+            template<typename G0>
+            struct last<proto::and_<G0> >
+            {
+                typedef G0 type;
+            };
+
             template<typename T, typename U>
             struct array_matches
               : mpl::false_
@@ -393,6 +405,32 @@
               : detail::uncvref<typename when<_, If>::template impl<Expr, int, int>::result_type>::type
             {};
 
+            // handle degenerate cases of proto::or_
+            template<typename Expr>
+            struct matches_<Expr, or_<> >
+              : mpl::false_
+            {
+                typedef not_<_> which;
+            };
+
+            template<typename Expr, typename G0>
+            struct matches_<Expr, or_<G0> >
+              : matches_<Expr, typename G0::proto_base_expr>
+            {
+                typedef G0 which;
+            };
+
+            // handle degenerate cases of proto::and_
+            template<typename Expr>
+            struct matches_<Expr, and_<> >
+              : mpl::true_
+            {};
+
+            template<typename Expr, typename G0>
+            struct matches_<Expr, and_<G0> >
+              : matches_<Expr, typename G0::proto_base_expr>
+            {};
+
             // handle proto::not_
             template<typename Expr, typename Grammar>
             struct matches_<Expr, not_<Grammar> >
Modified: trunk/boost/proto/proto_fwd.hpp
==============================================================================
--- trunk/boost/proto/proto_fwd.hpp	(original)
+++ trunk/boost/proto/proto_fwd.hpp	2008-12-14 00:53:21 EST (Sun, 14 Dec 2008)
@@ -16,7 +16,6 @@
 #include <boost/version.hpp>
 #include <boost/detail/workaround.hpp>
 #include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/arithmetic/sub.hpp>
 #include <boost/preprocessor/punctuation/comma.hpp>
 #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
 #include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>
@@ -317,26 +316,10 @@
 
     namespace control
     {
-        template<
-            typename Grammar0
-          , typename Grammar1
-          , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
-                BOOST_PP_SUB(BOOST_PROTO_MAX_LOGICAL_ARITY,2)
-              , typename G
-              , void
-            )
-        >
+        template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_LOGICAL_ARITY, typename G, void)>
         struct or_;
 
-        template<
-            typename Grammar0
-          , typename Grammar1
-          , BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(
-                BOOST_PP_SUB(BOOST_PROTO_MAX_LOGICAL_ARITY,2)
-              , typename G
-              , void
-            )
-        >
+        template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PROTO_MAX_LOGICAL_ARITY, typename G, void)>
         struct and_;
 
         template<typename Grammar>
Modified: trunk/libs/proto/test/matches.cpp
==============================================================================
--- trunk/libs/proto/test/matches.cpp	(original)
+++ trunk/libs/proto/test/matches.cpp	2008-12-14 00:53:21 EST (Sun, 14 Dec 2008)
@@ -263,6 +263,15 @@
 
         assert_matches<proto::nullary_expr<_, _> >( i );
     }
+
+    // check 0 and 1 arg forms or or_ and and_
+    {
+        assert_matches< proto::and_<> >( lit(1) );
+        assert_not_matches< proto::or_<> >( lit(1) );
+
+        assert_matches< proto::and_<proto::terminal<int> > >( lit(1) );
+        assert_matches< proto::or_<proto::terminal<int> > >( lit(1) );
+    }
 }
 
 using namespace unit_test;