diff options
Diffstat (limited to 'boost/fusion/view/repetitive_view')
8 files changed, 392 insertions, 0 deletions
diff --git a/boost/fusion/view/repetitive_view/detail/begin_impl.hpp b/boost/fusion/view/repetitive_view/detail/begin_impl.hpp new file mode 100644 index 0000000000..321d7b8d8d --- /dev/null +++ b/boost/fusion/view/repetitive_view/detail/begin_impl.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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) +==============================================================================*/ + +#if !defined(BOOST_FUSION_REPETITIVE_VIEW_BEGIN_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_BEGIN_IMPL_HPP_INCLUDED + +#include <boost/fusion/sequence/intrinsic/begin.hpp> +#include <boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp> + +namespace boost { namespace fusion +{ + struct repetitive_view_tag; + + template <typename Sequence, typename Pos> + struct repetitive_view_iterator; + + namespace extension + { + template<typename Tag> + struct begin_impl; + + template<> + struct begin_impl<repetitive_view_tag> + { + template<typename View> + struct apply + { + typedef typename View::sequence_type sequence_type; + + typedef repetitive_view_iterator<sequence_type, + typename result_of::begin<sequence_type>::type > type; + + static type call(View const& v) + { + return type(v.seq); + } + }; + }; + + } + +}} + +#endif + diff --git a/boost/fusion/view/repetitive_view/detail/deref_impl.hpp b/boost/fusion/view/repetitive_view/detail/deref_impl.hpp new file mode 100644 index 0000000000..2c0caf8022 --- /dev/null +++ b/boost/fusion/view/repetitive_view/detail/deref_impl.hpp @@ -0,0 +1,44 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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) +==============================================================================*/ + +#if !defined(BOOST_FUSION_REPETITIVE_VIEW_DEREF_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_DEREF_IMPL_HPP_INCLUDED + +#include <boost/fusion/iterator/deref.hpp> + +namespace boost { namespace fusion +{ + struct repetitive_view_iterator_tag; + + namespace extension + { + template<typename Tag> + struct deref_impl; + + template<> + struct deref_impl<repetitive_view_iterator_tag> + { + template<typename Iterator> + struct apply + { + typedef typename + result_of::deref<typename Iterator::pos_type>::type + type; + + static type call(Iterator const& i) + { + return *i.pos; + } + }; + }; + + } + +}} + +#endif + diff --git a/boost/fusion/view/repetitive_view/detail/end_impl.hpp b/boost/fusion/view/repetitive_view/detail/end_impl.hpp new file mode 100644 index 0000000000..52e36da50d --- /dev/null +++ b/boost/fusion/view/repetitive_view/detail/end_impl.hpp @@ -0,0 +1,49 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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) +==============================================================================*/ + +#if !defined(BOOST_FUSION_REPETITIVE_VIEW_END_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_END_IMPL_HPP_INCLUDED + +#include <boost/fusion/sequence/intrinsic/end.hpp> +#include <boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp> + +namespace boost { namespace fusion +{ + struct repetitive_view_tag; + + template <typename Sequence, typename Pos> + struct repetitive_view_iterator; + + namespace extension + { + template<typename Tag> + struct end_impl; + + template<> + struct end_impl<repetitive_view_tag> + { + template<typename View> + struct apply + { + typedef typename View::sequence_type sequence_type; + + typedef repetitive_view_iterator<sequence_type, + typename result_of::end<sequence_type>::type > type; + + static type call(View const& v) + { + return type(v.seq,end(v.seq)); + } + }; + }; + + } + +}} + +#endif + diff --git a/boost/fusion/view/repetitive_view/detail/next_impl.hpp b/boost/fusion/view/repetitive_view/detail/next_impl.hpp new file mode 100644 index 0000000000..b629cb0122 --- /dev/null +++ b/boost/fusion/view/repetitive_view/detail/next_impl.hpp @@ -0,0 +1,90 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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) +==============================================================================*/ + +#if !defined(BOOST_FUSION_REPETITIVE_VIEW_NEXT_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_NEXT_IMPL_HPP_INCLUDED + +#include <boost/fusion/iterator/next.hpp> +#include <boost/fusion/iterator/equal_to.hpp> + +namespace boost { namespace fusion +{ + struct repetitive_view_iterator_tag; + + template <typename Sequence, typename Pos> + struct repetitive_view_iterator; + + namespace extension + { + template <typename Tag> + struct next_impl; + + template <> + struct next_impl<repetitive_view_iterator_tag> + { + template<typename Iterator, + bool Last = result_of::equal_to<typename Iterator::end_type, + typename result_of::next< + typename Iterator::pos_type + >::type>::value > + struct apply_nonempty // <Iterator,false> + { + // advanvce to next position + + typedef repetitive_view_iterator< + typename Iterator::sequence_type, + typename result_of::next<typename Iterator::pos_type>::type + > + type; + + static type call(Iterator const& i) + { + return type(i.seq, next(i.pos)); + } + }; + template <typename Iterator> + struct apply_nonempty<Iterator,true> + { + // reset to beginning + + typedef repetitive_view_iterator< + typename Iterator::sequence_type, + typename Iterator::first_type + > + type; + + static type call(Iterator const& i) + { + return type(i.seq); + } + }; + + template <typename Iterator, + bool Empty = result_of::equal_to<typename Iterator::end_type, + typename Iterator::pos_type>::value > + struct apply // <Iterator,false> + : apply_nonempty<Iterator> + { }; + + template <typename Iterator> + struct apply<Iterator,true> + { + // eps^n = eps + + typedef Iterator type; + + static type call(Iterator const& i) + { + return type(i); + } + }; + }; + } +}} + +#endif + diff --git a/boost/fusion/view/repetitive_view/detail/value_of_impl.hpp b/boost/fusion/view/repetitive_view/detail/value_of_impl.hpp new file mode 100644 index 0000000000..bf5f2f0615 --- /dev/null +++ b/boost/fusion/view/repetitive_view/detail/value_of_impl.hpp @@ -0,0 +1,34 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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) +==============================================================================*/ + +#if !defined(BOOST_FUSION_REPETITIVE_VIEW_VALUE_OF_IMPL_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_VALUE_OF_IMPL_HPP_INCLUDED + +#include <boost/fusion/iterator/value_of.hpp> + +namespace boost { namespace fusion +{ + struct repetitive_view_iterator_tag; + + namespace extension + { + template<typename Tag> + struct value_of_impl; + + template<> + struct value_of_impl<repetitive_view_iterator_tag> + { + template<typename Iterator> + struct apply + : result_of::value_of<typename Iterator::pos_type> + { }; + }; + } +}} + +#endif + diff --git a/boost/fusion/view/repetitive_view/repetitive_view.hpp b/boost/fusion/view/repetitive_view/repetitive_view.hpp new file mode 100644 index 0000000000..509db859c1 --- /dev/null +++ b/boost/fusion/view/repetitive_view/repetitive_view.hpp @@ -0,0 +1,52 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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) +==============================================================================*/ + +#if !defined(BOOST_FUSION_REPETITIVE_REPETITIVE_VIEW_VIEW_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_REPETITIVE_VIEW_HPP_INCLUDED + +#include <boost/type_traits/remove_reference.hpp> +#include <boost/mpl/if.hpp> + +#include <boost/fusion/support/is_view.hpp> +#include <boost/fusion/support/category_of.hpp> + +#include <boost/fusion/view/repetitive_view/detail/begin_impl.hpp> +#include <boost/fusion/view/repetitive_view/detail/end_impl.hpp> + + +namespace boost { namespace fusion +{ + struct repetitive_view_tag; + struct fusion_sequence_tag; + + template<typename Sequence> struct repetitive_view + : sequence_base< repetitive_view<Sequence> > + { + typedef repetitive_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + + typedef single_pass_traversal_tag category; + + typedef typename boost::remove_reference<Sequence>::type sequence_type; + typedef typename + mpl::if_<traits::is_view<Sequence>, Sequence, sequence_type&>::type + stored_seq_type; + + repetitive_view(Sequence& in_seq) + : seq(in_seq) {} + + stored_seq_type seq; + + private: + // silence MSVC warning C4512: assignment operator could not be generated + repetitive_view& operator= (repetitive_view const&); + }; + +}} + +#endif diff --git a/boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp b/boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp new file mode 100644 index 0000000000..24e146c00d --- /dev/null +++ b/boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp @@ -0,0 +1,19 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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) +==============================================================================*/ + +#if !defined(BOOST_FUSION_REPETITIVE_VIEW_FWD_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_FWD_HPP_INCLUDED + +namespace boost { namespace fusion +{ + struct repetitive_view_tag; + + template<typename Sequence> struct repetitive_view; +}} + +#endif + diff --git a/boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp b/boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp new file mode 100644 index 0000000000..4dff006e01 --- /dev/null +++ b/boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp @@ -0,0 +1,55 @@ +/*============================================================================= + Copyright (c) 2007 Tobias Schwinger + + 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) +==============================================================================*/ + +#if !defined(BOOST_FUSION_REPETITIVE_VIEW_ITERATOR_HPP_INCLUDED) +#define BOOST_FUSION_REPETITIVE_VIEW_HPP_ITERATOR_INCLUDED + +#include <boost/fusion/support/iterator_base.hpp> +#include <boost/fusion/support/category_of.hpp> +#include <boost/fusion/iterator/mpl/convert_iterator.hpp> +#include <boost/fusion/adapted/mpl/mpl_iterator.hpp> +#include <boost/fusion/sequence/intrinsic/begin.hpp> +#include <boost/fusion/sequence/intrinsic/end.hpp> +#include <boost/fusion/view/repetitive_view/detail/deref_impl.hpp> +#include <boost/fusion/view/repetitive_view/detail/next_impl.hpp> +#include <boost/fusion/view/repetitive_view/detail/value_of_impl.hpp> + +namespace boost { namespace fusion +{ + struct repetitive_view_iterator_tag; + + template<typename Sequence, typename Pos = + typename result_of::begin<Sequence>::type> + struct repetitive_view_iterator + : iterator_base< repetitive_view_iterator<Sequence,Pos> > + { + typedef repetitive_view_iterator_tag fusion_tag; + + typedef Sequence sequence_type; + typedef typename convert_iterator<Pos>::type pos_type; + typedef typename convert_iterator<typename result_of::begin<Sequence>::type>::type first_type; + typedef typename convert_iterator<typename result_of::end<Sequence>::type>::type end_type; + typedef single_pass_traversal_tag category; + + explicit repetitive_view_iterator(Sequence& in_seq) + : seq(in_seq), pos(begin(in_seq)) {} + + repetitive_view_iterator(Sequence& in_seq, pos_type const& in_pos) + : seq(in_seq), pos(in_pos) {} + + Sequence& seq; + pos_type pos; + + + private: + // silence MSVC warning C4512: assignment operator could not be generated + repetitive_view_iterator& operator= (repetitive_view_iterator const&); + }; +}} + +#endif + |