1/*
2 * t_to_memory_c.hpp
3 *
4 * Created on: Aug 27, 2014
5 * Author: Pietro Incardona
6 */
7
8#ifndef T_TO_MEMORY_C_HPP_
9#define T_TO_MEMORY_C_HPP_
10
11#include <boost/mpl/int.hpp>
12#include <memory_ly/memory_c.hpp>
13
14/*! \brief t_to_memory_c is a metafunction that given T it convert it into
15 *
16 * t_to_memory_c<T>::type to memory_c<T> for scalar
17 *
18 * or
19 *
20 * t_to_memory_c<T[N1][N2]>::type to memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int<N1>,boost::mpl::int<N2>>>>
21 *
22 * for vector
23 *
24 *
25 * Here we specialize t_to_memory_c for several dimensionalities
26 *
27 * \param T type
28 * \param N1 .... N10 dimensions
29 *
30 */
31
32#include <boost/type_traits/remove_reference.hpp>
33#include <boost/type_traits/remove_const.hpp>
34
35// First thing the metafunction has to do, is to remove eventually reference and const attribute
36
37template<typename T>
38struct remove_attributes_const_ref
39{
40 //! remove all attributes const and reference from the type
41 typedef typename boost::remove_const <typename boost::remove_reference< T >::type >::type type;
42};
43
44//! Partial specialization for scalar N=0
45template<typename T>
46struct t_to_memory_c_impl
47{
48 //! transform a type T into memory_c<T>
49 typedef memory_c<T> type;
50};
51
52//! Partial specialization for scalar N=0
53template<typename T>
54struct t_to_memory_c_red_impl
55{
56 //! transform a type T into memory_c<T,MEMORY_C_REDUCED>
57 typedef memory_c<T,MEMORY_C_REDUCED> type;
58};
59
60
61//! Partial specialization for N=1
62template<typename T,size_t N1>
63struct t_to_memory_c_impl<T[N1]>
64{
65 //! transfrom a type T into memory_c<T>
66 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>>>> type;
67
68 //! the internal array primitive information represented into a boost mpl vector
69 typedef boost::mpl::vector<T,boost::mpl::int_<N1>> prim_vmpl;
70};
71
72//! Partial specialization for N=1
73template<typename T,size_t N1>
74struct t_to_memory_c_red_impl<T[N1]>
75{
76 //! transform a type T into memory_c<T,MEMORY_C_REDUCED>
77 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>>>,MEMORY_C_REDUCED> type;
78
79 //! the internal array primitive information represented into a boost mpl vector
80 typedef boost::mpl::vector<T,boost::mpl::int_<N1>> prim_vmpl;
81};
82
83//! Partial specialization for N=2
84template<typename T,size_t N1,size_t N2>
85struct t_to_memory_c_impl<T[N1][N2]>
86{
87 //! tranform a type T into a memory_c<multi_array<.......>>
88 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
89 boost::mpl::int_<N2>>>> type;
90
91
92 //! the internal array primitive information represented into a boost mpl vector
93 typedef boost::mpl::vector<T,boost::mpl::int_<N1>,
94 boost::mpl::int_<N2>> prim_vmpl;
95};
96
97//! Partial specialization for N=2
98template<typename T,size_t N1,size_t N2>
99struct t_to_memory_c_red_impl<T[N1][N2]>
100{
101 //! transform a type T into a memory_c<multi_array<.......>,MEMORY_C_REDUCED>
102 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
103 boost::mpl::int_<N2>>>,MEMORY_C_REDUCED> type;
104
105 //! the internal array primitive information represented into a boost mpl vector
106 typedef boost::mpl::vector<T,boost::mpl::int_<N1>,
107 boost::mpl::int_<N2>> prim_vmpl;
108};
109
110//! Partial specialization for N=3
111template<typename T,size_t N1,size_t N2,size_t N3>
112struct t_to_memory_c_impl<T[N1][N2][N3]>
113{
114 //! tranform a type T into a memory_c<multi_array<.......>>
115 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
116 boost::mpl::int_<N2>,
117 boost::mpl::int_<N3>>>> type;
118};
119
120//! Partial specialization for N=3
121template<typename T,size_t N1,size_t N2,size_t N3>
122struct t_to_memory_c_red_impl<T[N1][N2][N3]>
123{
124 //! tranform a type T into a memory_c<multi_array<.......>>
125 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
126 boost::mpl::int_<N2>,
127 boost::mpl::int_<N3>>>,MEMORY_C_REDUCED> type;
128};
129
130//! Partial specialization for N=4
131template<typename T,size_t N1,size_t N2,size_t N3,size_t N4>
132struct t_to_memory_c_impl<T[N1][N2][N3][N4]>
133{
134 //! tranform a type T into a memory_c<multi_array<.......>>
135 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
136 boost::mpl::int_<N2>,
137 boost::mpl::int_<N3>,
138 boost::mpl::int_<N4>>>> type;
139};
140
141//! Partial specialization for N=4
142template<typename T,size_t N1,size_t N2,size_t N3,size_t N4>
143struct t_to_memory_c_red_impl<T[N1][N2][N3][N4]>
144{
145 //! tranform a type T into a memory_c<multi_array<.......>,MEMORY_C_REDUCED>
146 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
147 boost::mpl::int_<N2>,
148 boost::mpl::int_<N3>,
149 boost::mpl::int_<N4>>>,MEMORY_C_REDUCED> type;
150};
151
152//! Partial specialization for N=5
153template<typename T,size_t N1,size_t N2,size_t N3,size_t N4,size_t N5>
154struct t_to_memory_c_impl<T[N1][N2][N3][N4][N5]>
155{
156 //! tranform a type T into a memory_c<multi_array<.......>>
157 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
158 boost::mpl::int_<N2>,
159 boost::mpl::int_<N3>,
160 boost::mpl::int_<N4>,
161 boost::mpl::int_<N5>>>> type;
162};
163
164//! Partial specialization for N=5
165template<typename T,size_t N1,size_t N2,size_t N3,size_t N4,size_t N5>
166struct t_to_memory_c_red_impl<T[N1][N2][N3][N4][N5]>
167{
168 //! tranform a type T into a memory_c<multi_array<.......>,MEMORY_C_REDUCED>
169 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
170 boost::mpl::int_<N2>,
171 boost::mpl::int_<N3>,
172 boost::mpl::int_<N4>,
173 boost::mpl::int_<N5>>>,MEMORY_C_REDUCED> type;
174};
175
176//! Partial specialization for N=6
177template<typename T,size_t N1,size_t N2,size_t N3,size_t N4,size_t N5, size_t N6>
178struct t_to_memory_c_impl<T[N1][N2][N3][N4][N5][N6]>
179{
180 //! tranform a type T into a memory_c<multi_array<.......>>
181 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
182 boost::mpl::int_<N2>,
183 boost::mpl::int_<N3>,
184 boost::mpl::int_<N4>,
185 boost::mpl::int_<N5>,
186 boost::mpl::int_<N6>>>> type;
187};
188
189//! Partial specialization for N=7
190template<typename T,size_t N1,size_t N2,size_t N3,size_t N4,size_t N5, size_t N6, size_t N7>
191struct t_to_memory_c_impl<T[N1][N2][N3][N4][N5][N6][N7]>
192{
193 //! tranform a type T into a memory_c<multi_array<.......>>
194 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
195 boost::mpl::int_<N2>,
196 boost::mpl::int_<N3>,
197 boost::mpl::int_<N4>,
198 boost::mpl::int_<N5>,
199 boost::mpl::int_<N6>,
200 boost::mpl::int_<N7>>>> type;
201};
202
203//! Partial specialization for N=8
204template<typename T,size_t N1,size_t N2,size_t N3,size_t N4,size_t N5, size_t N6, size_t N7, size_t N8>
205struct t_to_memory_c_impl<T[N1][N2][N3][N4][N5][N6][N7][N8]>
206{
207 //! tranform a type T into a memory_c<multi_array<.......>>
208 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
209 boost::mpl::int_<N2>,
210 boost::mpl::int_<N3>,
211 boost::mpl::int_<N4>,
212 boost::mpl::int_<N5>,
213 boost::mpl::int_<N6>,
214 boost::mpl::int_<N7>,
215 boost::mpl::int_<N8>>>> type;
216};
217
218//! Partial specialization for N=9
219template<typename T,size_t N1,size_t N2,size_t N3,size_t N4,size_t N5, size_t N6, size_t N7, size_t N8, size_t N9>
220struct t_to_memory_c_impl<T[N1][N2][N3][N4][N5][N6][N7][N8][N9]>
221{
222 //! tranform a type T into a memory_c<multi_array<.......>>
223 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
224 boost::mpl::int_<N2>,
225 boost::mpl::int_<N3>,
226 boost::mpl::int_<N4>,
227 boost::mpl::int_<N5>,
228 boost::mpl::int_<N6>,
229 boost::mpl::int_<N7>,
230 boost::mpl::int_<N8>,
231 boost::mpl::int_<N9>>>> type;
232};
233
234//! Partial specialization for N=10
235template<typename T,size_t N1,size_t N2,size_t N3,size_t N4,size_t N5, size_t N6, size_t N7, size_t N8, size_t N9, size_t N10>
236struct t_to_memory_c_impl<T[N1][N2][N3][N4][N5][N6][N7][N8][N9][N10]>
237{
238 //! tranform a type T into a memory_c<multi_array<.......>>
239 typedef memory_c<multi_array<boost::mpl::vector<T,boost::mpl::int_<N1>,
240 boost::mpl::int_<N2>,
241 boost::mpl::int_<N3>,
242 boost::mpl::int_<N4>,
243 boost::mpl::int_<N5>,
244 boost::mpl::int_<N6>,
245 boost::mpl::int_<N7>,
246 boost::mpl::int_<N8>,
247 boost::mpl::int_<N9>,
248 boost::mpl::int_<N10>>>> type;
249};
250
251/*! \brief Meta-function t_to_memory_c
252 *
253 * Meta-function t_to_memory_c, convert the type T into an appropriate memory_c type
254 *
255 * basically it convert t_to_memory_c<float> into memory_c<float> and array specification like
256 * t_to_memory_c<float[3][3]> into memory_c<multi_array<float,3,3>>, and so on for higher dimensionality
257 *
258 */
259template<typename T>
260struct t_to_memory_c
261{
262 typedef typename t_to_memory_c_impl<typename remove_attributes_const_ref<T>::type>::type type;
263};
264
265/*! \brief Meta-function t_to_memory_c_red
266 *
267 * Meta-function t_to_memory_c, convert the type T into an appropriate memory_c<....,MEMORY_C_REDUCED> type
268 *
269 * basically it convert t_to_memory_c<float> into memory_c<float,MEMORY_C_REDUCED> and array specification like
270 * t_to_memory_c<float[3][3]> into memory_c<multy_array<float,3,3>,MEMORY_C_REDUCED>, and so on for higher dimensionality
271 *
272 */
273template<typename T>
274struct t_to_memory_c_red
275{
276 typedef typename t_to_memory_c_red_impl<typename remove_attributes_const_ref<T>::type>::type type;
277};
278
279#endif /* T_TO_MEMORY_C_HPP_ */
280