annotate DEPENDENCIES/generic/include/boost/fusion/view/nview/nview.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 /*=============================================================================
Chris@16 2 Copyright (c) 2009 Hartmut Kaiser
Chris@16 3
Chris@16 4 Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6 ==============================================================================*/
Chris@16 7
Chris@16 8 #if !defined(BOOST_FUSION_NVIEW_SEP_23_2009_0948PM)
Chris@16 9 #define BOOST_FUSION_NVIEW_SEP_23_2009_0948PM
Chris@16 10
Chris@16 11 #include <boost/mpl/size.hpp>
Chris@16 12 #include <boost/mpl/if.hpp>
Chris@16 13 #include <boost/mpl/vector_c.hpp>
Chris@16 14 #include <boost/utility/result_of.hpp>
Chris@16 15
Chris@16 16 #include <boost/type_traits/remove_reference.hpp>
Chris@16 17 #include <boost/type_traits/add_reference.hpp>
Chris@16 18 #include <boost/type_traits/add_const.hpp>
Chris@16 19
Chris@16 20 #include <boost/fusion/support/is_view.hpp>
Chris@16 21 #include <boost/fusion/support/category_of.hpp>
Chris@16 22 #include <boost/fusion/support/sequence_base.hpp>
Chris@16 23 #include <boost/fusion/container/vector.hpp>
Chris@16 24 #include <boost/fusion/view/transform_view.hpp>
Chris@16 25
Chris@16 26 #include <boost/config.hpp>
Chris@16 27
Chris@16 28 namespace boost { namespace fusion
Chris@16 29 {
Chris@16 30 namespace detail
Chris@16 31 {
Chris@16 32 struct addref
Chris@16 33 {
Chris@16 34 template<typename Sig>
Chris@16 35 struct result;
Chris@16 36
Chris@16 37 template<typename U>
Chris@16 38 struct result<addref(U)> : add_reference<U> {};
Chris@16 39
Chris@16 40 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
Chris@16 41 template <typename T>
Chris@16 42 typename add_reference<T>::type
Chris@16 43 operator()(T& x) const
Chris@16 44 {
Chris@16 45 return x;
Chris@16 46 }
Chris@16 47 #else
Chris@16 48 template <typename T>
Chris@16 49 typename result<addref(T)>::type
Chris@16 50 operator()(T&& x) const
Chris@16 51 {
Chris@16 52 return x;
Chris@16 53 }
Chris@16 54 #endif
Chris@16 55 };
Chris@16 56
Chris@16 57 struct addconstref
Chris@16 58 {
Chris@16 59 template<typename Sig>
Chris@16 60 struct result;
Chris@16 61
Chris@16 62 template<typename U>
Chris@16 63 struct result<addconstref(U)>
Chris@16 64 : add_reference<typename add_const<U>::type>
Chris@16 65 {};
Chris@16 66
Chris@16 67 template <typename T>
Chris@16 68 typename add_reference<typename add_const<T>::type>::type
Chris@16 69 operator()(T& x) const
Chris@16 70 {
Chris@16 71 return x;
Chris@16 72 }
Chris@16 73
Chris@16 74 template <typename T>
Chris@16 75 typename add_reference<typename add_const<T>::type>::type
Chris@16 76 operator()(T const& x) const
Chris@16 77 {
Chris@16 78 return x;
Chris@16 79 }
Chris@16 80 };
Chris@16 81 }
Chris@16 82
Chris@16 83 struct nview_tag;
Chris@16 84 struct random_access_traversal_tag;
Chris@16 85 struct fusion_sequence_tag;
Chris@16 86
Chris@16 87 template<typename Sequence, typename Indicies>
Chris@16 88 struct nview
Chris@16 89 : sequence_base<nview<Sequence, Indicies> >
Chris@16 90 {
Chris@16 91 typedef nview_tag fusion_tag;
Chris@16 92 typedef fusion_sequence_tag tag; // this gets picked up by MPL
Chris@16 93 typedef random_access_traversal_tag category;
Chris@16 94
Chris@16 95 typedef mpl::true_ is_view;
Chris@16 96 typedef Indicies index_type;
Chris@16 97 typedef typename mpl::size<Indicies>::type size;
Chris@16 98
Chris@16 99 typedef typename mpl::if_<
Chris@16 100 is_const<Sequence>, detail::addconstref, detail::addref
Chris@16 101 >::type transform_type;
Chris@16 102 typedef transform_view<Sequence, transform_type> transform_view_type;
Chris@16 103 typedef typename result_of::as_vector<transform_view_type>::type
Chris@16 104 sequence_type;
Chris@16 105
Chris@16 106 explicit nview(Sequence& val)
Chris@16 107 : seq(sequence_type(transform_view_type(val, transform_type())))
Chris@16 108 {}
Chris@16 109
Chris@16 110 sequence_type seq;
Chris@16 111 };
Chris@16 112
Chris@16 113 }}
Chris@16 114
Chris@16 115 // define the nview() generator functions
Chris@16 116 #include <boost/fusion/view/nview/detail/nview_impl.hpp>
Chris@16 117
Chris@16 118 #endif
Chris@16 119
Chris@16 120