astrotypes  0.0
MultiArray.cpp
Go to the documentation of this file.
1 /*
2  * MIT License
3  *
4  * Copyright (c) 2018 PulsarSearchSoft
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #include <functional>
25 
26 namespace pss {
27 namespace astrotypes {
28 
30 template<typename Alloc, typename T, template<typename> class SliceMixin, typename Dimension1, typename Dimension>
31 struct has_dimension<MultiArray<Alloc, T, SliceMixin, Dimension1>, Dimension> : public std::false_type
32 {};
33 
34 template<typename Alloc, typename T, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
35 struct has_dimension<MultiArray<Alloc, T, SliceMixin, Dimension, Dimensions...>, Dimension> : public std::true_type
36 {};
37 
38 template<typename Alloc, typename T, template<typename> class SliceMixin, typename Dimension1, typename Dimension, typename... Dimensions>
39 struct has_dimension<MultiArray<Alloc, T, SliceMixin, Dimension1, Dimensions...>, Dimension>
40  : public has_dimension<MultiArray<Alloc, T, SliceMixin, Dimensions...>, Dimension>
41 {};
42 
43 template<typename Alloc, typename T, template<typename> class SliceMixin, typename SliceDimension, typename Dimension>
44 struct has_dimension<SliceMixin<MultiArray<Alloc, T, SliceMixin, SliceDimension>>, Dimension> : public has_dimension<MultiArray<Alloc, T, SliceMixin, SliceDimension>, Dimension>
45 {};
46 
47 template<typename Alloc, typename T, template<typename> class SliceMixin, typename Dimension, typename D1, typename D2, typename... SliceDimensions>
48 struct has_dimension<SliceMixin<MultiArray<Alloc, T, SliceMixin, D1, D2, SliceDimensions...>>, Dimension> : public has_dimension<MultiArray<Alloc, T, SliceMixin, D1, D2, SliceDimensions...>, Dimension>
49 {};
50 
52 // type deduction helpers
53 // /////////////////////////////////////////////
54 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
55 template<typename Dim>
56 struct MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::OperatorSliceType
57 {
59 };
60 
61 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
62 template<typename Dim>
63 struct MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::ConstOperatorSliceType
64 {
66 };
67 
68 template<typename Alloc, typename T, template<typename> class SliceMixin, typename Dimension>
69 template<typename Dim>
70 struct MultiArray<Alloc, T, SliceMixin, Dimension>::OperatorSliceType
71 {
73 };
74 
75 template<typename Alloc, typename T, template<typename> class SliceMixin, typename Dimension>
76 template<typename Dim>
77 struct MultiArray<Alloc, T, SliceMixin, Dimension>::ConstOperatorSliceType
78 {
80 };
81 
83 // generic dimension implementation
85 // public interface for ensuring all is correctly sized up
86 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
87 template<typename Dim, typename... Dims>
89  : BaseT(false, size, sizes...)
90  , _size(arg_helper<DimensionSize<FirstDimension> const&, DimensionSize<Dim> const&, DimensionSize<Dims> const&...>::arg(size, sizes...))
91 {
92  resize(arg_helper<DimensionSize<FirstDimension> const&, DimensionSize<Dim> const&, DimensionSize<Dims> const&...>::arg(size, sizes...));
93 }
94 
95 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
96 template<typename DimensionType, typename Enable>
98  : BaseT(false, d)
99  , _size(d.template dimension<FirstDimension>())
100 {
101  resize(d.template dimension<FirstDimension>());
102  do_transpose(*this, d);
103 }
104 
105 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
106 template<typename DimensionType>
109  , DimensionType const& d
110  )
111  : BaseT(false, d)
112  , _size(d.template dimension<FirstDimension>())
113 {
114 }
115 
116 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
117 template<typename MultiArrayType, typename DimensionType>
119 {
120  for(DimensionIndex<FirstDimension> i(0); i < _size; ++i) {
121  auto slice = ma[i];
122  BaseT::do_transpose(slice, d[i]);
123  }
124 }
125 
126 
127 // private interface for constructing in an inheritance stack
128 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
129 template<typename... Dims>
131  typename std::enable_if<arg_helper<FirstDimension, Dims...>::value, bool>::type
132  , DimensionSize<Dims> const&... sizes)
133  : BaseT(false, sizes...)
134  , _size(arg_helper<DimensionSize<FirstDimension> const&, DimensionSize<Dims> const&...>::arg(sizes...))
135 {
136 }
137 
138 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
139 typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::iterator MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::begin()
140 {
141  return BaseT::begin();
142 }
143 
144 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
145 typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::const_iterator MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::begin() const
146 {
147  return BaseT::begin();
148 }
149 
150 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
151 typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::const_iterator MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::cbegin() const
152 {
153  return BaseT::cbegin();
154 }
155 
156 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
157 typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::iterator MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::end()
158 {
159  return BaseT::end();
160 }
161 
162 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
163 typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::const_iterator MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::end() const
164 {
165  return BaseT::end();
166 }
167 
168 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
169 typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::const_iterator MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::cend() const
170 {
171  return BaseT::cend();
172 }
173 
174 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
176 {
179 }
180 
181 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
183 {
186 }
187 
188 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
189 template<typename Dim>
190 typename std::enable_if<has_dimension<MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>, Dim>::value
191 && !std::is_same<Dim, FirstDimension>::value, typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::template ConstOperatorSliceType<Dim>::type>::type
193 {
194  return ConstSliceType(*this, DimensionSpan<Dim>(index, DimensionSize<Dim>(1)));
195 }
196 
197 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
198 template<typename Dim>
199 typename std::enable_if<has_dimension<MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>, Dim>::value
200 && !std::is_same<Dim, FirstDimension>::value, typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::template OperatorSliceType<Dim>::type>::type
202 {
203  return SliceType(*this, DimensionSpan<Dim>(index, DimensionSize<Dim>(1)));
204 }
205 
206 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
207 template<typename Dim, typename... Dims>
208 typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::ConstSliceType MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::slice(DimensionSpan<Dim> const& range, DimensionSpan<Dims> const&... ranges) const
209 {
210  return ConstSliceType(*this, range, ranges...);
211 }
212 
213 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
214 template<typename Dim, typename... Dims>
215 typename MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::SliceType MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::slice(DimensionSpan<Dim> const& range, DimensionSpan<Dims> const&... ranges)
216 {
217  return SliceType(*this, range, ranges...);
218 }
219 
220 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
221 template<typename... Dims>
222 void MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::resize(DimensionSize<Dims>... size)
223 {
224  this->do_resize(1, std::forward<DimensionSize<Dims>>(size)...);
225 }
226 
227 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
228 template<typename Dim, typename... Dims>
229 void MultiArray<Alloc, T, SliceMixin, FirstDimension, Dimensions...>::resize(DimensionSize<Dim> size_1, DimensionSize<Dims>... size, T const& value)
230 {
231  this->do_resize<Dim, Dims...>(1, size_1, std::forward<DimensionSize<Dims>>(size)..., value);
232 }
233 
234 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
235 template<typename Dim>
236 typename std::enable_if<!std::is_same<Dim, FirstDimension>::value, DimensionSize<Dim>>::type
238 {
239  return BaseT::template dimension<Dim>();
240 }
241 
242 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
243 template<typename Dim>
244 typename std::enable_if<std::is_same<Dim, FirstDimension>::value, DimensionSize<FirstDimension>>::type
246 {
247  return _size;
248 }
249 
250 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
251 template<typename Dim>
252 typename std::enable_if<!std::is_same<Dim, FirstDimension>::value, DimensionSize<Dim>>::type
254 {
255  return BaseT::template dimension<Dim>();
256 }
257 
258 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
259 template<typename Dim>
260 typename std::enable_if<std::is_same<Dim, FirstDimension>::value, DimensionSize<FirstDimension>>::type
262 {
263  return _size;
264 }
265 
266 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
267 template<typename Dim, typename... Dims>
268 typename std::enable_if<!arg_helper<FirstDimension, Dim, Dims...>::value, void>::type
270 {
271  BaseT::do_resize(total * static_cast<std::size_t>(_size), size, std::forward<DimensionSize<Dims>>(sizes)...);
272 }
273 
274 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
275 template<typename Dim, typename... Dims>
276 typename std::enable_if<!arg_helper<FirstDimension, Dim, Dims...>::value, void>::type
278 {
279  BaseT::do_resize(total * static_cast<std::size_t>(_size), size, std::forward<DimensionSize<Dims>>(sizes)..., value);
280 }
281 
282 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
283 template<typename Dim, typename... Dims>
284 typename std::enable_if<arg_helper<FirstDimension, Dim, Dims...>::value, void>::type
286 {
287  _size = arg_helper<DimensionSize<FirstDimension>, DimensionSize<Dim>, DimensionSize<Dims>...>::arg(std::forward<DimensionSize<Dim>>(size), std::forward<DimensionSize<Dims>>(sizes)...);
288  BaseT::do_resize(total * static_cast<std::size_t>(_size), size, std::forward<DimensionSize<Dims>>(sizes)...);
289 }
290 
291 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
292 template<typename Dim, typename... Dims>
293 typename std::enable_if<arg_helper<FirstDimension, Dim, Dims...>::value, void>::type
295 {
296  _size = arg_helper<DimensionSize<FirstDimension>, DimensionSize<Dim>, DimensionSize<Dims>...>::arg(std::forward<DimensionSize<Dim>>(size), std::forward<DimensionSize<Dims>>(sizes)...);
297  BaseT::template do_resize<Dim, Dims...>(total * static_cast<std::size_t>(_size), size, std::forward<DimensionSize<Dims>>(sizes)..., value);
298 }
299 
300 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
302 {
303  BaseT::do_resize(total * static_cast<std::size_t>(_size));
304 }
305 
306 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
308 {
309  BaseT::do_resize(total * static_cast<std::size_t>(_size), value);
310 }
311 
312 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
314 {
315  return BaseT::data_size();
316 }
317 
318 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
320 {
321  return _size == o.dimension<FirstDimension>() && BaseT::equal_size(static_cast<BaseT const&>(o));
322 }
323 
324 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension, typename... Dimensions>
326 {
327  return equal_size(o) && std::equal(o.cbegin(), o.cend(), cbegin());
328 }
329 
331 // Single Dimension specialisation
333 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
334 template<typename Dim, typename... Dims>
336  : _size(arg_helper<DimensionSize<FirstDimension> const&, DimensionSize<Dim> const&, DimensionSize<Dims> const&...>::arg(size, sizes...))
337 {
338  _data.resize(_size);
339 }
340 
341 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
342 template<typename... Dims>
344  typename std::enable_if<arg_helper<FirstDimension, Dims...>::value, bool>::type
345  , DimensionSize<Dims> const&... sizes)
346  : _size(arg_helper<DimensionSize<FirstDimension> const&, DimensionSize<Dims> const&...>::arg(sizes...))
347 {
348 }
349 
350 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
351 template<typename DimensionType>
353  typename std::enable_if<has_dimension<DimensionType, FirstDimension>::value, bool>::type
354  , DimensionType const& d
355  )
356  : _size(d.template dimension<FirstDimension>())
357 {
358 }
359 
360 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
362 {
363 }
364 
365 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
366 template<typename Dim>
367 typename std::enable_if<!std::is_same<Dim, FirstDimension>::value, DimensionSize<Dim>>::type
369 {
370  return DimensionSize<Dim>(0);
371 }
372 
373 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
374 template<typename Dim>
375 typename std::enable_if<std::is_same<Dim, FirstDimension>::value, DimensionSize<FirstDimension>>::type
377 {
378  return _size;
379 }
380 
381 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
382 template<typename Dim>
383 typename std::enable_if<!std::is_same<Dim, FirstDimension>::value, DimensionSize<Dim>>::type
385 {
386  return DimensionSize<Dim>(0);
387 }
388 
389 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
390 template<typename Dim>
391 typename std::enable_if<std::is_same<Dim, FirstDimension>::value, DimensionSize<FirstDimension>>::type
393 {
394  return _size;
395 }
396 
397 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
399 {
400  return this->_data.size();
401 }
402 
403 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
404 template<typename Dim>
406 {
407  this->do_resize(1, size);
408 }
409 
410 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
411 template<typename Dim>
413 {
414  this->do_resize(1, size, value);
415 }
416 
417 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
418 template<typename... Dims>
419 typename std::enable_if<!arg_helper<FirstDimension, Dims...>::value, void>::type
421 {
422  _data.resize(total * static_cast<std::size_t>(_size));
423 }
424 
425 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
426 template<typename... Dims>
427 typename std::enable_if<!arg_helper<FirstDimension, Dims...>::value, void>::type
429 {
430  _data.resize(total * static_cast<std::size_t>(_size), value);
431 }
432 
433 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
434 template<typename Dim, typename... Dims>
435 typename std::enable_if<arg_helper<FirstDimension, Dim, Dims...>::value, void>::type
437 {
438  _size = arg_helper<DimensionSize<FirstDimension>, DimensionSize<Dim>, DimensionSize<Dims>...>::arg(std::forward<DimensionSize<Dim>>(size), std::forward<DimensionSize<Dims>>(sizes)...);
439  _data.resize(total * static_cast<std::size_t>(_size));
440 }
441 
442 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
443 template<typename Dim, typename... Dims>
444 typename std::enable_if<arg_helper<FirstDimension, Dim, Dims...>::value, void>::type
446 {
447  _size = arg_helper<DimensionSize<FirstDimension>, DimensionSize<Dim>, DimensionSize<Dims>...>::arg(std::forward<DimensionSize<Dim>>(size), std::forward<DimensionSize<Dims>>(sizes)...);
448  _data.resize(total * static_cast<std::size_t>(_size), value);
449 }
450 
451 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
453 {
454  return *(begin() + static_cast<std::size_t>(index));
455 }
456 
457 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
459 {
460  return _data.begin();
461 }
462 
463 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
465 {
466  return _data.begin();
467 }
468 
469 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
471 {
472  return _data.cbegin();
473 }
474 
475 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
477 {
478  return _data.end();
479 }
480 
481 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
483 {
484  return _data.end();
485 }
486 
487 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
489 {
490  return _data.cend();
491 }
492 
493 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
495 {
496  return _size == o.dimension<FirstDimension>()
497  && std::equal(o.cbegin(), o.cend(), cbegin());
498 }
499 
500 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
502 {
503  return _size == o.dimension<FirstDimension>();
504 }
505 
506 template<typename Alloc, typename T, template<typename> class SliceMixin, typename FirstDimension>
507 template<typename MultiArrayType, typename DimensionType>
508 void MultiArray<Alloc, T, SliceMixin, FirstDimension>::do_transpose(MultiArrayType& ma, DimensionType const& d)
509 {
510  for(DimensionIndex<FirstDimension> i(0); i < _size; ++i) {
511  ma[i] = d[i];
512  }
513 }
514 
515 } // namespace astrotypes
516 } // namespace pss
const_iterator cend() const
Definition: MultiArray.cpp:169
BaseT::iterator iterator
Definition: MultiArray.h:49
A tagged dimensionIndex variable.
Defines a contiguous range over dimension in index.
Definition: DimensionSpan.h:41
std::enable_if< std::is_same< Dim, FirstDimension >::value, DimensionSize< FirstDimension > >::type size() const
return a slice of the specified dimension spanning the index_range provided
std::size_t data_size() const
the total size of data in all dimensions
Definition: MultiArray.cpp:313
ConstSliceType::template ConstOperatorSliceType< FirstDimension >::type ConstReducedDimensionSliceType
Definition: MultiArray.h:73
MultiArray(DimensionSize< Dim > size, DimensionSize< Dims >...sizes)
Definition: MultiArray.cpp:88
std::enable_if<!arg_helper< FirstDimension, Dimension, Dims...>::value, void >::type do_resize(std::size_t total, DimensionSize< Dimension > size, DimensionSize< Dims >...sizes)
SliceMixin< Slice< false, SelfType, SliceMixin, FirstDimension, OtherDimensions...> > SliceType
Definition: MultiArray.h:68
SliceMixin< Slice< true, SelfType, SliceMixin, FirstDimension, OtherDimensions...> > ConstSliceType
Definition: MultiArray.h:71
void do_transpose(SelfSlice &, OtherSlice const &)
ConstOperatorSliceTypeHelper< Dim, typename MultiArray::SliceType >::type type
Definition: MultiArray.cpp:65
const_iterator cbegin() const
Definition: MultiArray.cpp:151
ReducedDimensionSliceType operator[](DimensionIndex< FirstDimension > index)
take a slice of width 1 data at the specified index of the first dimension
Definition: MultiArray.cpp:175
bool operator==(MultiArray const &) const
compare data in the two arrays
Definition: MultiArray.cpp:325
provides a template to determine the returned type of an operator[]
Definition: MultiArray.cpp:56
A compile time dimesion tagging of size_t.
Definition: DimensionSize.h:39
BaseT::const_iterator const_iterator
Definition: MultiArray.h:50
return true if the all Dimensions provided are represented in the structure
Definition: TypeTraits.h:84
SliceType::template OperatorSliceType< FirstDimension >::type ReducedDimensionSliceType
Definition: MultiArray.h:72
iterator begin()
iterators acting over he entire data structure
Definition: MultiArray.cpp:139
bool equal_size(MultiArray const &) const
return true if the sizes of each dimension are equivalent
Definition: MultiArray.cpp:319
OperatorSliceTypeHelper< Dim, typename MultiArray::SliceType >::type type
Definition: MultiArray.cpp:58
return true if the Dimension is represented in the structure
Definition: TypeTraits.h:71
template classes to specify multiple dimension arrays with explicit dimension types ...
Definition: MultiArray.h:42
std::enable_if< std::is_same< Dim, FirstDimension >::value, DimensionSize< FirstDimension > >::type dimension() const
provides a template to determine the returned type of an operator[] const
Definition: MultiArray.cpp:63