24 #ifndef PSS_ASTROTYPES_MULTIARRAY_H
25 #define PSS_ASTROTYPES_MULTIARRAY_H
33 namespace astrotypes {
41 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension,
typename... OtherDimensions>
46 typedef std::vector<T, Alloc> Container;
59 template<
typename Dim>
60 struct OperatorSliceType;
67 template<
typename Dim>
68 struct ConstOperatorSliceType;
71 typedef SliceMixin<Slice<
true, SelfType, SliceMixin, FirstDimension, OtherDimensions...>>
ConstSliceType;
79 template<
typename Dim,
typename... Dims>
88 template<
typename DimensionType,
typename Enable=
typename std::enable_if<
89 has_dimensions<DimensionType, FirstDimension, OtherDimensions...>::value
98 inline iterator
begin();
99 inline iterator
end();
100 inline const_iterator
begin()
const;
101 inline const_iterator
end()
const;
102 inline const_iterator
cbegin()
const;
103 inline const_iterator
cend()
const;
124 template<
typename Dim>
125 typename std::enable_if<has_dimension<MultiArray, Dim>::value
126 && !std::is_same<Dim, FirstDimension>::value
127 ,
typename OperatorSliceType<Dim>::type>::type
130 template<
typename Dim>
131 typename std::enable_if<has_dimension<MultiArray, Dim>::value
132 && !std::is_same<Dim, FirstDimension>::value
133 ,
typename ConstOperatorSliceType<Dim>::type>::type
156 template<
typename Dim,
typename... Dims>
159 template<
typename Dim,
typename... Dims>
165 template<
typename... Dimensions>
173 template<
typename Dim,
typename... Dimensions>
182 template<
typename Dim>
186 template<
typename Dim>
187 typename std::enable_if<!std::is_same<Dim, FirstDimension>::value,
DimensionSize<Dim>>::type
190 template<
typename Dim>
194 template<
typename Dim>
195 typename std::enable_if<!std::is_same<Dim, FirstDimension>::value,
DimensionSize<Dim>>::type
214 template<
typename... Dims>
218 template<
typename DimensionType>
220 , DimensionType
const& d);
222 template<
typename Dimension,
typename... Dims>
223 typename std::enable_if<!
arg_helper<FirstDimension, Dimension, Dims...>::value,
void>::type
226 template<
typename Dimension,
typename... Dims>
227 typename std::enable_if<!
arg_helper<FirstDimension, Dimension, Dims...>::value,
void>::type
230 template<
typename Dimension,
typename... Dims>
231 typename std::enable_if<
arg_helper<FirstDimension, Dimension, Dims...>::value,
void>::type
234 template<
typename Dimension,
typename... Dims>
235 typename std::enable_if<
arg_helper<FirstDimension, Dimension, Dims...>::value,
void>::type
239 void do_resize(std::size_t total, T
const& value);
241 template<
typename SelfSlice,
typename OtherSlice>
249 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename FirstDimension>
253 typedef std::vector<T, Alloc> Container;
261 template<
typename Dim>
262 struct OperatorSliceType;
269 template<
typename Dim>
270 struct ConstOperatorSliceType;
272 typedef SliceMixin<Slice<false, SelfType, SliceMixin, FirstDimension>>
SliceType;
273 typedef SliceMixin<Slice<true, SelfType, SliceMixin, FirstDimension>>
ConstSliceType;
282 template<
typename Dim,
typename... Dims>
295 template<
typename Dim>
299 template<
typename Dim>
300 typename std::enable_if<!std::is_same<Dim, FirstDimension>::value,
DimensionSize<Dim>>::type
303 template<
typename Dim>
307 template<
typename Dim>
308 typename std::enable_if<!std::is_same<Dim, FirstDimension>::value,
DimensionSize<Dim>>::type
319 template<
typename Dimension>
325 template<
typename Dimension>
339 inline iterator
begin();
340 inline const_iterator
begin()
const;
341 inline const_iterator
cbegin()
const;
342 inline iterator
end();
343 inline const_iterator
end()
const;
344 inline const_iterator
cend()
const;
347 template<
typename... Dims>
351 template<
typename DimensionType>
353 , DimensionType
const& d);
356 template<
typename Dimension,
typename... Dims>
357 typename std::enable_if<
arg_helper<FirstDimension, Dimension, Dims...>::value,
void>::type
360 template<
typename Dimension,
typename... Dims>
361 typename std::enable_if<
arg_helper<FirstDimension, Dimension, Dims...>::value,
void>::type
364 template<
typename... Dims>
365 typename std::enable_if<!
arg_helper<FirstDimension, Dims...>::value,
void>::type
368 template<
typename... Dims>
369 typename std::enable_if<!
arg_helper<FirstDimension, Dims...>::value,
void>::type
372 template<
typename SelfSlice,
typename OtherSlice>
377 std::vector<T> _data;
380 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename Dimension>
384 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename Dimension>
388 template<
typename Alloc,
typename T,
template<
typename>
class SliceMixin,
typename Dimension1,
typename Dimension2,
typename... Dimensions>
389 struct has_exact_dimensions<
MultiArray<Alloc, T, SliceMixin, Dimension1, Dimension2, Dimensions...>, Dimension1, Dimension2, Dimensions...> :
public std::true_type
397 #endif // PSS_ASTROTYPES_MULTIARRAY_H
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
Representation of a Slice through a Data Array.
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 &)
const_iterator cbegin() const
Container::const_iterator const_iterator
T const & const_reference_type
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
return true if the Dimensions provided match exactly those of the structure T (including order) ...
A compile time dimesion tagging of size_t.
BaseT::value_type value_type
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
SliceMixin< Slice< true, SelfType, SliceMixin, FirstDimension > > ConstSliceType
bool equal_size(MultiArray const &) const
return true if the sizes of each dimension are equivalent
return true if the Dimension is represented in the structure
SliceMixin< Slice< false, SelfType, SliceMixin, FirstDimension > > SliceType
template classes to specify multiple dimension arrays with explicit dimension types ...
Container::iterator iterator
std::enable_if< std::is_same< Dim, FirstDimension >::value, DimensionSize< FirstDimension > >::type dimension() const
T const & const_reference_type