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
|