Update of /cvsroot/boost/boost/boost/xpressive/proto
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv19512/proto
Modified Files:
generate.hpp proto_fwd.hpp ref.hpp
Log Message:
add by_value_generator
Index: generate.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/generate.hpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- generate.hpp 6 Jul 2007 02:55:54 -0000 1.6
+++ generate.hpp 23 Jul 2007 04:21:42 -0000 1.7
@@ -1,93 +1,186 @@
-///////////////////////////////////////////////////////////////////////////////
-/// \file generate.hpp
-/// Contains definition of generate\<\> class template, which end users can
-/// specialize for generating domain-specific expression wrappers.
-//
-// Copyright 2004 Eric Niebler. 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_PROTO_GENERATE_HPP_EAN_02_13_2007
-#define BOOST_PROTO_GENERATE_HPP_EAN_02_13_2007
+#ifndef BOOST_PP_IS_ITERATING
+
///////////////////////////////////////////////////////////////////////////////
+ /// \file generate.hpp
+ /// Contains definition of generate\<\> class template, which end users can
+ /// specialize for generating domain-specific expression wrappers.
+ //
+ // Copyright 2004 Eric Niebler. 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)
-#include <boost/xpressive/proto/detail/prefix.hpp>
-#include <boost/utility/enable_if.hpp>
-#include <boost/xpressive/proto/proto_fwd.hpp>
-#include <boost/xpressive/proto/matches.hpp>
-#include <boost/xpressive/proto/detail/suffix.hpp>
+ #ifndef BOOST_PROTO_GENERATE_HPP_EAN_02_13_2007
+ #define BOOST_PROTO_GENERATE_HPP_EAN_02_13_2007
-namespace boost { namespace proto
-{
+ #include <boost/xpressive/proto/detail/prefix.hpp>
+ #include <boost/preprocessor/cat.hpp>
+ #include <boost/preprocessor/selection/max.hpp>
+ #include <boost/preprocessor/iteration/iterate.hpp>
+ #include <boost/preprocessor/repetition/enum.hpp>
+ #include <boost/utility/enable_if.hpp>
+ #include <boost/xpressive/proto/proto_fwd.hpp>
+ #include <boost/xpressive/proto/matches.hpp>
+ #include <boost/xpressive/proto/detail/suffix.hpp>
- namespace generatorns_
+ namespace boost { namespace proto
{
- struct default_generator
+
+ namespace detail
{
+ template<typename Domain, typename Expr>
+ struct generate_if
+ : lazy_enable_if<
+ matches<Expr, typename Domain::grammar>
+ , typename Domain::template apply<Expr>
+ >
+ {};
+
+ // Optimization, generate fewer templates...
template<typename Expr>
- struct apply
+ struct generate_if<proto::default_domain, Expr>
{
typedef Expr type;
};
template<typename Expr>
- static Expr const &make(Expr const &expr)
- {
- return expr;
- };
- };
+ struct arity_;
+
+ template<typename Tag, typename Args, long N>
+ struct arity_<expr<Tag, Args, N> >
+ : mpl::long_<N>
+ {};
- template<template<typename> class Extends>
- struct generator
- {
template<typename Expr>
- struct apply
+ struct tag_;
+
+ template<typename Tag, typename Args, long N>
+ struct tag_<expr<Tag, Args, N> >
{
- typedef Extends<Expr> type;
+ typedef Tag type;
};
template<typename Expr>
- static Extends<Expr> make(Expr const &expr)
+ struct args_;
+
+ template<typename Tag, typename Args, long N>
+ struct args_<expr<Tag, Args, N> >
{
- return Extends<Expr>(expr);
- }
- };
+ typedef Args type;
+ };
- template<template<typename> class Extends>
- struct pod_generator
+ template<typename Expr, long Arity = detail::arity_<Expr>::value>
+ struct by_value_generator_;
+
+ #define BOOST_PROTO_DEFINE_BY_VALUE_TYPE(Z, N, Expr)\
+ typename result_of::unref<typename
args_<Expr>::type::BOOST_PP_CAT(arg, N) >::type
+
+ #define BOOST_PROTO_DEFINE_BY_VALUE(Z, N, expr)\
+ proto::unref(expr.BOOST_PP_CAT(arg, N))
+
+ #define BOOST_PP_ITERATION_PARAMS_1 (3, (0, BOOST_PROTO_MAX_ARITY,
<boost/xpressive/proto/generate.hpp>))
+ #include BOOST_PP_ITERATE()
+
+ #undef BOOST_PROTO_DEFINE_BY_VALUE
+ #undef BOOST_PROTO_DEFINE_BY_VALUE_TYPE
+
+ }
+
+ namespace generatorns_
{
- template<typename Expr>
- struct apply
+ struct default_generator
{
- typedef Extends<Expr> type;
+ template<typename Expr>
+ struct apply
+ {
+ typedef Expr type;
+ };
+
+ template<typename Expr>
+ static Expr const &make(Expr const &expr)
+ {
+ return expr;
+ };
};
- template<typename Expr>
- static Extends<Expr> make(Expr const &expr)
+ template<template<typename> class Extends>
+ struct generator
{
- Extends<Expr> that = {expr};
- return that;
- }
- };
- }
+ template<typename Expr>
+ struct apply
+ {
+ typedef Extends<Expr> type;
+ };
- namespace detail
- {
- template<typename Domain, typename Expr>
- struct generate_if
- : lazy_enable_if<
- matches<Expr, typename Domain::grammar>
- , typename Domain::template apply<Expr>
- >
- {};
+ template<typename Expr>
+ static Extends<Expr> make(Expr const &expr)
+ {
+ return Extends<Expr>(expr);
+ }
+ };
- // Optimization, generate fewer templates...
- template<typename Expr>
- struct generate_if<proto::default_domain, Expr>
- {
- typedef Expr type;
- };
- }
+ template<template<typename> class Extends>
+ struct pod_generator
+ {
+ template<typename Expr>
+ struct apply
+ {
+ typedef Extends<Expr> type;
+ };
-}}
+ template<typename Expr>
+ static Extends<Expr> make(Expr const &expr)
+ {
+ Extends<Expr> that = {expr};
+ return that;
+ }
+ };
+
+ template<typename Generator>
+ struct by_value_generator
+ {
+ template<typename Expr>
+ struct apply
+ : Generator::template apply<
+ typename detail::by_value_generator_<Expr>::type
+ >
+ {};
+
+ template<typename Expr>
+ static typename apply<Expr>::type make(Expr const &expr)
+ {
+ return
Generator::make(detail::by_value_generator_<Expr>::make(expr));
+ }
+ };
+ }
+
+ }}
+
+ #endif // BOOST_PROTO_GENERATE_HPP_EAN_02_13_2007
+
+#else // BOOST_PP_IS_ITERATING
+
+ #define N BOOST_PP_ITERATION()
+
+ template<typename Expr>
+ struct by_value_generator_<Expr, N>
+ {
+ typedef expr<
+ typename tag_<Expr>::type
+ , BOOST_PP_CAT(args, N)<
+ // typename result_of::unref<typename
args_<Expr>::type::arg0>::type, ...
+ BOOST_PP_ENUM(BOOST_PP_MAX(N, 1),
BOOST_PROTO_DEFINE_BY_VALUE_TYPE, Expr)
+ >
+ > type;
+
+ static type const make(Expr const &expr)
+ {
+ type that = {
+ // proto::unref(expr.arg0), ...
+ BOOST_PP_ENUM(BOOST_PP_MAX(N, 1),
BOOST_PROTO_DEFINE_BY_VALUE, expr)
+ };
+ return that;
+ }
+ };
+
+ #undef N
#endif
Index: proto_fwd.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/proto_fwd.hpp,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -d -r1.89 -r1.90
--- proto_fwd.hpp 14 Jul 2007 07:36:26 -0000 1.89
+++ proto_fwd.hpp 23 Jul 2007 04:21:42 -0000 1.90
@@ -137,11 +137,15 @@
template<template<typename> class Extends>
struct pod_generator;
+
+ template<typename Generator = default_generator>
+ struct by_value_generator;
}
using generatorns_::default_generator;
using generatorns_::generator;
using generatorns_::pod_generator;
+ using generatorns_::by_value_generator;
namespace domainns_
{
Index: ref.hpp
===================================================================
RCS file: /cvsroot/boost/boost/boost/xpressive/proto/ref.hpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- ref.hpp 6 Jul 2007 08:54:43 -0000 1.31
+++ ref.hpp 23 Jul 2007 04:21:42 -0000 1.32
@@ -79,12 +79,20 @@
template<typename T>
struct unref<ref_<T> >
{
- typedef typename T::proto_derived_expr type;
+ typedef T type;
typedef T &reference;
typedef T &const_reference;
};
template<typename T>
+ struct unref<ref_<T const> >
+ {
+ typedef T type;
+ typedef T const &reference;
+ typedef T const &const_reference;
+ };
+
+ template<typename T>
struct unref<T &>
{
typedef T type;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs