24 #ifndef PSS_ASTROTYPES_MULTIARRAY_SLICE_H
25 #define PSS_ASTROTYPES_MULTIARRAY_SLICE_H
33 namespace astrotypes {
35 template<
typename T,
typename... Dims>
40 template<
typename T,
typename... Dims>
44 T&&
arg(T&& arg, Dims&&...)
45 {
return std::forward<T>(arg); }
48 template<
typename T,
typename Dim,
typename... Dims>
54 T&&
arg(Dim&&, Dims&&...args)
55 {
return BaseT::arg(std::forward<Dims>(args)...); }
73 template<
typename ParentT,
typename ExcludeDimension>
79 template<
typename Traits,
typename ExcludeDimension,
typename D>
89 template<
typename TraitsT>
96 template<
typename TraitsT,
typename D>
103 template<
bool is_const,
typename SliceTraitsT,
template<
typename>
class SliceMixin,
typename Dimension,
typename... Dimensions>
105 class Slice :
private Slice<is_const, InternalSliceTraits<SliceTraitsT, Dimension>, SliceMixin, Dimensions...>
109 typedef Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>
SelfType;
110 typedef typename ParentT::value_type value_type;
111 typedef Dimension SelfDimension;
113 typedef typename ParentT::const_iterator parent_const_iterator;
114 typedef typename std::conditional<is_const, parent_const_iterator, typename ParentT::iterator>::type parent_iterator;
124 template<
typename Dim>
127 template<
typename Dim>
130 typedef typename std::conditional<is_const, const ParentT, ParentT>::type
Parent;
133 typedef SliceMixin<
Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>
SliceType;
136 typedef SliceMixin<Slice<true, InternalSliceTraits<SliceTraitsT, Dimension>, SliceMixin, Dimensions...>>
ConstReducedSliceType;
139 template<
typename Dim,
typename... Dims>
144 template<
typename Dim,
typename... Dims>
149 static constexpr std::size_t
rank = 1 +
sizeof...(Dimensions);
175 template<
typename Dim>
179 template<
typename Dim>
180 typename std::enable_if<!std::is_same<Dim, Dimension>::value,
DimensionSize<Dim>>::type
183 template<
typename Dim>
187 template<
typename Dim>
188 typename std::enable_if<!std::is_same<Dim, Dimension>::value,
DimensionSize<Dim>>::type
198 template<
typename Dim>
199 typename std::enable_if<
arg_helper<Dim, Dimensions...>::value
203 template<
typename Dim>
204 typename std::enable_if<
arg_helper<Dim, Dimensions...>::value
214 template<
typename... Dims>
218 template<
typename... Dims>
222 template<
typename... Dims>
223 typename std::enable_if<
arg_helper<Dimension, Dims...>::value, Slice<
true, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>::type
226 template<
typename... Dims>
227 typename std::enable_if<!
arg_helper<Dimension, Dims...>::value, Slice<
true, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>::type
235 const_iterator
begin()
const;
236 const_iterator
cbegin()
const;
242 const_iterator
end()
const;
243 const_iterator
cend()
const;
253 template<
bool const_type>
259 friend typename impl_iterator::BaseT;
260 friend typename impl_iterator::ImplT;
261 friend typename impl_const_iterator::BaseT;
262 friend typename impl_const_iterator::ImplT;
266 template<
bool,
typename P,
template<
typename>
class,
typename D,
typename... Ds>
friend class Slice;
269 template<
typename IteratorDifferenceT> IteratorDifferenceT
diff_it(IteratorDifferenceT
const& diff)
const;
279 parent_iterator
const&
base_ptr()
const;
282 parent_iterator
const&
offset(parent_iterator
const&);
285 template<
typename... Dims>
290 template<
typename... Dims>
295 template<
typename... Dims>
300 template<
typename... Dims>
305 template<
typename... Dims>
310 template<
typename... Dims>
332 impl_const_iterator
impl_end()
const;
336 friend typename iterator::BaseT;
337 friend typename iterator::ImplT;
338 friend typename const_iterator::BaseT;
339 friend typename const_iterator::ImplT;
344 parent_iterator _ptr;
349 template<
bool is_const,
typename SliceTraitsT,
template<
typename>
class SliceMixin,
typename Dimension>
350 class Slice<is_const, SliceTraitsT, SliceMixin, Dimension>
354 typedef typename ParentT::const_iterator parent_const_iterator;
355 typedef typename std::conditional<is_const, parent_const_iterator, typename ParentT::iterator>::type parent_iterator;
356 typedef Dimension SelfDimension;
363 template<
typename Dim>
364 struct OperatorSliceType;
366 template<
typename Dim>
367 struct ConstOperatorSliceType;
369 typedef typename std::iterator_traits<parent_iterator>::reference
reference_type;
371 typedef typename std::conditional<is_const, const ParentT, ParentT>::type
Parent;
382 static constexpr std::size_t
rank = 1;
397 template<
typename Dim>
404 template<
typename Dim>
414 template<
typename Dim>
416 typename std::enable_if<(!std::is_same<Dim, Dimension>::value)
424 template<
typename Dim>
431 template<
typename Dim>
441 template<
typename Dim>
443 typename std::enable_if<(!std::is_same<Dim, Dimension>::value)
451 reference_type
operator[](std::size_t index)
const;
455 template<typename Dim, typename Enable=typename std::enable_if<has_dimension<Parent, Dim>::value
456 && !std::is_same<Dim, Dimension>::value>::type>
460 template<typename Dim, typename Enable=typename std::enable_if<has_dimension<Parent, Dim>::value
461 && !std::is_same<Dim, Dimension>::value>::type>
473 parent_iterator
begin();
474 parent_const_iterator
begin()
const;
475 parent_const_iterator
cbegin()
const;
480 parent_iterator
end();
481 parent_const_iterator
end()
const;
482 parent_const_iterator
cend()
const;
487 template<
bool is_const_>
496 template<
bool,
typename P,
template<
typename>
class,
typename D,
typename... Ds>
friend class Slice;
499 template<
typename IteratorDifferenceT>
static IteratorDifferenceT
diff_it(IteratorDifferenceT
const& diff);
512 parent_iterator
const&
base_ptr()
const;
515 parent_iterator
const&
offset(parent_iterator
const&);
522 template<
typename... Dims>
527 template<
typename... Dims>
532 template<
typename... Dims>
537 template<
typename... Dims>
546 parent_iterator _ptr;
554 #endif // PSS_ASTROTYPES_MULTIARRAY_SLICE_H
SelfType const & operator[](DimensionIndex< Dim > const &) const
parent_const_iterator const_iterator
Slice< true, SliceTraitsT, SliceMixin, Dimension > ConstSliceType
iterator end()
iterator pointing to just after the last element
produces a tuple type with params form all provided Tuples
A tagged dimensionIndex variable.
iterator begin()
iterator pointing to the first element in the slice
bool operator==(Slice< const_type, SliceTraitsT, SliceMixin, Dimension, Dimensions...> const &) const
compare two arrays
SliceMixin< Slice< true, InternalSliceTraits< SliceTraitsT, Dimension >, SliceMixin, Dimensions...> > ConstReducedSliceType
SliceIterator< SliceMixin< SelfType >, is_const > iterator
Defines a contiguous range over dimension in index.
SliceMixin< Slice< is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...> > SliceType
parent_iterator const & offset(parent_iterator const &)
ConstOperatorSliceTypeHelper< Dim, Slice >::type type
std::size_t contiguous_span() const
static T && arg(T &&arg, Dims &&...)
static constexpr std::size_t rank
std::iterator_traits< parent_const_iterator >::reference const_reference_type
arg_helper< T, Dims...> BaseT
OperatorSliceTypeHelper< Dim, Slice >::type type
SliceMixin< BaseT > ReducedSliceType
Representation of a Slice through a Data Array.
SliceIterator< SelfType, true > impl_const_iterator
impl_iterator impl_begin()
iterator pointing to the first element in the slice
std::enable_if< std::is_same< Dim, Dimension >::value, DimensionSize< Dimension > >::type size() const
impl_const_iterator impl_cbegin() const
std::size_t diff_base_span() const
std::tuple< Dimension > DimensionTuple
std::tuple< ExcludeDimension > ExcludeTuple
std::enable_if< arg_helper< Dimension, Dims...>::value, SliceType >::type slice(DimensionSpan< Dims > const &...spans)
Take a sub-slice from this slice pass a DimensionSpan object for each dimension you wish ...
InternalSliceTraits< TraitsT, D >::ExcludeTuple ExcludeTuple
static T && arg(Dim &&, Dims &&...args)
SliceTraitsHelper< SliceTraitsT >::ExcludeTuple ExcludeTuple
SelfType & operator+=(std::size_t n)
const_iterator cend() const
parent_iterator const & base_ptr() const
Parent & parent() const
return refernce to the parent object the Slice is based on
impl_const_iterator impl_cend() const
provides a template to determine the returned type of an operator[]
join_tuples< typename BaseT::ExcludeTuple, std::tuple< ExcludeDimension > >::type ExcludeTuple
A compile time dimesion tagging of size_t.
impl_iterator impl_end()
iterator pointing to just after the last element
IteratorDifferenceT diff_it(IteratorDifferenceT const &diff) const
SliceIterator< SelfType, is_const > impl_iterator
bool increment_it(IteratorT ¤t, SlicePosition< rank > &pos) const
std::size_t base_span() const
OperatorSliceType< Dimension >::type operator[](DimensionIndex< Dimension >)
Take a slice in the specified dimension with a span of 1.
InternalSliceTraits< TraitsT, D >::Parent Parent
std::size_t data_size() const
the total number of data members in this slice
Slice< is_const, SliceTraitsT, SliceMixin, Dimension > SliceType
SliceMixin< Slice< true, SliceTraitsT, SliceMixin, Dimension, Dimensions...> > ConstSliceType
std::conditional< is_const, const ParentT, ParentT >::type Parent
return true if the Dimension is represented in the structure
std::conditional< is_const, const ParentT, ParentT >::type Parent
std::tuple< Dimension, Dimensions...> DimensionTuple
std::iterator_traits< parent_iterator >::reference reference_type
const_iterator cbegin() const
SliceTraitsHelper< SliceTraitsT >::ExcludeTuple ExcludeTuple
SliceIterator< SliceMixin< SelfType >, true > const_iterator
std::enable_if< std::is_same< Dim, Dimension >::value, DimensionSize< Dimension > >::type dimension() const
SelfType & operator[](DimensionIndex< Dim > const &)