diff options
Diffstat (limited to 'boost/proto/fusion.hpp')
-rw-r--r-- | boost/proto/fusion.hpp | 191 |
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 |