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@101
|
11 #include <boost/fusion/support/config.hpp>
|
Chris@16
|
12 #include <boost/mpl/size.hpp>
|
Chris@16
|
13 #include <boost/mpl/if.hpp>
|
Chris@16
|
14 #include <boost/mpl/vector_c.hpp>
|
Chris@16
|
15 #include <boost/utility/result_of.hpp>
|
Chris@16
|
16
|
Chris@16
|
17 #include <boost/type_traits/remove_reference.hpp>
|
Chris@16
|
18 #include <boost/type_traits/add_reference.hpp>
|
Chris@16
|
19 #include <boost/type_traits/add_const.hpp>
|
Chris@16
|
20
|
Chris@16
|
21 #include <boost/fusion/support/is_view.hpp>
|
Chris@16
|
22 #include <boost/fusion/support/category_of.hpp>
|
Chris@16
|
23 #include <boost/fusion/support/sequence_base.hpp>
|
Chris@16
|
24 #include <boost/fusion/container/vector.hpp>
|
Chris@16
|
25 #include <boost/fusion/view/transform_view.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 #include <boost/config.hpp>
|
Chris@16
|
28
|
Chris@16
|
29 namespace boost { namespace fusion
|
Chris@16
|
30 {
|
Chris@16
|
31 namespace detail
|
Chris@16
|
32 {
|
Chris@16
|
33 struct addref
|
Chris@16
|
34 {
|
Chris@16
|
35 template<typename Sig>
|
Chris@16
|
36 struct result;
|
Chris@16
|
37
|
Chris@16
|
38 template<typename U>
|
Chris@16
|
39 struct result<addref(U)> : add_reference<U> {};
|
Chris@16
|
40
|
Chris@16
|
41 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
|
Chris@16
|
42 template <typename T>
|
Chris@101
|
43 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
44 typename add_reference<T>::type
|
Chris@16
|
45 operator()(T& x) const
|
Chris@16
|
46 {
|
Chris@16
|
47 return x;
|
Chris@16
|
48 }
|
Chris@16
|
49 #else
|
Chris@16
|
50 template <typename T>
|
Chris@101
|
51 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
52 typename result<addref(T)>::type
|
Chris@16
|
53 operator()(T&& x) const
|
Chris@16
|
54 {
|
Chris@16
|
55 return x;
|
Chris@16
|
56 }
|
Chris@16
|
57 #endif
|
Chris@16
|
58 };
|
Chris@16
|
59
|
Chris@16
|
60 struct addconstref
|
Chris@16
|
61 {
|
Chris@16
|
62 template<typename Sig>
|
Chris@16
|
63 struct result;
|
Chris@16
|
64
|
Chris@16
|
65 template<typename U>
|
Chris@16
|
66 struct result<addconstref(U)>
|
Chris@16
|
67 : add_reference<typename add_const<U>::type>
|
Chris@16
|
68 {};
|
Chris@16
|
69
|
Chris@16
|
70 template <typename T>
|
Chris@101
|
71 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
72 typename add_reference<typename add_const<T>::type>::type
|
Chris@16
|
73 operator()(T& x) const
|
Chris@16
|
74 {
|
Chris@16
|
75 return x;
|
Chris@16
|
76 }
|
Chris@16
|
77
|
Chris@16
|
78 template <typename T>
|
Chris@101
|
79 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
80 typename add_reference<typename add_const<T>::type>::type
|
Chris@16
|
81 operator()(T const& x) const
|
Chris@16
|
82 {
|
Chris@16
|
83 return x;
|
Chris@16
|
84 }
|
Chris@16
|
85 };
|
Chris@16
|
86 }
|
Chris@16
|
87
|
Chris@16
|
88 struct nview_tag;
|
Chris@16
|
89 struct random_access_traversal_tag;
|
Chris@16
|
90 struct fusion_sequence_tag;
|
Chris@16
|
91
|
Chris@16
|
92 template<typename Sequence, typename Indicies>
|
Chris@16
|
93 struct nview
|
Chris@16
|
94 : sequence_base<nview<Sequence, Indicies> >
|
Chris@16
|
95 {
|
Chris@16
|
96 typedef nview_tag fusion_tag;
|
Chris@16
|
97 typedef fusion_sequence_tag tag; // this gets picked up by MPL
|
Chris@16
|
98 typedef random_access_traversal_tag category;
|
Chris@16
|
99
|
Chris@16
|
100 typedef mpl::true_ is_view;
|
Chris@16
|
101 typedef Indicies index_type;
|
Chris@16
|
102 typedef typename mpl::size<Indicies>::type size;
|
Chris@16
|
103
|
Chris@16
|
104 typedef typename mpl::if_<
|
Chris@16
|
105 is_const<Sequence>, detail::addconstref, detail::addref
|
Chris@16
|
106 >::type transform_type;
|
Chris@16
|
107 typedef transform_view<Sequence, transform_type> transform_view_type;
|
Chris@16
|
108 typedef typename result_of::as_vector<transform_view_type>::type
|
Chris@16
|
109 sequence_type;
|
Chris@16
|
110
|
Chris@101
|
111 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
|
Chris@16
|
112 explicit nview(Sequence& val)
|
Chris@16
|
113 : seq(sequence_type(transform_view_type(val, transform_type())))
|
Chris@16
|
114 {}
|
Chris@16
|
115
|
Chris@16
|
116 sequence_type seq;
|
Chris@16
|
117 };
|
Chris@16
|
118
|
Chris@16
|
119 }}
|
Chris@16
|
120
|
Chris@16
|
121 // define the nview() generator functions
|
Chris@16
|
122 #include <boost/fusion/view/nview/detail/nview_impl.hpp>
|
Chris@16
|
123
|
Chris@16
|
124 #endif
|
Chris@16
|
125
|
Chris@16
|
126
|