Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/fusion/view/zip_view/zip_view.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/fusion/view/zip_view/zip_view.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,131 @@ +/*============================================================================= + Copyright (c) 2001-2011 Joel de Guzman + Copyright (c) 2006 Dan Marsden + + 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(FUSION_ZIP_VIEW_23012006_0813) +#define FUSION_ZIP_VIEW_23012006_0813 + +#include <boost/fusion/support/sequence_base.hpp> +#include <boost/fusion/support/unused.hpp> +#include <boost/fusion/iterator/equal_to.hpp> +#include <boost/fusion/view/detail/strictest_traversal.hpp> +#include <boost/fusion/view/zip_view/detail/begin_impl.hpp> +#include <boost/fusion/view/zip_view/detail/end_impl.hpp> +#include <boost/fusion/view/zip_view/detail/size_impl.hpp> +#include <boost/fusion/view/zip_view/detail/at_impl.hpp> +#include <boost/fusion/view/zip_view/detail/value_at_impl.hpp> +#include <boost/fusion/container/vector/convert.hpp> +#include <boost/fusion/algorithm/query/find_if.hpp> +#include <boost/fusion/sequence/intrinsic/end.hpp> +#include <boost/fusion/sequence/intrinsic/size.hpp> +#include <boost/fusion/mpl.hpp> +#include <boost/fusion/algorithm/transformation/remove.hpp> + +#include <boost/mpl/assert.hpp> +#include <boost/mpl/not.hpp> +#include <boost/mpl/placeholders.hpp> +#include <boost/mpl/transform_view.hpp> +#include <boost/mpl/at.hpp> +#include <boost/mpl/find_if.hpp> +#include <boost/mpl/equal_to.hpp> +#include <boost/mpl/bool.hpp> +#include <boost/mpl/eval_if.hpp> + +#include <boost/type_traits/remove_reference.hpp> +#include <boost/type_traits/is_reference.hpp> + +#include <boost/config.hpp> + +namespace boost { namespace fusion { + + namespace detail + { + template<typename Sequences> + struct all_references + : fusion::result_of::equal_to<typename fusion::result_of::find_if<Sequences, mpl::not_<is_reference<mpl::_> > >::type, typename fusion::result_of::end<Sequences>::type> + {}; + + struct seq_ref_size + { + template<typename Params> + struct result; + + template<typename Seq> + struct result<seq_ref_size(Seq)> + { + static int const high_int = static_cast<int>( + (static_cast<unsigned>(~0) >> 1) - 1); + + typedef typename remove_reference<Seq>::type SeqClass; + + typedef typename mpl::eval_if< + traits::is_forward<SeqClass>, + result_of::size<SeqClass>, + mpl::int_<high_int> >::type type; + }; + + // never called, but needed for decltype-based result_of (C++0x) +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + template<typename Seq> + typename result<seq_ref_size(Seq)>::type + operator()(Seq&&) const; +#endif + }; + + struct poly_min + { + template<typename T> + struct result; + + template<typename Lhs, typename Rhs> + struct result<poly_min(Lhs, Rhs)> + { + typedef typename remove_reference<Lhs>::type lhs; + typedef typename remove_reference<Rhs>::type rhs; + typedef typename mpl::min<lhs, rhs>::type type; + }; + + // never called, but needed for decltype-based result_of (C++0x) +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + template<typename Lhs, typename Rhs> + typename result<poly_min(Lhs, Rhs)>::type + operator()(Lhs&&, Rhs&&) const; +#endif + }; + + template<typename Sequences> + struct min_size + { + typedef typename result_of::transform<Sequences, detail::seq_ref_size>::type sizes; + typedef typename result_of::fold<sizes, typename result_of::front<sizes>::type, detail::poly_min>::type type; + }; + } + + struct zip_view_tag; + struct fusion_sequence_tag; + + template<typename Sequences> + struct zip_view : sequence_base< zip_view<Sequences> > + { + typedef typename result_of::remove<Sequences, unused_type const&>::type real_sequences; + BOOST_MPL_ASSERT((detail::all_references<Sequences>)); + typedef typename detail::strictest_traversal<real_sequences>::type category; + typedef zip_view_tag fusion_tag; + typedef fusion_sequence_tag tag; // this gets picked up by MPL + typedef mpl::true_ is_view; + typedef typename fusion::result_of::as_vector<Sequences>::type sequences; + typedef typename detail::min_size<real_sequences>::type size; + + zip_view( + const Sequences& seqs) + : sequences_(seqs) + {}; + + sequences sequences_; + }; +}} + +#endif