27 namespace astrotypes {
30 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename Dimension1,
typename Dimension>
34 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename Dimension,
typename... Dimensions>
38 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename Dimension1,
typename Dimension,
typename... Dimensions>
40 :
public has_dimension<MultiArray<Alloc, T, SliceMixin, Dimensions...>, Dimension>
43 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename SliceDimension,
typename Dimension>
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>
54 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
55 template<
typename Dim>
61 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
62 template<
typename Dim>
68 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename Dimension>
69 template<
typename Dim>
75 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename Dimension>
76 template<
typename Dim>
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...)
95 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
96 template<
typename DimensionType,
typename Enable>
99 , _size(d.template dimension<FirstDimension>())
101 resize(d.template dimension<FirstDimension>());
105 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
106 template<
typename DimensionType>
109 , DimensionType
const& d
112 , _size(d.template dimension<FirstDimension>())
116 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
117 template<
typename MultiArrayType,
typename DimensionType>
122 BaseT::do_transpose(slice, d[i]);
128 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
129 template<
typename... Dims>
133 :
BaseT(false, sizes...)
138 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
141 return BaseT::begin();
144 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
147 return BaseT::begin();
150 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
153 return BaseT::cbegin();
156 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
162 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
168 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
171 return BaseT::cend();
174 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
181 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
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
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
206 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
207 template<
typename Dim,
typename... Dims>
210 return ConstSliceType(*
this, range, ranges...);
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)
217 return SliceType(*
this, range, ranges...);
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)
224 this->do_resize(1, std::forward<DimensionSize<Dims>>(size)...);
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)
231 this->do_resize<Dim, Dims...>(1, size_1, std::forward<DimensionSize<Dims>>(size)..., value);
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
239 return BaseT::template dimension<Dim>();
242 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
243 template<
typename Dim>
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
255 return BaseT::template dimension<Dim>();
258 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
259 template<
typename Dim>
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
271 BaseT::do_resize(total * static_cast<std::size_t>(_size), size, std::forward<
DimensionSize<Dims>>(sizes)...);
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
279 BaseT::do_resize(total * static_cast<std::size_t>(_size), size, std::forward<
DimensionSize<Dims>>(sizes)..., value);
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
288 BaseT::do_resize(total * static_cast<std::size_t>(_size), size, std::forward<
DimensionSize<Dims>>(sizes)...);
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
297 BaseT::template do_resize<Dim, Dims...>(total *
static_cast<std::size_t
>(_size), size, std::forward<
DimensionSize<Dims>>(sizes)..., value);
300 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
303 BaseT::do_resize(total * static_cast<std::size_t>(_size));
306 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
309 BaseT::do_resize(total * static_cast<std::size_t>(_size), value);
312 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
315 return BaseT::data_size();
318 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
321 return _size == o.
dimension<FirstDimension>() && BaseT::equal_size(static_cast<BaseT const&>(o));
324 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... Dimensions>
327 return equal_size(o) && std::equal(o.
cbegin(), o.
cend(), cbegin());
333 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
334 template<
typename Dim,
typename... Dims>
341 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
342 template<
typename... Dims>
350 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
351 template<
typename DimensionType>
354 , DimensionType
const& d
356 : _size(d.template dimension<FirstDimension>())
360 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
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
373 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
374 template<
typename Dim>
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
389 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
390 template<
typename Dim>
397 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
400 return this->_data.size();
403 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
404 template<
typename Dim>
410 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
411 template<
typename Dim>
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
422 _data.resize(total * static_cast<std::size_t>(_size));
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
430 _data.resize(total * static_cast<std::size_t>(_size), value);
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
439 _data.resize(total * static_cast<std::size_t>(_size));
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
448 _data.resize(total * static_cast<std::size_t>(_size), value);
451 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
454 return *(
begin() +
static_cast<std::size_t
>(index));
457 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
460 return _data.begin();
463 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
466 return _data.begin();
469 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
472 return _data.cbegin();
475 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
481 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
487 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
493 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
496 return _size == o.
dimension<FirstDimension>()
500 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
503 return _size == o.
dimension<FirstDimension>();
506 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
507 template<
typename MultiArrayType,
typename DimensionType>
const_iterator cend() const
A tagged dimensionIndex variable.
Defines a contiguous range over dimension in index.
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
ConstSliceType::template ConstOperatorSliceType< FirstDimension >::type ConstReducedDimensionSliceType
MultiArray(DimensionSize< Dim > size, DimensionSize< Dims >...sizes)
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
SliceMixin< Slice< true, SelfType, SliceMixin, FirstDimension, OtherDimensions...> > ConstSliceType
void do_transpose(SelfSlice &, OtherSlice const &)
ConstOperatorSliceTypeHelper< Dim, typename MultiArray::SliceType >::type type
const_iterator cbegin() const
ReducedDimensionSliceType operator[](DimensionIndex< FirstDimension > index)
take a slice of width 1 data at the specified index of the first dimension
bool operator==(MultiArray const &) const
compare data in the two arrays
provides a template to determine the returned type of an operator[]
A compile time dimesion tagging of size_t.
BaseT::const_iterator const_iterator
return true if the all Dimensions provided are represented in the structure
SliceType::template OperatorSliceType< FirstDimension >::type ReducedDimensionSliceType
iterator begin()
iterators acting over he entire data structure
bool equal_size(MultiArray const &) const
return true if the sizes of each dimension are equivalent
OperatorSliceTypeHelper< Dim, typename MultiArray::SliceType >::type type
return true if the Dimension is represented in the structure
template classes to specify multiple dimension arrays with explicit dimension types ...
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