summaryrefslogtreecommitdiff
path: root/boost/fusion/view/repetitive_view
diff options
context:
space:
mode:
Diffstat (limited to 'boost/fusion/view/repetitive_view')
-rw-r--r--boost/fusion/view/repetitive_view/detail/begin_impl.hpp49
-rw-r--r--boost/fusion/view/repetitive_view/detail/deref_impl.hpp44
-rw-r--r--boost/fusion/view/repetitive_view/detail/end_impl.hpp49
-rw-r--r--boost/fusion/view/repetitive_view/detail/next_impl.hpp90
-rw-r--r--boost/fusion/view/repetitive_view/detail/value_of_impl.hpp34
-rw-r--r--boost/fusion/view/repetitive_view/repetitive_view.hpp52
-rw-r--r--boost/fusion/view/repetitive_view/repetitive_view_fwd.hpp19
-rw-r--r--boost/fusion/view/repetitive_view/repetitive_view_iterator.hpp55
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
+