Update of /cvsroot/boost/boost/boost/xpressive/proto
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv2719/proto
Modified Files:
make_expr.hpp operators.hpp proto_fwd.hpp traits.hpp
Log Message:
add BOOST_PROTO_DEFINE_OPERATORS, is_extension and the exops namespace, fix
BOOST_PROTO_DEFINE_FUNCTION_TEMPLATE's handling of deduce_domain
Index: make_expr.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/make_expr.hpp,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -d -r1.23 -r1.24
--- make_expr.hpp 23 Jun 2007 21:22:31 -0000 1.23
+++ make_expr.hpp 25 Jun 2007 05:39:40 -0000 1.24
@@ -20,6 +20,7 @@
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/iterate.hpp>
#include <boost/preprocessor/facilities/intercept.hpp>
+ #include <boost/preprocessor/comparison/greater.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/to_list.hpp>
#include <boost/preprocessor/logical/and.hpp>
@@ -167,41 +168,22 @@
/// INTERNAL ONLY
///
- #define BOOST_PROTO_VARARG_TYPE_YES_(R, DATA, I, ELEM)
\
- , typename boost::proto::result_of::as_expr<
\
- const BOOST_PP_SEQ_HEAD(ELEM)
\
- BOOST_PP_IF(
\
- BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ELEM))
\
- , BOOST_PROTO_TEMPLATE_PARAMS_YES_
\
- , BOOST_PROTO_TEMPLATE_PARAMS_NO_
\
- )(R, DATA, I, ELEM)
\
- , DATA
\
- >::type
\
- /**/
-
- /// INTERNAL ONLY
- ///
- #define BOOST_PROTO_VARARG_TYPE_NO_(R, DATA, I, ELEM)
\
+ #define BOOST_PROTO_VARARG_TYPE_(R, DATA, I, ELEM)
\
+ BOOST_PP_COMMA_IF(I)
\
BOOST_PP_SEQ_HEAD(ELEM)
\
BOOST_PP_IF(
\
BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ELEM))
\
, BOOST_PROTO_TEMPLATE_PARAMS_YES_
\
, BOOST_PROTO_TEMPLATE_PARAMS_NO_
\
- )(R, DATA, I, ELEM)
\
- /**/
-
- /// INTERNAL ONLY
- ///
- #define BOOST_PROTO_VARARG_TYPE_(R, DATA, I, ELEM)
\
- BOOST_PP_IF(I, BOOST_PROTO_VARARG_TYPE_YES_,
BOOST_PROTO_VARARG_TYPE_NO_)(R, DATA, I, ELEM) \
+ )(R, DATA, I, ELEM) BOOST_PP_EXPR_IF(BOOST_PP_GREATER(I, 1), const)
\
/**/
/// INTERNAL ONLY
///
#define BOOST_PROTO_VARARG_AS_EXPR_(R, DATA, I, ELEM)
\
BOOST_PP_EXPR_IF(
\
- I
\
- , (boost::proto::as_expr<DATA>(
\
+ BOOST_PP_GREATER(I, 1)
\
+ , ((
\
BOOST_PP_SEQ_HEAD(ELEM)
\
BOOST_PP_IF(
\
BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ELEM))
\
@@ -215,7 +197,7 @@
/// INTERNAL ONLY
///
#define BOOST_PROTO_VARARG_AS_ARG_(Z, N, DATA)
\
- (BOOST_PROTO_AS_ARG(Z, N, DATA))
\
+ (BOOST_PP_CAT(DATA, N))
\
/**/
/// INTERNAL ONLY
@@ -224,7 +206,6 @@
BOOST_PP_SEQ_POP_BACK(BOOST_PP_SEQ_PUSH_FRONT(BOOST_PP_SEQ_PUSH_BACK(SEQ,
_dummy_), ELEM)) \
/**/
-
/// INTERNAL ONLY
///
#define BOOST_PROTO_VARARG_AS_PARAM_(Z, N, DATA)
\
@@ -237,72 +218,60 @@
template<
\
BOOST_PP_SEQ_ENUM(
\
BOOST_PP_SEQ_FOR_EACH_I(
\
- BOOST_PROTO_VARARG_TEMPLATE_
\
- , ~
\
- , BOOST_PROTO_SEQ_PUSH_FRONT(
\
- BOOST_PP_TUPLE_ELEM(4, 2, DATA)
\
+ BOOST_PROTO_VARARG_TEMPLATE_, ~
\
+ , BOOST_PP_SEQ_PUSH_FRONT(
\
+ BOOST_PROTO_SEQ_PUSH_FRONT(
\
+ BOOST_PP_TUPLE_ELEM(4, 2, DATA)\
+ , (BOOST_PP_TUPLE_ELEM(4, 3, DATA))\
+ )
\
, BOOST_PP_TUPLE_ELEM(4, 1, DATA)
\
)
\
)
\
- BOOST_PP_REPEAT_ ## Z(
\
- N
\
- , BOOST_PROTO_VARARG_AS_PARAM_
\
- , typename A
\
- )
\
+ BOOST_PP_REPEAT_ ## Z(N, BOOST_PROTO_VARARG_AS_PARAM_,
typename A) \
)
\
>
\
- typename boost::mpl::apply_wrap1<
\
- BOOST_PP_TUPLE_ELEM(4, 3, DATA)
\
- , typename boost::proto::nary_expr<
\
- BOOST_PP_SEQ_FOR_EACH_I(
\
- BOOST_PROTO_VARARG_TYPE_
\
- , BOOST_PP_TUPLE_ELEM(4, 3, DATA)
\
- , BOOST_PROTO_SEQ_PUSH_FRONT(
\
+ typename boost::proto::result_of::make_expr<
\
+ BOOST_PP_SEQ_FOR_EACH_I(
\
+ BOOST_PROTO_VARARG_TYPE_, ~
\
+ , BOOST_PP_SEQ_PUSH_FRONT(
\
+ BOOST_PROTO_SEQ_PUSH_FRONT(
\
BOOST_PP_TUPLE_ELEM(4, 2, DATA)
\
- , BOOST_PP_TUPLE_ELEM(4, 1, DATA)
\
+ , (BOOST_PP_TUPLE_ELEM(4, 3, DATA))
\
)
\
+ , BOOST_PP_TUPLE_ELEM(4, 1, DATA)
\
)
\
- BOOST_PP_ENUM_TRAILING(
\
- N
\
- , BOOST_PROTO_AS_ARG_TYPE
\
- , (const A, BOOST_PP_TUPLE_ELEM(4, 3, DATA))
\
- )
\
- >::type
\
- >::type
\
+ )
\
+ BOOST_PP_ENUM_TRAILING_PARAMS(N, const A)
\
+ >::type const
\
BOOST_PP_TUPLE_ELEM(4, 0, DATA)(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N,
const A, &a)) \
{
\
- typename boost::proto::nary_expr<
\
+ return boost::proto::result_of::make_expr<
\
BOOST_PP_SEQ_FOR_EACH_I(
\
- BOOST_PROTO_VARARG_TYPE_
\
- , BOOST_PP_TUPLE_ELEM(4, 3, DATA)
\
- , BOOST_PROTO_SEQ_PUSH_FRONT(
\
- BOOST_PP_TUPLE_ELEM(4, 2, DATA)
\
+ BOOST_PROTO_VARARG_TYPE_, ~
\
+ , BOOST_PP_SEQ_PUSH_FRONT(
\
+ BOOST_PROTO_SEQ_PUSH_FRONT(
\
+ BOOST_PP_TUPLE_ELEM(4, 2, DATA)
\
+ , (BOOST_PP_TUPLE_ELEM(4, 3, DATA))
\
+ )
\
, BOOST_PP_TUPLE_ELEM(4, 1, DATA)
\
)
\
)
\
- BOOST_PP_ENUM_TRAILING(
\
- N
\
- , BOOST_PROTO_AS_ARG_TYPE
\
- , (const A, BOOST_PP_TUPLE_ELEM(4, 3, DATA))
\
- )
\
- >::type that = {
\
+ BOOST_PP_ENUM_TRAILING_PARAMS(N, const A)
\
+ >::call(
\
BOOST_PP_SEQ_ENUM(
\
BOOST_PP_SEQ_FOR_EACH_I(
\
- BOOST_PROTO_VARARG_AS_EXPR_
\
- , BOOST_PP_TUPLE_ELEM(4, 3, DATA)
\
- , BOOST_PROTO_SEQ_PUSH_FRONT(
\
- BOOST_PP_TUPLE_ELEM(4, 2, DATA)
\
+ BOOST_PROTO_VARARG_AS_EXPR_, ~
\
+ , BOOST_PP_SEQ_PUSH_FRONT(
\
+ BOOST_PROTO_SEQ_PUSH_FRONT(
\
+ BOOST_PP_TUPLE_ELEM(4, 2, DATA)
\
+ , (BOOST_PP_TUPLE_ELEM(4, 3, DATA))
\
+ )
\
, BOOST_PP_TUPLE_ELEM(4, 1, DATA)
\
)
\
)
\
- BOOST_PP_REPEAT_ ## Z(
\
- N
\
- , BOOST_PROTO_VARARG_AS_ARG_
\
- , (a, BOOST_PP_TUPLE_ELEM(4, 3, DATA))
\
- )
\
+ BOOST_PP_REPEAT_ ## Z(N, BOOST_PROTO_VARARG_AS_ARG_, a)
\
)
\
- };
\
- return BOOST_PP_TUPLE_ELEM(4, 3, DATA)::make(that);
\
+ );
\
}
\
/**/
Index: operators.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/operators.hpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -d -r1.33 -r1.34
--- operators.hpp 23 Jun 2007 21:22:31 -0000 1.33
+++ operators.hpp 25 Jun 2007 05:39:40 -0000 1.34
@@ -102,133 +102,137 @@
return Left::proto_domain::make(that);
}
};
- } // detail
-#define BOOST_PROTO_UNARY_OP(op, tag)\
- template<typename Arg>\
- inline typename detail::generate_if<typename Arg::proto_domain, expr<tag,
args1<ref_<typename Arg::proto_derived_expr> > > >::type const\
- operator op(Arg &arg)\
- {\
- typedef expr<tag, args1<ref_<typename Arg::proto_derived_expr> > >
that_type;\
- that_type that = {{arg}};\
- return Arg::proto_domain::make(that);\
- }\
- template<typename Arg>\
- inline typename detail::generate_if<typename Arg::proto_domain, expr<tag,
args1<ref_<typename Arg::proto_derived_expr const> > > >::type const\
- operator op(Arg const &arg)\
- {\
- typedef expr<tag, args1<ref_<typename Arg::proto_derived_expr const> >
> that_type;\
- that_type that = {{arg}};\
- return Arg::proto_domain::make(that);\
- }\
- /**/
+ template<typename Arg, typename Trait, typename Enable = void>
+ struct arg_weight
+ {
+ BOOST_STATIC_CONSTANT(int, value = 1 + Trait::value);
+ };
-#define BOOST_PROTO_BINARY_OP(op, tag)\
- template<typename Left, typename Right>\
- inline typename detail::as_expr_if<tag, Left, Right>::type const\
- operator op(Left &left, Right &right)\
- {\
- return detail::as_expr_if<tag, Left, Right>::make(left, right);\
- }\
- template<typename Left, typename Right>\
- inline typename detail::as_expr_if<tag, Left, Right const>::type const\
- operator op(Left &left, Right const &right)\
- {\
- return detail::as_expr_if<tag, Left, Right const>::make(left, right);\
- }\
- template<typename Left, typename Right>\
- inline typename detail::as_expr_if<tag, Left const, Right>::type const\
- operator op(Left const &left, Right &right)\
- {\
- return detail::as_expr_if<tag, Left const, Right>::make(left, right);\
- }\
- template<typename Left, typename Right>\
- inline typename detail::as_expr_if<tag, Left const, Right const>::type
const\
- operator op(Left const &left, Right const &right)\
- {\
- return detail::as_expr_if<tag, Left const, Right const>::make(left,
right);\
- }\
- /**/
+ template<typename Arg, typename Trait>
+ struct arg_weight<Arg, Trait, typename Arg::proto_is_expr_>
+ {
+ BOOST_STATIC_CONSTANT(int, value = 0);
+ };
- BOOST_PROTO_UNARY_OP(+, tag::posit)
- BOOST_PROTO_UNARY_OP(-, tag::negate)
- BOOST_PROTO_UNARY_OP(*, tag::dereference)
- BOOST_PROTO_UNARY_OP(~, tag::complement)
- BOOST_PROTO_UNARY_OP(&, tag::address_of)
- BOOST_PROTO_UNARY_OP(!, tag::logical_not)
- BOOST_PROTO_UNARY_OP(++, tag::pre_inc)
- BOOST_PROTO_UNARY_OP(--, tag::pre_dec)
+ template<typename Domain, typename Trait, typename Arg, typename Expr>
+ struct enable_unary
+ : boost::enable_if<
+ boost::mpl::and_<Trait, boost::proto::matches<Expr, typename
Domain::grammar> >
+ , Expr
+ >
+ {};
- BOOST_PROTO_BINARY_OP(<<, tag::shift_left)
- BOOST_PROTO_BINARY_OP(>>, tag::shift_right)
- BOOST_PROTO_BINARY_OP(*, tag::multiplies)
- BOOST_PROTO_BINARY_OP(/, tag::divides)
- BOOST_PROTO_BINARY_OP(%, tag::modulus)
- BOOST_PROTO_BINARY_OP(+, tag::plus)
- BOOST_PROTO_BINARY_OP(-, tag::minus)
- BOOST_PROTO_BINARY_OP(<, tag::less)
- BOOST_PROTO_BINARY_OP(>, tag::greater)
- BOOST_PROTO_BINARY_OP(<=, tag::less_equal)
- BOOST_PROTO_BINARY_OP(>=, tag::greater_equal)
- BOOST_PROTO_BINARY_OP(==, tag::equal_to)
- BOOST_PROTO_BINARY_OP(!=, tag::not_equal_to)
- BOOST_PROTO_BINARY_OP(||, tag::logical_or)
- BOOST_PROTO_BINARY_OP(&&, tag::logical_and)
- BOOST_PROTO_BINARY_OP(&, tag::bitwise_and)
- BOOST_PROTO_BINARY_OP(|, tag::bitwise_or)
- BOOST_PROTO_BINARY_OP(^, tag::bitwise_xor)
- BOOST_PROTO_BINARY_OP(BOOST_PP_COMMA(), tag::comma)
- BOOST_PROTO_BINARY_OP(->*, tag::mem_ptr)
+ template<typename Domain, typename Trait1, typename Arg1, typename
Trait2, typename Arg2, typename Expr>
+ struct enable_binary
+ : boost::enable_if<
+ boost::mpl::and_<
+ mpl::bool_<(3 <= (arg_weight<Arg1, Trait1>::value +
arg_weight<Arg2, Trait2>::value))>
+ , boost::proto::matches<Expr, typename Domain::grammar>
+ >
+ , Expr
+ >
+ {};
- BOOST_PROTO_BINARY_OP(<<=, tag::shift_left_assign)
- BOOST_PROTO_BINARY_OP(>>=, tag::shift_right_assign)
- BOOST_PROTO_BINARY_OP(*=, tag::multilpies_assign)
- BOOST_PROTO_BINARY_OP(/=, tag::divides_assign)
- BOOST_PROTO_BINARY_OP(%=, tag::modulus_assign)
- BOOST_PROTO_BINARY_OP(+=, tag::plus_assign)
- BOOST_PROTO_BINARY_OP(-=, tag::minus_assign)
- BOOST_PROTO_BINARY_OP(&=, tag::bitwise_and_assign)
- BOOST_PROTO_BINARY_OP(|=, tag::bitwise_or_assign)
- BOOST_PROTO_BINARY_OP(^=, tag::bitwise_xor_assign)
+ } // detail
-#undef BOOST_PROTO_UNARY_OP
-#undef BOOST_PROTO_BINARY_OP
+#define BOOST_PROTO_UNARY_OP_IS_POSTFIX_0
+#define BOOST_PROTO_UNARY_OP_IS_POSTFIX_1 , int
- template<typename Arg>
- inline typename detail::generate_if<typename Arg::proto_domain,
expr<tag::post_inc, args1<ref_<typename Arg::proto_derived_expr> > > >::type
const
- operator ++(Arg &arg, int)
- {
- typedef expr<tag::post_inc, args1<ref_<typename
Arg::proto_derived_expr> > > that_type;
- that_type that = {{arg}};
- return Arg::proto_domain::make(that);
- }
+#define BOOST_PROTO_DEFINE_UNARY_OPERATOR(OP, TAG, POST)
\
+ template<typename Arg>
\
+ typename detail::generate_if<
\
+ typename Arg::proto_domain
\
+ , expr<TAG, args1<ref_<typename Arg::proto_derived_expr> > >
\
+ >::type const
\
+ operator OP(Arg &arg BOOST_PROTO_UNARY_OP_IS_POSTFIX_ ## POST)
\
+ {
\
+ typedef expr<TAG, args1<ref_<typename Arg::proto_derived_expr> > >
that_type; \
+ that_type that = {{arg}};
\
+ return Arg::proto_domain::make(that);
\
+ }
\
+ template<typename Arg>
\
+ typename detail::generate_if<
\
+ typename Arg::proto_domain
\
+ , expr<TAG, args1<ref_<typename Arg::proto_derived_expr const> > >
\
+ >::type const
\
+ operator OP(Arg const &arg BOOST_PROTO_UNARY_OP_IS_POSTFIX_ ## POST)
\
+ {
\
+ typedef expr<TAG, args1<ref_<typename Arg::proto_derived_expr const> >
> that_type; \
+ that_type that = {{arg}};
\
+ return Arg::proto_domain::make(that);
\
+ }
\
+ /**/
- template<typename Arg>
- inline typename detail::generate_if<typename Arg::proto_domain,
expr<tag::post_inc, args1<ref_<typename Arg::proto_derived_expr const> > >
>::type const
- operator ++(Arg const &arg, int)
- {
- typedef expr<tag::post_inc, args1<ref_<typename
Arg::proto_derived_expr const> > > that_type;
- that_type that = {{arg}};
- return Arg::proto_domain::make(that);
- }
+#define BOOST_PROTO_DEFINE_BINARY_OPERATOR(OP, TAG)
\
+ template<typename Left, typename Right>
\
+ inline typename detail::as_expr_if<TAG, Left, Right>::type const
\
+ operator OP(Left &left, Right &right)
\
+ {
\
+ return detail::as_expr_if<TAG, Left, Right>::make(left, right);
\
+ }
\
+ template<typename Left, typename Right>
\
+ inline typename detail::as_expr_if<TAG, Left, Right const>::type const
\
+ operator OP(Left &left, Right const &right)
\
+ {
\
+ return detail::as_expr_if<TAG, Left, Right const>::make(left, right);
\
+ }
\
+ template<typename Left, typename Right>
\
+ inline typename detail::as_expr_if<TAG, Left const, Right>::type const
\
+ operator OP(Left const &left, Right &right)
\
+ {
\
+ return detail::as_expr_if<TAG, Left const, Right>::make(left, right);
\
+ }
\
+ template<typename Left, typename Right>
\
+ inline typename detail::as_expr_if<TAG, Left const, Right const>::type
const \
+ operator OP(Left const &left, Right const &right)
\
+ {
\
+ return detail::as_expr_if<TAG, Left const, Right const>::make(left,
right); \
+ }
\
+ /**/
- template<typename Arg>
- inline typename detail::generate_if<typename Arg::proto_domain,
expr<tag::post_dec, args1<ref_<typename Arg::proto_derived_expr> > > >::type
const
- operator --(Arg &arg, int)
- {
- typedef expr<tag::post_dec, args1<ref_<typename
Arg::proto_derived_expr> > > that_type;
- that_type that = {{arg}};
- return Arg::proto_domain::make(that);
- }
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(+, tag::posit, 0)
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(-, tag::negate, 0)
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(*, tag::dereference, 0)
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(~, tag::complement, 0)
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(&, tag::address_of, 0)
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(!, tag::logical_not, 0)
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(++, tag::pre_inc, 0)
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(--, tag::pre_dec, 0)
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(++, tag::post_inc, 1)
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(--, tag::post_dec, 1)
- template<typename Arg>
- inline typename detail::generate_if<typename Arg::proto_domain,
expr<tag::post_dec, args1<ref_<typename Arg::proto_derived_expr const> > >
>::type const
- operator --(Arg const &arg, int)
- {
- typedef expr<tag::post_dec, args1<ref_<typename
Arg::proto_derived_expr const> > > that_type;
- that_type that = {{arg}};
- return Arg::proto_domain::make(that);
- }
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(<<, tag::shift_left)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(>>, tag::shift_right)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(*, tag::multiplies)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(/, tag::divides)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(%, tag::modulus)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(+, tag::plus)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(-, tag::minus)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(<, tag::less)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(>, tag::greater)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(<=, tag::less_equal)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(>=, tag::greater_equal)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(==, tag::equal_to)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(!=, tag::not_equal_to)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(||, tag::logical_or)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(&&, tag::logical_and)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(&, tag::bitwise_and)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(|, tag::bitwise_or)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(^, tag::bitwise_xor)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(BOOST_PP_COMMA(), tag::comma)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(->*, tag::mem_ptr)
+
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(<<=, tag::shift_left_assign)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(>>=, tag::shift_right_assign)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(*=, tag::multilpies_assign)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(/=, tag::divides_assign)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(%=, tag::modulus_assign)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(+=, tag::plus_assign)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(-=, tag::minus_assign)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(&=, tag::bitwise_and_assign)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(|=, tag::bitwise_or_assign)
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(^=, tag::bitwise_xor_assign)
/// if_else
///
@@ -240,6 +244,120 @@
, BOOST_PP_SEQ_NIL
)
+#undef BOOST_PROTO_DEFINE_UNARY_OPERATOR
+#undef BOOST_PROTO_DEFINE_BINARY_OPERATOR
+
+#define BOOST_PROTO_DEFINE_UNARY_OPERATOR(OP, TAG, TRAIT, DOMAIN, POST)
\
+ template<typename Arg>
\
+ typename boost::proto::detail::enable_unary<DOMAIN, TRAIT<Arg>, Arg
\
+ , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Arg>::type
\
+ >::type const
\
+ operator OP(Arg &arg BOOST_PROTO_UNARY_OP_IS_POSTFIX_ ## POST)
\
+ {
\
+ return boost::proto::result_of::make_expr<TAG, DOMAIN,
Arg>::call(arg); \
+ }
\
+ template<typename Arg>
\
+ typename boost::proto::detail::enable_unary<DOMAIN, TRAIT<Arg>, Arg
\
+ , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Arg
const>::type \
+ >::type const
\
+ operator OP(Arg const &arg BOOST_PROTO_UNARY_OP_IS_POSTFIX_ ## POST)
\
+ {
\
+ return boost::proto::result_of::make_expr<TAG, DOMAIN, Arg
const>::call(arg); \
+ }
\
+ /**/
+
+#define BOOST_PROTO_DEFINE_BINARY_OPERATOR(OP, TAG, TRAIT, DOMAIN)
\
+ template<typename Left, typename Right>
\
+ typename boost::proto::detail::enable_binary<DOMAIN, TRAIT<Left>, Left,
TRAIT<Right>, Right \
+ , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Left,
Right>::type \
+ >::type const
\
+ operator OP(Left &left, Right &right)
\
+ {
\
+ return boost::proto::result_of::make_expr<TAG, DOMAIN, Left, Right>
\
+ ::call(left, right);
\
+ }
\
+ template<typename Left, typename Right>
\
+ typename boost::proto::detail::enable_binary<DOMAIN, TRAIT<Left>, Left,
TRAIT<Right>, Right \
+ , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Left, Right
const>::type \
+ >::type const
\
+ operator OP(Left &left, Right const &right)
\
+ {
\
+ return boost::proto::result_of::make_expr<TAG, DOMAIN, Left, Right
const> \
+ ::call(left, right);
\
+ }
\
+ template<typename Left, typename Right>
\
+ typename boost::proto::detail::enable_binary<DOMAIN, TRAIT<Left>, Left,
TRAIT<Right>, Right \
+ , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Left const,
Right>::type \
+ >::type const
\
+ operator OP(Left const &left, Right &right)
\
+ {
\
+ return boost::proto::result_of::make_expr<TAG, DOMAIN, Left const,
Right> \
+ ::call(left, right);
\
+ }
\
+ template<typename Left, typename Right>
\
+ typename boost::proto::detail::enable_binary<DOMAIN, TRAIT<Left>, Left,
TRAIT<Right>, Right \
+ , typename boost::proto::result_of::make_expr<TAG, DOMAIN, Left const,
Right const>::type \
+ >::type const
\
+ operator OP(Left const &left, Right const &right)
\
+ {
\
+ return boost::proto::result_of::make_expr<TAG, DOMAIN, Left const,
Right const> \
+ ::call(left, right);
\
+ }
\
+ /**/
+
+#define BOOST_PROTO_DEFINE_OPERATORS(TRAIT, DOMAIN)
\
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(+, boost::proto::tag::posit, TRAIT,
DOMAIN, 0) \
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(-, boost::proto::tag::negate, TRAIT,
DOMAIN, 0) \
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(*, boost::proto::tag::dereference,
TRAIT, DOMAIN, 0) \
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(~, boost::proto::tag::complement, TRAIT,
DOMAIN, 0) \
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(&, boost::proto::tag::address_of, TRAIT,
DOMAIN, 0) \
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(!, boost::proto::tag::logical_not,
TRAIT, DOMAIN, 0) \
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(++, boost::proto::tag::pre_inc, TRAIT,
DOMAIN, 0) \
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(--, boost::proto::tag::pre_dec, TRAIT,
DOMAIN, 0) \
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(++, boost::proto::tag::post_inc, TRAIT,
DOMAIN, 1) \
+ BOOST_PROTO_DEFINE_UNARY_OPERATOR(--, boost::proto::tag::post_dec, TRAIT,
DOMAIN, 1) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(<<, boost::proto::tag::shift_left,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(>>, boost::proto::tag::shift_right,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(*, boost::proto::tag::multiplies,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(/, boost::proto::tag::divides, TRAIT,
DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(%, boost::proto::tag::modulus, TRAIT,
DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(+, boost::proto::tag::plus, TRAIT,
DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(-, boost::proto::tag::minus, TRAIT,
DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(<, boost::proto::tag::less, TRAIT,
DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(>, boost::proto::tag::greater, TRAIT,
DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(<=, boost::proto::tag::less_equal,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(>=, boost::proto::tag::greater_equal,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(==, boost::proto::tag::equal_to, TRAIT,
DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(!=, boost::proto::tag::not_equal_to,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(||, boost::proto::tag::logical_or,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(&&, boost::proto::tag::logical_and,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(&, boost::proto::tag::bitwise_and,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(|, boost::proto::tag::bitwise_or,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(^, boost::proto::tag::bitwise_xor,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(BOOST_PP_COMMA(),
boost::proto::tag::comma, TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(->*, boost::proto::tag::mem_ptr, TRAIT,
DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(<<=,
boost::proto::tag::shift_left_assign, TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(>>=,
boost::proto::tag::shift_right_assign, TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(*=,
boost::proto::tag::multilpies_assign, TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(/=, boost::proto::tag::divides_assign,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(%=, boost::proto::tag::modulus_assign,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(+=, boost::proto::tag::plus_assign,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(-=, boost::proto::tag::minus_assign,
TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(&=,
boost::proto::tag::bitwise_and_assign, TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(|=,
boost::proto::tag::bitwise_or_assign, TRAIT, DOMAIN) \
+ BOOST_PROTO_DEFINE_BINARY_OPERATOR(^=,
boost::proto::tag::bitwise_xor_assign, TRAIT, DOMAIN) \
+ /**/
+
+ template<typename T>
+ struct is_extension
+ : mpl::false_
+ {};
+
+ namespace exops
+ {
+ BOOST_PROTO_DEFINE_OPERATORS(is_extension, deduce_domain)
+ using proto::if_else;
+ }
}}
#endif
Index: proto_fwd.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/proto_fwd.hpp,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -d -r1.78 -r1.79
--- proto_fwd.hpp 23 Jun 2007 21:22:31 -0000 1.78
+++ proto_fwd.hpp 25 Jun 2007 05:39:40 -0000 1.79
@@ -464,6 +464,12 @@
int const N = INT_MAX;
+ template<typename T>
+ struct is_extension;
+
+ namespace exops
+ {}
+
}} // namespace boost::proto
#endif
Index: traits.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/traits.hpp,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -d -r1.60 -r1.61
--- traits.hpp 23 Jun 2007 21:22:31 -0000 1.60
+++ traits.hpp 25 Jun 2007 05:39:40 -0000 1.61
@@ -312,6 +312,10 @@
typedef BOOST_PP_CAT(data, n) BOOST_PP_CAT(proto_arg, n);\
/**/
+ #define BOOST_PROTO_IMPLICIT_ARG(z, n, data)\
+ BOOST_PP_CAT(data, n) &BOOST_PP_CAT(a, n);\
+ /**/
+
#define BOOST_PROTO_ARG_N_TYPE(z, n, data)\
typename proto::result_of::unref<\
typename Expr::BOOST_PP_CAT(proto_arg, n)\
@@ -323,6 +327,7 @@
#undef BOOST_PROTO_ARG
#undef BOOST_PROTO_ARG_N_TYPE
+ #undef BOOST_PROTO_IMPLICIT_ARG
namespace functional
{
@@ -669,6 +674,33 @@
BOOST_PP_REPEAT(N, BOOST_PROTO_ARG, A)
BOOST_PP_REPEAT_FROM_TO(N, BOOST_PROTO_MAX_ARITY, BOOST_PROTO_ARG,
detail::if_vararg<BOOST_PP_CAT(A, BOOST_PP_DEC(N))> BOOST_PP_INTERCEPT)
};
+
+
+ namespace detail
+ {
+ template<BOOST_PP_ENUM_PARAMS(N, typename A)>
+ struct BOOST_PP_CAT(implicit_expr_, N)
+ {
+ BOOST_PP_REPEAT(N, BOOST_PROTO_IMPLICIT_ARG, A)
+
+ template<typename Tag, typename Args, long Arity>
+ operator expr<Tag, Args, Arity> () const
+ {
+ expr<Tag, Args, Arity> that = {BOOST_PP_ENUM_PARAMS(N, a)};
+ return that;
+ }
+ };
+ }
+
+ template<BOOST_PP_ENUM_PARAMS(N, typename A)>
+ detail::BOOST_PP_CAT(implicit_expr_, N)<BOOST_PP_ENUM_PARAMS(N, A)>
+ implicit_expr(BOOST_PP_ENUM_BINARY_PARAMS(N, A, &a))
+ {
+ detail::BOOST_PP_CAT(implicit_expr_, N)<BOOST_PP_ENUM_PARAMS(N,
A)> that
+ = {BOOST_PP_ENUM_PARAMS(N, a)};
+ return that;
+ }
+
#endif
namespace result_of
@@ -694,6 +726,7 @@
{};
}
+
#undef N
#endif
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs