Update of /cvsroot/boost/boost/boost/xpressive/proto
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv8966/proto
Modified Files:
make_expr.hpp proto_fwd.hpp traits.hpp
Log Message:
as_expr and as_arg take optional Domain template parameter
Index: make_expr.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/make_expr.hpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- make_expr.hpp 25 May 2007 00:53:40 -0000 1.14
+++ make_expr.hpp 25 May 2007 22:23:54 -0000 1.15
@@ -15,6 +15,7 @@
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/iterate.hpp>
#include <boost/preprocessor/facilities/intercept.hpp>
+ #include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/repetition/enum.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
@@ -35,23 +36,31 @@
#include <boost/xpressive/proto/detail/suffix.hpp>
#define BOOST_PROTO_AS_ARG_TYPE(Z, N, DATA)
\
- typename proto::result_of::as_arg<BOOST_PP_CAT(DATA, N)>::type
\
+ typename proto::result_of::as_arg<
\
+ BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, DATA), N)
\
+ , BOOST_PP_TUPLE_ELEM(2, 1, DATA)
\
+ >::type
\
/**/
#define BOOST_PROTO_AS_ARG(Z, N, DATA)
\
- proto::as_arg(BOOST_PP_CAT(DATA, N))
\
+ proto::as_arg<BOOST_PP_TUPLE_ELEM(2, 1, DATA) >(
\
+ BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, DATA), N)
\
+ )
\
/**/
#define BOOST_PROTO_AT_TYPE(Z, N, DATA)
\
typename result_of::as_arg<
\
typename remove_reference<
\
- typename fusion::result_of::value_at_c<DATA, N >::type
\
+ typename fusion::result_of::value_at_c<BOOST_PP_TUPLE_ELEM(2,
0, DATA), N >::type \
>::type
\
+ , BOOST_PP_TUPLE_ELEM(2, 1, DATA)
\
>::type
\
/**/
#define BOOST_PROTO_AT(Z, N, DATA)
\
- proto::as_arg(fusion::at_c<N >(DATA))
\
+ proto::as_arg<BOOST_PP_TUPLE_ELEM(2, 1, DATA) >(
\
+ fusion::at_c<N >(BOOST_PP_TUPLE_ELEM(2, 0, DATA))
\
+ )
\
/**/
namespace boost { namespace fusion
@@ -62,14 +71,14 @@
namespace boost { namespace proto
{
- namespace result_of
+ namespace detail
{
template<typename Tag, typename Domain, typename Sequence,
std::size_t Size>
- struct unpack_expr_detail
+ struct unpack_expr_
{};
template<typename Domain, typename Sequence>
- struct unpack_expr_detail<tag::terminal, Domain, Sequence, 1u>
+ struct unpack_expr_<tag::terminal, Domain, Sequence, 1u>
{
typedef expr<
tag::terminal
@@ -91,11 +100,11 @@
BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(BOOST_PROTO_MAX_ARITY,
typename A, = void BOOST_PP_INTERCEPT)
, typename _ = void
>
- struct make_expr_detail
+ struct make_expr_
{};
template<typename Domain, typename A>
- struct make_expr_detail<tag::terminal, Domain, A>
+ struct make_expr_<tag::terminal, Domain, A>
{
typedef typename add_reference<A>::type reference;
typedef expr<tag::terminal, args1<reference> > expr_type;
@@ -113,27 +122,29 @@
/**/
#include BOOST_PP_ITERATE()
+ }
+ namespace result_of
+ {
template<typename Tag, typename Sequence, typename, typename>
struct unpack_expr
- : unpack_expr_detail<Tag, default_domain, Sequence,
fusion::result_of::size<Sequence>::type::value>
+ : detail::unpack_expr_<Tag, default_domain, Sequence,
fusion::result_of::size<Sequence>::type::value>
{};
template<typename Tag, typename Domain, typename Sequence>
struct unpack_expr<Tag, Domain, Sequence, typename
Domain::boost_proto_is_domain_>
- : unpack_expr_detail<Tag, Domain, Sequence,
fusion::result_of::size<Sequence>::type::value>
+ : detail::unpack_expr_<Tag, Domain, Sequence,
fusion::result_of::size<Sequence>::type::value>
{};
template<typename Tag
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, typename A), typename,
typename>
struct make_expr
- : make_expr_detail<Tag, default_domain
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A) >
+ : detail::make_expr_<Tag, default_domain
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A) >
{};
template<typename Tag, typename Domain
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, typename A) >
struct make_expr<Tag, Domain
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A), typename
Domain::boost_proto_is_domain_>
- : make_expr_detail<Tag, Domain
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A) >
+ : detail::make_expr_<Tag, Domain
BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PROTO_MAX_ARITY, A) >
{};
-
}
namespace functional
@@ -272,11 +283,11 @@
#define N BOOST_PP_ITERATION()
template<typename Tag, typename Domain
BOOST_PP_ENUM_TRAILING_PARAMS(N, typename A)>
- struct make_expr_detail<Tag, Domain BOOST_PP_ENUM_TRAILING_PARAMS(N,
A) >
+ struct make_expr_<Tag, Domain BOOST_PP_ENUM_TRAILING_PARAMS(N, A) >
{
typedef expr<
Tag
- , BOOST_PP_CAT(args, N)<BOOST_PP_ENUM(N,
BOOST_PROTO_AS_ARG_TYPE, A) >
+ , BOOST_PP_CAT(args, N)<BOOST_PP_ENUM(N,
BOOST_PROTO_AS_ARG_TYPE, (A, Domain)) >
> expr_type;
typedef typename generate<Domain, expr_type>::type type;
@@ -284,18 +295,18 @@
static type const call(BOOST_PP_ENUM_BINARY_PARAMS(N, A, &a))
{
expr_type that = {
- BOOST_PP_ENUM(N, BOOST_PROTO_AS_ARG, a)
+ BOOST_PP_ENUM(N, BOOST_PROTO_AS_ARG, (a, Domain))
};
return generate<Domain, expr_type>::make(that);
}
};
template<typename Tag, typename Domain, typename Sequence>
- struct unpack_expr_detail<Tag, Domain, Sequence, N>
+ struct unpack_expr_<Tag, Domain, Sequence, N>
{
typedef expr<
Tag
- , BOOST_PP_CAT(args, N)<BOOST_PP_ENUM(N, BOOST_PROTO_AT_TYPE,
Sequence const) >
+ , BOOST_PP_CAT(args, N)<BOOST_PP_ENUM(N, BOOST_PROTO_AT_TYPE,
(Sequence const, Domain)) >
> expr_type;
typedef typename generate<Domain, expr_type>::type type;
@@ -303,7 +314,7 @@
static type const call(Sequence const &sequence)
{
expr_type that = {
- BOOST_PP_ENUM(N, BOOST_PROTO_AT, sequence)
+ BOOST_PP_ENUM(N, BOOST_PROTO_AT, (sequence, Domain))
};
return generate<Domain, expr_type>::make(that);
}
Index: proto_fwd.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/proto_fwd.hpp,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -d -r1.65 -r1.66
--- proto_fwd.hpp 25 May 2007 00:53:40 -0000 1.65
+++ proto_fwd.hpp 25 May 2007 22:23:54 -0000 1.66
@@ -220,15 +220,12 @@
namespace result_of
{
- template<typename T, typename EnableIf = void>
+ template<typename T, typename Domain = default_domain, typename
EnableIf = void>
struct as_expr;
- template<typename T, typename EnableIf = void>
+ template<typename T, typename Domain = default_domain, typename
EnableIf = void>
struct as_arg;
- template<typename Expr, typename State, typename Visitor, typename
DomainTag>
- struct compile;
-
template<typename Expr, typename N = mpl::long_<0> >
struct arg;
@@ -351,11 +348,15 @@
struct compile;
struct left;
struct right;
- struct as_expr;
- struct as_arg;
struct unref;
struct deep_copy;
+ template<typename Domain = default_domain>
+ struct as_expr;
+
+ template<typename Domain = default_domain>
+ struct as_arg;
+
template<typename N = mpl::long_<0> >
struct arg;
Index: traits.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/traits.hpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -d -r1.52 -r1.53
--- traits.hpp 24 May 2007 23:25:40 -0000 1.52
+++ traits.hpp 25 May 2007 22:23:54 -0000 1.53
@@ -42,8 +42,10 @@
#if BOOST_WORKAROUND( BOOST_MSVC, == 1310 )
#define BOOST_PROTO_IS_ARRAY_(T) boost::is_array<typename
boost::remove_const<T>::type>
+ #define BOOST_PROTO_WITH_ALIAS_(X,Y) template<typename Y>
#else
#define BOOST_PROTO_IS_ARRAY_(T) boost::is_array<T>
+ #define BOOST_PROTO_WITH_ALIAS_(X,Y) typedef X Y;
#endif
#if BOOST_WORKAROUND( BOOST_MSVC, == 1400 )
@@ -79,7 +81,7 @@
namespace result_of
{
// as_expr
- template<typename T, typename EnableIf>
+ template<typename T, typename Domain, typename EnableIf>
struct as_expr
{
typedef typename mpl::if_<
@@ -88,54 +90,54 @@
, typename remove_cv<T>::type
>::type arg0_type;
- typedef expr<proto::tag::terminal, args1<arg0_type> > type;
+ typedef expr<proto::tag::terminal, args1<arg0_type> >
expr_type;
+ typedef typename generate<Domain, expr_type>::type type;
typedef type result_type;
- #if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
- template<typename T2>
+ BOOST_PROTO_WITH_ALIAS_(T, T2)
static result_type call(T2 &t)
{
- return type::make(t);
- }
- #else
- static result_type call(T &t)
- {
- return type::make(t);
+ return generate<Domain,
expr_type>::make(expr_type::make(t));
}
- #endif
};
- template<typename T>
- struct as_expr<T, typename T::is_boost_proto_expr_>
+ template<typename T, typename Domain>
+ struct as_expr<T, Domain, typename T::is_boost_proto_expr_>
{
typedef typename T::boost_proto_expr_type_ type;
typedef T &result_type;
- #if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
- template<typename T2>
+ BOOST_PROTO_WITH_ALIAS_(T, T2)
static result_type call(T2 &t)
{
return t;
}
- #else
- static result_type call(T &t)
- {
- return t;
- }
- #endif
};
// as_arg
- template<typename T, typename EnableIf>
+ template<typename T, typename Domain, typename EnableIf>
struct as_arg
{
- typedef expr<proto::tag::terminal, args1<T &> > type;
+ typedef expr<proto::tag::terminal, args1<T &> > expr_type;
+ typedef typename generate<Domain, expr_type>::type type;
+
+ BOOST_PROTO_WITH_ALIAS_(T, T2)
+ static type call(T2 &t)
+ {
+ return generate<Domain,
expr_type>::make(expr_type::make(t));
+ }
};
- template<typename T>
- struct as_arg<T, typename T::is_boost_proto_expr_>
+ template<typename T, typename Domain>
+ struct as_arg<T, Domain, typename T::is_boost_proto_expr_>
{
typedef ref_<T> type;
+
+ BOOST_PROTO_WITH_ALIAS_(T, T2)
+ static type call(T2 &t)
+ {
+ return type::make(t);
+ }
};
template<typename Expr, typename N>
@@ -305,6 +307,7 @@
namespace functional
{
+ template<typename Domain>
struct as_expr
{
template<typename Sig>
@@ -312,22 +315,25 @@
template<typename This, typename T>
struct result<This(T)>
- : result_of::as_expr<typename remove_reference<T>::type>
+ : result_of::as_expr<typename remove_reference<T>::type,
Domain>
{};
template<typename T>
- typename result_of::as_expr<T>::result_type operator()(T &t)
const
+ typename result_of::as_expr<T, Domain>::result_type
+ operator ()(T &t) const
{
- return result_of::as_expr<T>::call(t);
+ return result_of::as_expr<T, Domain>::call(t);
}
template<typename T>
- typename result_of::as_expr<T const>::result_type operator()(T
const &t) const
+ typename result_of::as_expr<T const, Domain>::result_type
+ operator ()(T const &t) const
{
- return result_of::as_expr<T const>::call(t);
+ return result_of::as_expr<T const, Domain>::call(t);
}
};
+ template<typename Domain>
struct as_arg
{
template<typename Sig>
@@ -335,21 +341,21 @@
template<typename This, typename T>
struct result<This(T)>
- : result_of::as_arg<typename remove_reference<T>::type>
+ : result_of::as_arg<typename remove_reference<T>::type,
Domain>
{};
template<typename T>
- typename result_of::as_arg<T>::type operator()(T &t) const
+ typename result_of::as_arg<T, Domain>::type
+ operator ()(T &t) const
{
- typename result_of::as_arg<T>::type that = {t};
- return that;
+ return result_of::as_arg<T, Domain>::call(t);
}
template<typename T>
- typename result_of::as_arg<T const>::type operator()(T const
&t) const
+ typename result_of::as_arg<T const, Domain>::type
+ operator ()(T const &t) const
{
- typename result_of::as_arg<T const>::type that = {t};
- return that;
+ return result_of::as_arg<T const, Domain>::call(t);
}
};
@@ -365,13 +371,13 @@
{};
template<typename Expr>
- typename result_of::arg_c<Expr, N>::reference operator()(Expr
&expr) const
+ typename result_of::arg_c<Expr, N>::reference operator ()(Expr
&expr) const
{
return result_of::arg_c<Expr, N>::call(expr);
}
template<typename Expr>
- typename result_of::arg_c<Expr, N>::const_reference
operator()(Expr const &expr) const
+ typename result_of::arg_c<Expr, N>::const_reference operator
()(Expr const &expr) const
{
return result_of::arg_c<Expr, N>::call(expr);
}
@@ -389,13 +395,13 @@
{};
template<typename Expr>
- typename result_of::arg<Expr, N>::reference operator()(Expr
&expr) const
+ typename result_of::arg<Expr, N>::reference operator ()(Expr
&expr) const
{
return result_of::arg<Expr, N>::call(expr);
}
template<typename Expr>
- typename result_of::arg<Expr, N>::const_reference
operator()(Expr const &expr) const
+ typename result_of::arg<Expr, N>::const_reference operator
()(Expr const &expr) const
{
return result_of::arg<Expr, N>::call(expr);
}
@@ -412,13 +418,13 @@
{};
template<typename Expr>
- typename result_of::left<Expr>::reference operator()(Expr
&expr) const
+ typename result_of::left<Expr>::reference operator ()(Expr
&expr) const
{
return proto::unref(expr.cast().arg0);
}
template<typename Expr>
- typename result_of::left<Expr>::const_reference
operator()(Expr const &expr) const
+ typename result_of::left<Expr>::const_reference operator
()(Expr const &expr) const
{
return proto::unref(expr.cast().arg0);
}
@@ -435,13 +441,13 @@
{};
template<typename Expr>
- typename result_of::right<Expr>::reference operator()(Expr
&expr) const
+ typename result_of::right<Expr>::reference operator ()(Expr
&expr) const
{
return proto::unref(expr.cast().arg1);
}
template<typename Expr>
- typename result_of::right<Expr>::const_reference
operator()(Expr const &expr) const
+ typename result_of::right<Expr>::const_reference operator
()(Expr const &expr) const
{
return proto::unref(expr.cast().arg1);
}
@@ -449,11 +455,81 @@
}
- functional::as_expr const as_expr = {};
- functional::as_arg const as_arg = {};
functional::left const left = {};
functional::right const right = {};
+ /// as_expr
+ ///
+ template<typename T>
+ typename result_of::as_expr<T>::result_type
+ as_expr(T &t BOOST_PROTO_DISABLE_IF_IS_CONST(T))
+ {
+ return result_of::as_expr<T>::call(t);
+ }
+
+ /// \overload
+ ///
+ template<typename T>
+ typename result_of::as_expr<T const>::result_type
+ as_expr(T const &t)
+ {
+ return result_of::as_expr<T const>::call(t);
+ }
+
+ /// \overload
+ ///
+ template<typename Domain, typename T>
+ typename result_of::as_expr<T, Domain>::result_type
+ as_expr(T &t BOOST_PROTO_DISABLE_IF_IS_CONST(T))
+ {
+ return result_of::as_expr<T, Domain>::call(t);
+ }
+
+ /// \overload
+ ///
+ template<typename Domain, typename T>
+ typename result_of::as_expr<T const, Domain>::result_type
+ as_expr(T const &t)
+ {
+ return result_of::as_expr<T const, Domain>::call(t);
+ }
+
+ /// as_arg
+ ///
+ template<typename T>
+ typename result_of::as_arg<T>::type
+ as_arg(T &t BOOST_PROTO_DISABLE_IF_IS_CONST(T))
+ {
+ return result_of::as_arg<T>::call(t);
+ }
+
+ /// \overload
+ ///
+ template<typename T>
+ typename result_of::as_arg<T const>::type
+ as_arg(T const &t)
+ {
+ return result_of::as_arg<T const>::call(t);
+ }
+
+ /// \overload
+ ///
+ template<typename Domain, typename T>
+ typename result_of::as_arg<T, Domain>::type
+ as_arg(T &t BOOST_PROTO_DISABLE_IF_IS_CONST(T))
+ {
+ return result_of::as_arg<T, Domain>::call(t);
+ }
+
+ /// \overload
+ ///
+ template<typename Domain, typename T>
+ typename result_of::as_arg<T const, Domain>::type
+ as_arg(T const &t)
+ {
+ return result_of::as_arg<T const, Domain>::call(t);
+ }
+
/// arg
///
template<typename Expr>
-------------------------------------------------------------------------
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