46 #ifndef Shards_IndexList_hpp
47 #define Shards_IndexList_hpp
63 template<
int I0 = -1 ,
int I1 = -1 ,
int I2 = -1 ,
int I3 = -1 ,
64 int I4 = -1 ,
int I5 = -1 ,
int I6 = -1 ,
int I7 = -1 ,
65 int I8 = -1 ,
int I9 = -1 ,
int I10 = -1 ,
int I11 = -1 ,
66 int I12 = -1 ,
int I13 = -1 ,
int I14 = -1 ,
int I15 = -1 ,
67 int I16 = -1 ,
int I17 = -1 ,
int I18 = -1 ,
int I19 = -1 ,
68 int I20 = -1 ,
int I21 = -1 ,
int I22 = -1 ,
int I23 = -1 ,
69 int I24 = -1 ,
int I25 = -1 ,
int I26 = -1 ,
int I27 = -1 ,
70 int I28 = -1 ,
int I29 = -1 ,
int I30 = -1 ,
int I31 = -1 >
86 template<
class List ,
int J ,
bool OK = 0 <= J >
87 struct IndexListFind ;
92 template<
class List >
struct IndexListInverse {};
94 #ifndef DOXYGEN_COMPILE
99 struct IndexListLength< IndexList<> > {
enum { value = 0 }; };
101 template<
int I0 ,
int I1 ,
int I2 ,
int I3 ,
102 int I4 ,
int I5 ,
int I6 ,
int I7 ,
103 int I8 ,
int I9 ,
int I10 ,
int I11 ,
104 int I12 ,
int I13 ,
int I14 ,
int I15 ,
105 int I16 ,
int I17 ,
int I18 ,
int I19 ,
106 int I20 ,
int I21 ,
int I22 ,
int I23 ,
107 int I24 ,
int I25 ,
int I26 ,
int I27 ,
108 int I28 ,
int I29 ,
int I30 ,
int I31 >
109 struct IndexListLength<
110 IndexList< I0 , I1 , I2 , I3 , I4 , I5 , I6 , I7 ,
111 I8 , I9 , I10 , I11 , I12 , I13 , I14 , I15 ,
112 I16 , I17 , I18 , I19 , I20 , I21 , I22 , I23 ,
113 I24 , I25 , I26 , I27 , I28 , I29 , I30 , I31 > >
116 typedef IndexList< I1 , I2 , I3 , I4 , I5 , I6 , I7 ,
117 I8 , I9 , I10 , I11 , I12 , I13 , I14 , I15 ,
118 I16 , I17 , I18 , I19 , I20 , I21 , I22 , I23 ,
119 I24 , I25 , I26 , I27 , I28 , I29 , I30 , I31 , -1 >
123 enum { value = 1 + IndexListLength< shift_type >::value };
128 #define SHARDS_INDEX_LIST_AT_SPECIALIZATION( J , K ) \
129 template< int I0 , int I1 , int I2 , int I3 , \
130 int I4 , int I5 , int I6 , int I7 , \
131 int I8 , int I9 , int I10 , int I11 , \
132 int I12 , int I13 , int I14 , int I15 , \
133 int I16 , int I17 , int I18 , int I19 , \
134 int I20 , int I21 , int I22 , int I23 , \
135 int I24 , int I25 , int I26 , int I27 , \
136 int I28 , int I29 , int I30 , int I31 > \
137 struct IndexListAt< \
138 IndexList< I0 , I1 , I2 , I3 , I4 , I5 , I6 , I7 , \
139 I8 , I9 , I10 , I11 , I12 , I13 , I14 , I15 , \
140 I16 , I17 , I18 , I19 , I20 , I21 , I22 , I23 , \
141 I24 , I25 , I26 , I27 , I28 , I29 , I30 , I31 > , J > \
142 { enum { value = K }; };
144 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 0 , I0 )
145 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 1 , I1 )
146 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 2 , I2 )
147 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 3 , I3 )
148 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 4 , I4 )
149 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 5 , I5 )
150 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 6 , I6 )
151 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 7 , I7 )
152 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 8 , I8 )
153 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 9 , I9 )
154 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 10 , I10 )
155 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 11 , I11 )
156 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 12 , I12 )
157 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 13 , I13 )
158 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 14 , I14 )
159 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 15 , I15 )
160 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 16 , I16 )
161 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 17 , I17 )
162 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 18 , I18 )
163 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 19 , I19 )
164 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 20 , I20 )
165 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 21 , I21 )
166 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 22 , I22 )
167 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 23 , I23 )
168 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 24 , I24 )
169 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 25 , I25 )
170 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 26 , I26 )
171 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 27 , I27 )
172 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 28 , I28 )
173 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 29 , I29 )
174 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 30 , I30 )
175 SHARDS_INDEX_LIST_AT_SPECIALIZATION( 31 , I31 )
177 #undef SHARDS_INDEX_LIST_AT_SPECIALIZATION
181 template<
class List ,
int J ,
bool OK >
182 struct IndexListFind {
enum { value = -1 }; };
184 #define SHARDS_INDEX_LIST_FIND_SPECIALIZATION( J , K ) \
185 template< int I0 , int I1 , int I2 , int I3 , \
186 int I4 , int I5 , int I6 , int I7 , \
187 int I8 , int I9 , int I10 , int I11 , \
188 int I12 , int I13 , int I14 , int I15 , \
189 int I16 , int I17 , int I18 , int I19 , \
190 int I20 , int I21 , int I22 , int I23 , \
191 int I24 , int I25 , int I26 , int I27 , \
192 int I28 , int I29 , int I30 , int I31 > \
193 struct IndexListFind< \
194 IndexList< I0 , I1 , I2 , I3 , I4 , I5 , I6 , I7 , \
195 I8 , I9 , I10 , I11 , I12 , I13 , I14 , I15 , \
196 I16 , I17 , I18 , I19 , I20 , I21 , I22 , I23 , \
197 I24 , I25 , I26 , I27 , I28 , I29 , I30 , I31 > , K , true > \
198 { enum { value = J }; };
200 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 0 , I0 )
201 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 1 , I1 )
202 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 2 , I2 )
203 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 3 , I3 )
204 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 4 , I4 )
205 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 5 , I5 )
206 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 6 , I6 )
207 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 7 , I7 )
208 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 8 , I8 )
209 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 9 , I9 )
210 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 10 , I10 )
211 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 11 , I11 )
212 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 12 , I12 )
213 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 13 , I13 )
214 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 14 , I14 )
215 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 15 , I15 )
216 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 16 , I16 )
217 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 17 , I17 )
218 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 18 , I18 )
219 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 19 , I19 )
220 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 20 , I20 )
221 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 21 , I21 )
222 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 22 , I22 )
223 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 23 , I23 )
224 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 24 , I24 )
225 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 25 , I25 )
226 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 26 , I26 )
227 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 27 , I27 )
228 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 28 , I28 )
229 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 29 , I29 )
230 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 30 , I30 )
231 SHARDS_INDEX_LIST_FIND_SPECIALIZATION( 31 , I31 )
233 #undef SHARDS_INDEX_LIST_FIND_SPECIALIZATION
237 template<
int I0 ,
int I1 ,
int I2 ,
int I3 ,
238 int I4 ,
int I5 ,
int I6 ,
int I7 ,
239 int I8 ,
int I9 ,
int I10 ,
int I11 ,
240 int I12 ,
int I13 ,
int I14 ,
int I15 ,
241 int I16 ,
int I17 ,
int I18 ,
int I19 ,
242 int I20 ,
int I21 ,
int I22 ,
int I23 ,
243 int I24 ,
int I25 ,
int I26 ,
int I27 ,
244 int I28 ,
int I29 ,
int I30 ,
int I31 >
245 struct IndexListInverse<
246 IndexList< I0 , I1 , I2 , I3 , I4 , I5 , I6 , I7 ,
247 I8 , I9 , I10 , I11 , I12 , I13 , I14 , I15 ,
248 I16 , I17 , I18 , I19 , I20 , I21 , I22 , I23 ,
249 I24 , I25 , I26 , I27 , I28 , I29 , I30 , I31 > >
252 typedef IndexList< I0 , I1 , I2 , I3 , I4 , I5 , I6 , I7 ,
253 I8 , I9 , I10 , I11 , I12 , I13 , I14 , I15 ,
254 I16 , I17 , I18 , I19 , I20 , I21 , I22 , I23 ,
255 I24 , I25 , I26 , I27 , I28 , I29 , I30 , I31 > list ;
257 typedef IndexListInverse< list > SelfType ;
259 enum { length = IndexListLength< list >::value };
261 enum { J0 = IndexListFind< list , 0 , 0 < length >::value ,
262 J1 = IndexListFind< list , 1 , 1 < length >::value ,
263 J2 = IndexListFind< list , 2 , 2 < length >::value ,
264 J3 = IndexListFind< list , 3 , 3 < length >::value ,
265 J4 = IndexListFind< list , 4 , 4 < length >::value ,
266 J5 = IndexListFind< list , 5 , 5 < length >::value ,
267 J6 = IndexListFind< list , 6 , 6 < length >::value ,
268 J7 = IndexListFind< list , 7 , 7 < length >::value ,
269 J8 = IndexListFind< list , 8 , 8 < length >::value ,
270 J9 = IndexListFind< list , 9 , 9 < length >::value ,
271 J10 = IndexListFind< list , 10 , 10 < length >::value ,
272 J11 = IndexListFind< list , 11 , 11 < length >::value ,
273 J12 = IndexListFind< list , 12 , 12 < length >::value ,
274 J13 = IndexListFind< list , 13 , 13 < length >::value ,
275 J14 = IndexListFind< list , 14 , 14 < length >::value ,
276 J15 = IndexListFind< list , 15 , 15 < length >::value ,
277 J16 = IndexListFind< list , 16 , 16 < length >::value ,
278 J17 = IndexListFind< list , 17 , 17 < length >::value ,
279 J18 = IndexListFind< list , 18 , 18 < length >::value ,
280 J19 = IndexListFind< list , 19 , 19 < length >::value ,
281 J20 = IndexListFind< list , 20 , 20 < length >::value ,
282 J21 = IndexListFind< list , 21 , 21 < length >::value ,
283 J22 = IndexListFind< list , 22 , 22 < length >::value ,
284 J23 = IndexListFind< list , 23 , 23 < length >::value ,
285 J24 = IndexListFind< list , 24 , 24 < length >::value ,
286 J25 = IndexListFind< list , 25 , 25 < length >::value ,
287 J26 = IndexListFind< list , 26 , 26 < length >::value ,
288 J27 = IndexListFind< list , 27 , 27 < length >::value ,
289 J28 = IndexListFind< list , 28 , 28 < length >::value ,
290 J29 = IndexListFind< list , 29 , 29 < length >::value ,
291 J30 = IndexListFind< list , 30 , 30 < length >::value ,
292 J31 = IndexListFind< list , 31 , 31 < length >::value };
296 typedef IndexList< SelfType::J0 , SelfType::J1 ,
297 SelfType::J2 , SelfType::J3 ,
298 SelfType::J4 , SelfType::J5 ,
299 SelfType::J6 , SelfType::J7 ,
300 SelfType::J8 , SelfType::J9 ,
301 SelfType::J10 , SelfType::J11 ,
302 SelfType::J12 , SelfType::J13 ,
303 SelfType::J14 , SelfType::J15 ,
304 SelfType::J16 , SelfType::J17 ,
305 SelfType::J18 , SelfType::J19 ,
306 SelfType::J20 , SelfType::J21 ,
307 SelfType::J22 , SelfType::J23 ,
308 SelfType::J24 , SelfType::J25 ,
309 SelfType::J26 , SelfType::J27 ,
310 SelfType::J28 , SelfType::J29 ,
311 SelfType::J30 , SelfType::J31 > type ;
321 #endif // Shards_IndexList_hpp
Access member of compile-time list of indices. Defines enum { value = Jth member }; ...
Compile-time list of indices.
Length of list. Defines enum { value };