From c7b3a391fa43967d4632e0fcb2e842cd930cb7cd Mon Sep 17 00:00:00 2001 From: Aleksey Gurtovoy Date: Tue, 26 Nov 2002 10:02:08 +0000 Subject: [PATCH] add 'zip_view' [SVN r16419] --- include/boost/mpl/zip_view.hpp | 66 ++++++++++++++++++++++++++++++++++ test/zip_view.cpp | 60 +++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 include/boost/mpl/zip_view.hpp create mode 100644 test/zip_view.cpp diff --git a/include/boost/mpl/zip_view.hpp b/include/boost/mpl/zip_view.hpp new file mode 100644 index 0000000..95f956b --- /dev/null +++ b/include/boost/mpl/zip_view.hpp @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// boost mpl/zip_view.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2000-02 +// David Abrahams, Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#ifndef BOOST_MPL_ZIP_VIEW_HPP_INCLUDED +#define BOOST_MPL_ZIP_VIEW_HPP_INCLUDED + +#include "boost/mpl/transform.hpp" +#include "boost/mpl/begin_end.hpp" +#include "boost/mpl/iterator_tag.hpp" +#include "boost/mpl/next.hpp" +#include "boost/mpl/lambda.hpp" +#include "boost/mpl/apply.hpp" +#include "boost/mpl/aux_/void_spec.hpp" + +namespace boost { namespace mpl { + +template< typename IteratorSeq > +struct zip_iterator +{ + typedef input_iter_tag_ category; + typedef typename transform< + IteratorSeq + , apply0<_1> + >::type type; + + typedef zip_iterator< + typename transform< + IteratorSeq + , next<_1> + >::type + > next; +}; + +template< + typename BOOST_MPL_AUX_VOID_SPEC_PARAM(Sequences) + > +struct zip_view +{ + private: + typedef typename transform< Sequences, begin<_1> >::type first_ones_; + typedef typename transform< Sequences, end<_1> >::type last_ones_; + + public: + typedef nested_begin_end_tag tag; + typedef zip_iterator begin; + typedef zip_iterator end; +}; + +BOOST_MPL_AUX_VOID_SPEC(1, zip_view) + +}} // namespace boost::mpl + +#endif // BOOST_MPL_ZIP_VIEW_HPP_INCLUDED diff --git a/test/zip_view.cpp b/test/zip_view.cpp new file mode 100644 index 0000000..192505a --- /dev/null +++ b/test/zip_view.cpp @@ -0,0 +1,60 @@ +//----------------------------------------------------------------------------- +// boost mpl/test/zip_view.cpp source file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2002 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#include "boost/mpl/zip_view.hpp" +#include "boost/mpl/transform_view.hpp" +#include "boost/mpl/filter_view.hpp" +#include "boost/mpl/range_c.hpp" +#include "boost/mpl/list.hpp" +#include "boost/mpl/at.hpp" +#include "boost/mpl/equal.hpp" +#include "boost/mpl/comparison/equal_to.hpp" +#include "boost/mpl/math/is_even.hpp" +#include "boost/static_assert.hpp" + +using namespace boost::mpl; + +template< typename BinaryOp > +struct apply_two_args_seq +{ + template< typename Args > struct apply + { + typedef typename apply2< + BinaryOp + , typename at_c::type + , typename at_c::type + >::type type; + }; +}; + +int main() +{ + typedef range_c s1; + typedef range_c s2; + + typedef transform_view< + zip_view< list > + , apply_two_args_seq< plus<> > + > result; + + BOOST_STATIC_ASSERT((equal< + result + , filter_view< range_c, math::is_even<_> > + , equal_to<_,_> + >::type::value)); + + return 0; +}