summaryrefslogtreecommitdiff
path: root/boost/proto/fusion.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/proto/fusion.hpp')
-rw-r--r--boost/proto/fusion.hpp191
1 files changed, 124 insertions, 67 deletions
diff --git a/boost/proto/fusion.hpp b/boost/proto/fusion.hpp
index 198a34503d..21763d3139 100644
--- a/boost/proto/fusion.hpp
+++ b/boost/proto/fusion.hpp
@@ -21,12 +21,14 @@
#include <boost/fusion/include/iterator_base.hpp>
#include <boost/fusion/include/intrinsic.hpp>
#include <boost/fusion/include/single_view.hpp>
-#include <boost/fusion/include/transform_view.hpp>
+#include <boost/fusion/include/transform.hpp>
+#include <boost/fusion/include/as_list.hpp>
#include <boost/fusion/include/is_segmented.hpp>
#include <boost/fusion/sequence/comparison/enable_comparison.hpp>
#include <boost/proto/proto_fwd.hpp>
#include <boost/proto/traits.hpp>
#include <boost/proto/eval.hpp>
+#include <boost/proto/make_expr.hpp>
#ifdef BOOST_MSVC
#pragma warning(push)
@@ -46,7 +48,12 @@ namespace boost { namespace proto
typedef Expr expr_type;
static const long index = Pos;
typedef fusion::random_access_traversal_tag category;
- typedef tag::proto_expr_iterator fusion_tag;
+ typedef
+ tag::proto_expr_iterator<
+ typename Expr::proto_tag
+ , typename Expr::proto_domain
+ >
+ fusion_tag;
explicit expr_iterator(Expr &e)
: expr(e)
@@ -55,20 +62,6 @@ namespace boost { namespace proto
Expr &expr;
};
- template<typename Expr>
- struct flat_view
- {
- typedef Expr expr_type;
- typedef fusion::forward_traversal_tag category;
- typedef tag::proto_flat_view fusion_tag;
-
- explicit flat_view(Expr &e)
- : expr_(e)
- {}
-
- Expr &expr_;
- };
-
template<typename Tag>
struct as_element
{
@@ -103,6 +96,33 @@ namespace boost { namespace proto
return typename result<as_element(Expr const &)>::type(e);
}
};
+
+ template<typename Expr>
+ struct flat_view
+ : fusion::sequence_base<flat_view<Expr> >
+ {
+ typedef fusion::forward_traversal_tag category;
+ typedef
+ tag::proto_flat_view<
+ typename Expr::proto_tag
+ , typename Expr::proto_domain
+ >
+ fusion_tag;
+ typedef
+ typename fusion::result_of::as_list<
+ typename fusion::result_of::transform<
+ Expr
+ , as_element<typename Expr::proto_tag>
+ >::type
+ >::type
+ segments_type;
+
+ explicit flat_view(Expr &e)
+ : segs_(fusion::as_list(fusion::transform(e, as_element<typename Expr::proto_tag>())))
+ {}
+
+ segments_type segs_;
+ };
}
namespace result_of
@@ -250,8 +270,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct is_sequence_impl;
- template<>
- struct is_sequence_impl<proto::tag::proto_flat_view>
+ template<typename Tag, typename Domain>
+ struct is_sequence_impl<proto::tag::proto_flat_view<Tag, Domain> >
{
template<typename Sequence>
struct apply
@@ -259,8 +279,8 @@ namespace boost { namespace fusion
{};
};
- template<>
- struct is_sequence_impl<proto::tag::proto_expr>
+ template<typename Tag, typename Domain>
+ struct is_sequence_impl<proto::tag::proto_expr<Tag, Domain> >
{
template<typename Sequence>
struct apply
@@ -271,8 +291,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct is_view_impl;
- template<>
- struct is_view_impl<proto::tag::proto_flat_view>
+ template<typename Tag, typename Domain>
+ struct is_view_impl<proto::tag::proto_flat_view<Tag, Domain> >
{
template<typename Sequence>
struct apply
@@ -280,8 +300,8 @@ namespace boost { namespace fusion
{};
};
- template<>
- struct is_view_impl<proto::tag::proto_expr>
+ template<typename Tag, typename Domain>
+ struct is_view_impl<proto::tag::proto_expr<Tag, Domain> >
{
template<typename Sequence>
struct apply
@@ -292,8 +312,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct value_of_impl;
- template<>
- struct value_of_impl<proto::tag::proto_expr_iterator>
+ template<typename Tag, typename Domain>
+ struct value_of_impl<proto::tag::proto_expr_iterator<Tag, Domain> >
{
template<
typename Iterator
@@ -323,8 +343,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct deref_impl;
- template<>
- struct deref_impl<proto::tag::proto_expr_iterator>
+ template<typename Tag, typename Domain>
+ struct deref_impl<proto::tag::proto_expr_iterator<Tag, Domain> >
{
template<
typename Iterator
@@ -364,8 +384,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct advance_impl;
- template<>
- struct advance_impl<proto::tag::proto_expr_iterator>
+ template<typename Tag, typename Domain>
+ struct advance_impl<proto::tag::proto_expr_iterator<Tag, Domain> >
{
template<typename Iterator, typename N>
struct apply
@@ -387,8 +407,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct distance_impl;
- template<>
- struct distance_impl<proto::tag::proto_expr_iterator>
+ template<typename Tag, typename Domain>
+ struct distance_impl<proto::tag::proto_expr_iterator<Tag, Domain> >
{
template<typename IteratorFrom, typename IteratorTo>
struct apply
@@ -399,32 +419,32 @@ namespace boost { namespace fusion
template<typename Tag>
struct next_impl;
- template<>
- struct next_impl<proto::tag::proto_expr_iterator>
+ template<typename Tag, typename Domain>
+ struct next_impl<proto::tag::proto_expr_iterator<Tag, Domain> >
{
template<typename Iterator>
struct apply
- : advance_impl<proto::tag::proto_expr_iterator>::template apply<Iterator, mpl::long_<1> >
+ : advance_impl<proto::tag::proto_expr_iterator<Tag, Domain> >::template apply<Iterator, mpl::long_<1> >
{};
};
template<typename Tag>
struct prior_impl;
- template<>
- struct prior_impl<proto::tag::proto_expr_iterator>
+ template<typename Tag, typename Domain>
+ struct prior_impl<proto::tag::proto_expr_iterator<Tag, Domain> >
{
template<typename Iterator>
struct apply
- : advance_impl<proto::tag::proto_expr_iterator>::template apply<Iterator, mpl::long_<-1> >
+ : advance_impl<proto::tag::proto_expr_iterator<Tag, Domain> >::template apply<Iterator, mpl::long_<-1> >
{};
};
template<typename Tag>
struct category_of_impl;
- template<>
- struct category_of_impl<proto::tag::proto_expr>
+ template<typename Tag, typename Domain>
+ struct category_of_impl<proto::tag::proto_expr<Tag, Domain> >
{
template<typename Sequence>
struct apply
@@ -436,8 +456,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct size_impl;
- template<>
- struct size_impl<proto::tag::proto_expr>
+ template<typename Tag, typename Domain>
+ struct size_impl<proto::tag::proto_expr<Tag, Domain> >
{
template<typename Sequence>
struct apply
@@ -448,8 +468,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct begin_impl;
- template<>
- struct begin_impl<proto::tag::proto_expr>
+ template<typename Tag, typename Domain>
+ struct begin_impl<proto::tag::proto_expr<Tag, Domain> >
{
template<typename Sequence>
struct apply
@@ -466,8 +486,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct end_impl;
- template<>
- struct end_impl<proto::tag::proto_expr>
+ template<typename Tag, typename Domain>
+ struct end_impl<proto::tag::proto_expr<Tag, Domain> >
{
template<typename Sequence>
struct apply
@@ -489,8 +509,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct value_at_impl;
- template<>
- struct value_at_impl<proto::tag::proto_expr>
+ template<typename Tag, typename Domain>
+ struct value_at_impl<proto::tag::proto_expr<Tag, Domain> >
{
template<
typename Sequence
@@ -521,8 +541,8 @@ namespace boost { namespace fusion
template<typename Tag>
struct at_impl;
- template<>
- struct at_impl<proto::tag::proto_expr>
+ template<typename Tag, typename Domain>
+ struct at_impl<proto::tag::proto_expr<Tag, Domain> >
{
template<
typename Sequence
@@ -561,10 +581,55 @@ namespace boost { namespace fusion
};
template<typename Tag>
+ struct convert_impl;
+
+ template<typename Tag, typename Domain>
+ struct convert_impl<proto::tag::proto_expr<Tag, Domain> >
+ {
+ template<typename Sequence>
+ struct apply
+ {
+ typedef
+ typename proto::result_of::unpack_expr<
+ Tag
+ , Domain
+ , Sequence
+ >::type
+ type;
+
+ static type call(Sequence& seq)
+ {
+ return proto::unpack_expr<Tag, Domain>(seq);
+ }
+ };
+ };
+
+ template<typename Tag, typename Domain>
+ struct convert_impl<proto::tag::proto_flat_view<Tag, Domain> >
+ {
+ template<typename Sequence>
+ struct apply
+ {
+ typedef
+ typename proto::result_of::unpack_expr<
+ Tag
+ , Domain
+ , Sequence
+ >::type
+ type;
+
+ static type call(Sequence& seq)
+ {
+ return proto::unpack_expr<Tag, Domain>(seq);
+ }
+ };
+ };
+
+ template<typename Tag>
struct is_segmented_impl;
- template<>
- struct is_segmented_impl<proto::tag::proto_flat_view>
+ template<typename Tag, typename Domain>
+ struct is_segmented_impl<proto::tag::proto_flat_view<Tag, Domain> >
{
template<typename Iterator>
struct apply
@@ -575,30 +640,23 @@ namespace boost { namespace fusion
template<typename Tag>
struct segments_impl;
- template<>
- struct segments_impl<proto::tag::proto_flat_view>
+ template<typename Tag, typename Domain>
+ struct segments_impl<proto::tag::proto_flat_view<Tag, Domain> >
{
template<typename Sequence>
struct apply
{
- typedef typename Sequence::expr_type::proto_tag proto_tag;
-
- typedef
- fusion::transform_view<
- typename Sequence::expr_type
- , proto::detail::as_element<proto_tag>
- >
- type;
-
+ typedef typename Sequence::segments_type const &type;
+
static type call(Sequence &sequence)
{
- return type(sequence.expr_, proto::detail::as_element<proto_tag>());
+ return sequence.segs_;
}
};
};
- template<>
- struct category_of_impl<proto::tag::proto_flat_view>
+ template<typename Tag, typename Domain>
+ struct category_of_impl<proto::tag::proto_flat_view<Tag, Domain> >
{
template<typename Sequence>
struct apply
@@ -606,7 +664,6 @@ namespace boost { namespace fusion
typedef forward_traversal_tag type;
};
};
-
}
namespace traits