astrotypes  0.0
Slice.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 "ReducedRankSlice.h"
26 #include <iostream>
27 
28 namespace pss {
29 namespace astrotypes {
30 
31 // type traits helper structs
32 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
33 struct has_dimension<Slice<is_const, SliceTraitsT, SliceMixin, Dimension>, Dimension> : public std::true_type
34 {};
35 
36 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension1, typename Dimension>
37 struct has_dimension<Slice<is_const, SliceTraitsT, SliceMixin, Dimension1>, Dimension> : public has_dimension<typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension1>::Parent, Dimension>
38 {};
39 
40 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
41 struct has_dimension<Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>, Dimension> : public std::true_type
42 {
43 };
44 
45 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension1, typename Dimension, typename... Dimensions>
46 struct has_dimension<Slice<is_const, SliceTraitsT, SliceMixin, Dimension1, Dimensions...>, Dimension>
47  : public has_dimension<Slice<is_const, SliceTraitsT, SliceMixin, Dimensions...>, Dimension>
48 {
49 };
50 
51 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
52 struct has_dimension<SliceMixin<Slice<is_const, SliceTraitsT, SliceMixin, Dimensions...>>, Dimension> : public has_dimension<Slice<is_const, SliceTraitsT, SliceMixin, Dimensions...>, Dimension>
53 {
54 };
55 
56 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename D1, typename D2, typename... Dimensions>
57 struct has_exact_dimensions<Slice<is_const, SliceTraitsT, SliceMixin, D1, D2, Dimensions...>, D1, D2, Dimensions...> : public std::true_type
58 {
59 };
60 
61 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
62 struct has_exact_dimensions<Slice<is_const, SliceTraitsT, SliceMixin, Dimension>, Dimension> : public std::true_type //has_exact_dimensions<ParentT>
63 {
64 };
65 
66 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
67 struct has_exact_dimensions<SliceMixin<Slice<is_const, SliceTraitsT, SliceMixin, Dimension>>, Dimension> : public has_exact_dimensions<Slice<is_const, SliceTraitsT, SliceMixin, Dimension>, Dimension>::type
68 {
69 };
70 
71 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename D1, typename D2, typename... Dimensions>
72 struct has_exact_dimensions<SliceMixin<Slice<is_const, SliceTraitsT, SliceMixin, D1, D2, Dimensions...>>, D1, D2, Dimensions...> : public has_exact_dimensions<Slice<is_const, SliceTraitsT, SliceMixin, D1, D2, Dimensions...>, D1, D2, Dimensions...>::type
73 {
74 };
75 
76 // -- determine the rwturn types of the various dimension reducing operators
77 template<typename Dim, typename SliceType>
79 
80 template<typename Dim, typename SliceType>
82 
83 // match SliceMixin
84 template<typename Dim, bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
85 struct OperatorSliceTypeHelper<Dim, SliceMixin<Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>> : public OperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>
86 {
87  typedef typename OperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>::type type;
88 };
89 
90 // match SliceMixin for Const types
91 template<typename Dim, bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
92 struct ConstOperatorSliceTypeHelper<Dim, SliceMixin<Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>> : public ConstOperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>
93 {
94  typedef typename ConstOperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>::type type;
95 };
96 
97 template<typename Dim, bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
98 struct OperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>> {
99  //typedef typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>::SliceType type;
100  typedef typename std::conditional<is_const,
101  typename ConstOperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>>::type
102  , SliceMixin<multiarray::ReducedRankSlice<Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>, Dim>>
104 };
105 
106 // ordered in line with Parent
107 template<typename Dim, bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename... Dimensions>
108 struct OperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dim, Dimensions...>> {
109  typedef typename std::conditional<is_const,
110  typename ConstOperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dim, Dimensions...>>::type
111  , typename Slice<is_const, SliceTraitsT, SliceMixin, Dim, Dimensions...>::ReducedSliceType
113 };
114 
115 template<typename Dim, bool is_const, typename SliceTraitsT, template<typename> class SliceMixin>
116 struct OperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dim>> {
118 };
119 
120 template<typename Dim, bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
121 struct ConstOperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>> {
122  //typedef typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>::ConstSliceType type;
123  typedef SliceMixin<multiarray::ReducedRankSlice<Slice<true, SliceTraitsT, SliceMixin, Dimension, Dimensions...>, Dim>> type;
124 };
125 
126 template<typename Dim, bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename... Dimensions>
127 struct ConstOperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dim, Dimensions...>> {
128  typedef typename Slice<is_const, SliceTraitsT, SliceMixin, Dim, Dimensions...>::ConstReducedSliceType type;
129 };
130 
131 template<typename Dim, bool is_const, typename SliceTraitsT, template<typename> class SliceMixin>
132 struct ConstOperatorSliceTypeHelper<Dim, Slice<is_const, SliceTraitsT, SliceMixin, Dim>> {
134 };
135 
136 // ------------------- multi dimension ----------------------- -------------
137 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
138 template<typename Dim>
139 struct Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>::OperatorSliceType
140 {
142 };
143 
144 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
145 template<typename Dim>
146 struct Slice<is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>::ConstOperatorSliceType
147 {
149 };
150 
151 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
152 template<typename Dim>
153 struct Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::OperatorSliceType
154 {
156 };
157 
158 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
159 template<typename Dim>
160 struct Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::ConstOperatorSliceType
161 {
163 };
164 
165 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
166 template<typename Dim, typename... Dims>
168  typename std::enable_if<arg_helper<Dimension, Dim, Dims...>::value, Parent&>::type parent
169  , DimensionSpan<Dim> const& span
170  , DimensionSpan<Dims> const&... spans)
171  : BaseT(internal_construct_tag(), parent, span, spans... )
172  , _span(arg_helper<DimensionSpan<Dimension> const&, DimensionSpan<Dim> const&, DimensionSpan<Dims> const&...>::arg(span, spans...))
173  , _base_span(0U) // not used (yet) so don't bother calculating it
174  , _ptr(parent.begin() + static_cast<std::size_t>(_span.start()) * BaseT::_base_span)
175 {
176  BaseT::offset(_ptr);
177 }
178 
179 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
180 template<typename Dim, typename... Dims>
182  typename std::enable_if<!arg_helper<Dimension, Dim, Dims...>::value, Parent&>::type parent
183  , DimensionSpan<Dim> const& span
184  , DimensionSpan<Dims> const&... spans)
185  : BaseT(internal_construct_tag(), parent, span, spans... )
186  , _span(DimensionSpan<Dimension>(DimensionIndex<Dimension>(0), parent.template dimension<Dimension>()))
187  , _base_span(0U) // not used (yet) so don't bother calculating it
188  , _ptr(parent.begin())
189 {
190  BaseT::offset(_ptr);
191 }
192 
193 // SLice changed dim constructor - case Dim not provided bu constructor args
194 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
195 template<typename... Dims>
197  , typename std::enable_if<!arg_helper<Dimension, Dims...>::value, Slice>::type const& copy
198  , DimensionSpan<Dims> const&... spans
199  )
200  : BaseT(copy_resize_construct_base_tag(), static_cast<BaseT const&>(copy), spans...)
201  , _span(copy._span)
202  , _base_span(copy._base_span) // not used (yet) so don't bother calculating it
203  , _ptr(copy._ptr)
204 {
205  _ptr = BaseT::offset(_ptr);
206 }
207 
208 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
209 template<typename... Dims>
211  , typename std::enable_if<!arg_helper<Dimension, Dims...>::value, Slice>::type const& copy
212  , DimensionSpan<Dims> const&... spans
213  )
214  : BaseT(copy_resize_construct_base_tag(), static_cast<BaseT const&>(copy), spans...)
215  , _span(copy._span)
216  , _base_span(copy._base_span) // not used (yet) so don't bother calculating it
217 {
218 }
219 
220 // SLice changed dim constructor - case Dim provided bu constructor args
221 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
222 template<typename... Dims>
224  , typename std::enable_if<arg_helper<Dimension, Dims...>::value, Slice>::type const& copy
225  , DimensionSpan<Dims> const&... spans
226  )
227  : BaseT(copy_resize_construct_base_tag(), static_cast<BaseT const&>(copy), spans...)
228  , _span(DimensionSpan<Dimension>(DimensionIndex<Dimension>(copy._span.start()
229  + arg_helper<DimensionSpan<Dimension> const&, DimensionSpan<Dims> const&...>::arg(spans...).start())
230  , arg_helper<DimensionSpan<Dimension> const&, DimensionSpan<Dims> const&...>::arg(spans...).span()))
231  , _base_span(copy._base_span) // not used (yet) so don't bother calculating it
232  , _ptr(copy._ptr + static_cast<std::size_t>(
233  arg_helper<DimensionSpan<Dimension> const&, DimensionSpan<Dims> const&...>::arg(spans...).start())
234  * BaseT::_base_span)
235 {
236  BaseT::offset(_ptr);
237 }
238 
239 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
240 template<typename... Dims>
242  , typename std::enable_if<arg_helper<Dimension, Dims...>::value, Slice>::type const& copy
243  , DimensionSpan<Dims> const&... spans
244  )
245  : BaseT(copy_resize_construct_base_tag(), static_cast<BaseT const&>(copy), spans...)
246  , _span(arg_helper<DimensionSpan<Dimension>, DimensionSpan<Dims>...>::arg(spans...))
247  , _base_span(copy._base_span) // not used (yet) so don't bother calculating it
248 {
249 }
250 
251 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
252 template<typename... Dims>
254  , typename std::enable_if<arg_helper<Dimension, Dims...>::value, Parent&>::type parent
255  , DimensionSpan<Dims> const& ... spans)
256  : BaseT(internal_construct_tag(), parent, spans...)
257  , _span(arg_helper<DimensionSpan<Dimension> const&, DimensionSpan<Dims> const&...>::arg(spans...))
258  , _base_span(parent.template size<Dimension>() * BaseT::_base_span)
259 {
260 }
261 
262 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
263 template<typename... Dims>
265  , typename std::enable_if<!arg_helper<Dimension, Dims...>::value, Parent&>::type parent
266  , DimensionSpan<Dims> const& ... spans)
267  : BaseT(internal_construct_tag(), parent, spans...)
268  , _span(DimensionSpan<Dimension>(DimensionIndex<Dimension>(0), DimensionSize<Dimension>(parent.template size<Dimension>())))
269  , _base_span(parent.template size<Dimension>() * BaseT::_base_span)
270 {
271 }
272 
273 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
274 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::parent_iterator const& Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::offset(parent_iterator const& it)
275 {
276  _ptr=it + static_cast<std::size_t>(_span.start()) * BaseT::_base_span;
277  return BaseT::offset(_ptr);
278 }
279 
280 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
282 {
283  return static_cast<std::size_t>(BaseT::_base_span * (_span.span() - 1)) + BaseT::base_span();
284 }
285 
286 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
288 {
289  return static_cast<std::size_t>(BaseT::_base_span) * (_span.span() - 1);
290 }
291 
292 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
294 {
295  return BaseT::contiguous_span();
296 }
297 
298 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
299 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::parent_iterator& Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::base_ptr()
300 {
301  return BaseT::base_ptr();
302 }
303 
304 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
305 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::parent_iterator const& Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::base_ptr() const
306 {
307  return BaseT::base_ptr();
308 }
309 
310 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
312 {
313  return _span.span() * BaseT::data_size();;
314 }
315 
316 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
317 template<typename Dim>
318 typename std::enable_if<std::is_same<Dim, Dimension>::value, DimensionSize<Dimension>>::type
320 {
321  return _span.span();
322 }
323 
324 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
325 template<typename Dim>
326 typename std::enable_if<!std::is_same<Dim, Dimension>::value, DimensionSize<Dim>>::type
328 {
329  return BaseT::template size<Dim>();
330 }
331 
332 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
333 template<typename Dim>
334 typename std::enable_if<std::is_same<Dim, Dimension>::value, DimensionSize<Dimension>>::type
336 {
337  return _span.span();
338 }
339 
340 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
341 template<typename Dim>
342 typename std::enable_if<!std::is_same<Dim, Dimension>::value, DimensionSize<Dim>>::type
344 {
345  return BaseT::template dimension<Dim>();
346 }
347 
348 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
349 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::template OperatorSliceType<Dimension>::type
351 {
353  return ReducedSliceType(static_cast<BaseT const&>(*this)) += static_cast<std::size_t>(offset);
354 }
355 
356 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
357 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::template ConstOperatorSliceType<Dimension>::type
359 {
361  return SliceType(reinterpret_cast<SliceType const&>(*this)) += static_cast<std::size_t>(offset);
362 }
363 
364 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
365 template<typename Dim>
366 typename std::enable_if<arg_helper<Dim, Dimensions...>::value
367 && !std::is_same<Dim, Dimension>::value, typename Slice<is_const, Parent
368  , SliceMixin, Dimension, Dimensions...>::template OperatorSliceType<Dim>::type>::type
370 {
372 }
373 
374 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
375 template<typename Dim>
376 typename std::enable_if<arg_helper<Dim, Dimensions...>::value
377 && !std::is_same<Dim, Dimension>::value, typename Slice<is_const, Parent
378  , SliceMixin, Dimension, Dimensions...>::template ConstOperatorSliceType<Dim>::type>::type
380 {
381  typedef Slice<true, Parent, SliceMixin, Dimension, Dimensions...> SliceType;
382  return SliceType(copy_resize_construct_tag(), reinterpret_cast<SliceType const&>(*this), DimensionSpan<Dim>(index, DimensionSize<Dim>(1)));
383 }
384 
385 
386 // n.b offset refers to the dimension in the level above (i.e a full _base_span)
387 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
388 Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>& Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::operator+=(std::size_t offset)
389 {
390  _ptr += (offset * _base_span);
391  BaseT::offset(_ptr);
392  return *this;
393 }
394 
395 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
397 {
398  _ptr += (offset * BaseT::_base_span);
399  BaseT::offset(_ptr);
400  return *this;
401 }
402 
403 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
404 template<typename... Dims>
405 typename std::enable_if<arg_helper<Dimension, Dims...>::value, typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::SliceType>::type
407 {
408  return Slice(copy_resize_construct_tag(), *this, spans...);
409 }
410 
411 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
412 template<typename... Dims>
413 typename std::enable_if<!arg_helper<Dimension, Dims...>::value, typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::SliceType>::type
415 {
416  return Slice(copy_resize_construct_tag(), *this, spans...);
417 }
418 
419 
420 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
421 template<typename... Dims>
422 typename std::enable_if<arg_helper<Dimension, Dims...>::value, Slice<true, Parent, SliceMixin, Dimension, Dimensions...>>::type
424 {
425  return ConstSliceType(copy_resize_construct_tag(), reinterpret_cast<ConstSliceType const&>(*this), spans...);
426 }
427 
428 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
429 template<typename... Dims>
430 typename std::enable_if<!arg_helper<Dimension, Dims...>::value, Slice<true, Parent, SliceMixin, Dimension, Dimensions...>>::type
432 {
433  return ConstSliceType(copy_resize_construct_tag(), reinterpret_cast<ConstSliceType const&>(*this), spans...);
434 }
435 
436 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
437 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::begin()
438 {
439  return iterator(*this);
440 }
441 
442 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
443 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::const_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::begin() const
444 {
445  return const_iterator(*this);
446 }
447 
448 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
449 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::const_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::cbegin() const
450 {
451  return const_iterator(*this);
452 }
453 
454 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
455 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::end()
456 {
457  return iterator::create_end(*this);
458 }
459 
460 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
461 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::const_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::end() const
462 {
463  return const_iterator::create_end(*this);
464 }
465 
466 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
467 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::const_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::cend() const
468 {
469  return const_iterator::create_end(*this);
470 }
471 
472 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
473 inline typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::Parent& Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::parent() const
474 {
475  return BaseT::parent();
476 }
477 
478 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
479 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_begin()
480 {
481  return impl_iterator(*this);
482 }
483 
484 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
485 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_const_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_begin() const
486 {
487  return impl_const_iterator(*this);
488 }
489 
490 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
491 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_const_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_cbegin() const
492 {
493  return impl_const_iterator(*this);
494 }
495 
496 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
497 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_end()
498 {
499  return impl_iterator::create_end(*this);
500 }
501 
502 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
503 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_const_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_end() const
504 {
505  return impl_const_iterator::create_end(*this);
506 }
507 
508 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
509 typename Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_const_iterator Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::impl_cend() const
510 {
511  return impl_const_iterator::create_end(*this);
512 }
513 
514 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
515 template<typename IteratorT>
517 {
518  if(!BaseT::increment_it(current, pos)) {
519  current -= BaseT::diff_base_span(); // return pointer to beginning of BaseT block
520  if(++pos.index < _span.span())
521  {
522  current += BaseT::_base_span; // move up to next block
523  return true;
524  }
525  // reset end to the end of a first chunk
526  pos.index=0;
527  return false;
528  }
529  return true;
530 }
531 
532 template<bool is_const, typename Parent, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
533 template<typename IteratorDifferenceT>
534 IteratorDifferenceT Slice<is_const, Parent, SliceMixin, Dimension, Dimensions...>::diff_it(IteratorDifferenceT const& diff) const
535 {
536  if(diff < (IteratorDifferenceT)BaseT::_base_span) {
537  return BaseT::diff_it(diff);
538  }
539  else {
540  return IteratorDifferenceT(diff/BaseT::_base_span) * BaseT::data_size() + BaseT::diff_it(diff%BaseT::_base_span);
541  }
542 }
543 
544 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension, typename... Dimensions>
545 template<bool const_type>
547 {
548  return s.data_size() == data_size()
549  && std::equal(s.cbegin(), s.cend(), cbegin());
550 }
551 
552 // -------------------- single dimension specialisation -------------------
553 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
555  : _span(d)
556  , _base_span(parent.template size<Dimension>())
557  , _parent(&parent)
558  , _ptr(parent.begin() + static_cast<std::size_t>(_span.start()))
559 {
560 }
561 
562 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
564  : _span(copy._span)
565  , _base_span(copy._base_span)
566  , _parent(copy._parent)
567  , _ptr(copy._ptr)
568 {
569 }
570 
571 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
572 template<typename... Dims>
574  , typename std::enable_if<arg_helper<Dimension, Dims...>::value, Parent&>::type parent
575  , DimensionSpan<Dims> const& ... spans)
576  : _span(arg_helper<DimensionSpan<Dimension> const&, DimensionSpan<Dims> const&...>::arg(spans...))
577  , _base_span(parent.template size<Dimension>())
578  , _parent(&parent)
579 {
580 }
581 
582 
583 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
584 template<typename... Dims>
586  , typename std::enable_if<!arg_helper<Dimension, Dims...>::value, Parent&>::type parent
587  , DimensionSpan<Dims> const& ...)
588  : _span(DimensionSpan<Dimension>(DimensionIndex<Dimension>(0), DimensionSize<Dimension>(parent.template size<Dimension>())))
589  , _base_span(parent.template size<Dimension>())
590  , _parent(&parent)
591 {
592 }
593 
594 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
595 template<typename... Dims>
597  , Slice const& copy
598  , DimensionSpan<Dims> const&...)
599  : _span(copy._span)
600  , _base_span(copy._base_span)
601  , _parent(copy._parent)
602 {
603 }
604 
605 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
606 template<typename... Dims>
608  , Slice const& copy
609  , DimensionSpan<Dims> const&... spans)
610  : _span(DimensionSpan<Dimension>(DimensionIndex<Dimension>(copy._span.start()
611  + arg_helper<DimensionSpan<Dimension> const&, DimensionSpan<Dims> const&...>::arg(spans...).start())
612  , arg_helper<DimensionSpan<Dimension> const&, DimensionSpan<Dims> const&...>::arg(spans...).span()))
613  , _base_span(copy._base_span)
614  , _parent(copy._parent)
615 {
616 }
617 
618 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
619 typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::parent_iterator const& Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::offset(parent_iterator const& it)
620 {
621  _ptr = it + static_cast<std::size_t>(_span.start());
622  return _ptr;
623 }
624 
625 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
627 {
628 }
629 
630 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
632 {
633  _span = copy._span;
634  _base_span = copy._base_span;
635  _parent = copy._parent;
636  _ptr = copy._ptr;
637  return *this;
638 }
639 
640 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
642 {
643  return _span.span();
644 }
645 
646 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
647 template<typename Dim>
648 typename std::enable_if<std::is_same<Dim, Dimension>::value, DimensionSize<Dimension>>::type Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::size() const
649 {
650  return _span.span();
651 }
652 
653 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
654 template<typename Dim>
655 typename std::enable_if<std::is_same<Dim, Dimension>::value, DimensionSize<Dimension>>::type Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::dimension() const
656 {
657  return _span.span();
658 }
659 
660 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
661 template<typename Dim>
662 constexpr
663 typename std::enable_if<((!std::is_same<Dim, Dimension>::value)
666 {
667  return DimensionSize<Dim>(0);
668 }
669 
670 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
671 template<typename Dim>
672 constexpr
673 typename std::enable_if<(!std::is_same<Dim, Dimension>::value)
676 {
677  return DimensionSize<Dim>(1);
678 }
679 
680 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
681 template<typename Dim>
682 constexpr
683 typename std::enable_if<((!std::is_same<Dim, Dimension>::value)
686 {
687  return DimensionSize<Dim>(0);
688 }
689 
690 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
691 template<typename Dim>
692 constexpr
693 typename std::enable_if<(!std::is_same<Dim, Dimension>::value)
696 {
697  return DimensionSize<Dim>(1);
698 }
699 
700 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
702 {
703  parent_iterator ptr = (_ptr + p);
704  return *ptr;
705 }
706 
707 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
709 {
710  return *(_ptr + static_cast<std::size_t>(p));
711 }
712 
713 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
715 {
716  Slice r(*this);
717  _ptr += static_cast<std::size_t>(_span.start());
718  r._span.start(_span.start() + DimensionSize<Dimension>(span.start()));
719  r._span.span(span.span());
720  return r;
721 }
722 
723 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
725 {
726  ConstSliceType r(*this);
727  _ptr += static_cast<std::size_t>(_span.start());
728  r._span.start(_span.start() + DimensionSize<Dimension>(span.start()));
729  r._span.span(span.span());
730  return r;
731 }
732 
733 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
735 {
736  return static_cast<std::size_t>(_span.span());
737 }
738 
739 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
741 {
742  return static_cast<std::size_t>(_span.span());
743 }
744 
745 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
747 {
748  return static_cast<std::size_t>(_span.span());
749 }
750 
751 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
752 typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::parent_iterator const& Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::base_ptr() const
753 {
754  return _ptr;
755 }
756 
757 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
758 typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::parent_iterator& Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::base_ptr()
759 {
760  return _ptr;
761 }
762 
763 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
765 {
766  _ptr += static_cast<std::size_t>(offset) * _base_span;
767  return *this;
768 }
769 
770 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
772 {
773  _ptr += offset * _base_span;
774  return *this;
775 }
776 
777 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
778 typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::parent_iterator Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::begin()
779 {
780  return _ptr;
781 }
782 
783 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
784 typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::parent_const_iterator Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::begin() const
785 {
786  return _ptr;
787 }
788 
789 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
790 typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::parent_const_iterator Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::cbegin() const
791 {
792  return _ptr;
793 }
794 
795 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
796 typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::parent_iterator Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::end()
797 {
798  return _ptr + static_cast<std::size_t>(_span.span());
799 }
800 
801 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
802 typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::parent_const_iterator Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::end() const
803 {
804  return _ptr + static_cast<std::size_t>(_span.span());
805 }
806 
807 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
808 typename Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::parent_const_iterator Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::cend() const
809 {
810  return _ptr + static_cast<std::size_t>(_span.span());
811 }
812 
813 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
815 {
816  return *_parent;
817 }
818 
819 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
820 template<typename IteratorT>
822 {
823  ++current;
824  if(++pos.index < _span.span())
825  {
826  return true;
827  }
828  pos.index=0;
829  return false;
830 }
831 
832 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
833 template<typename IteratorDifferenceT>
834 IteratorDifferenceT Slice<is_const, SliceTraitsT, SliceMixin, Dimension>::diff_it(IteratorDifferenceT const& diff)
835 {
836  return diff;
837 }
838 
839 template<bool is_const, typename SliceTraitsT, template<typename> class SliceMixin, typename Dimension>
840 template<bool is_const_>
842 {
843  return s.data_size() == data_size()
844  && std::equal(s.begin(), s.end(), begin());
845 }
846 
847 } // namespace astrotypes
848 } // namespace pss
Slice< is_const, SliceTraitsT, SliceMixin, Dim, Dimensions...>::ConstReducedSliceType type
Definition: Slice.cpp:128
iterator end()
iterator pointing to just after the last element
Definition: Slice.cpp:455
A tagged dimensionIndex variable.
iterator begin()
iterator pointing to the first element in the slice
Definition: Slice.cpp:437
bool operator==(Slice< const_type, SliceTraitsT, SliceMixin, Dimension, Dimensions...> const &) const
compare two arrays
Definition: Slice.cpp:546
Defines a contiguous range over dimension in index.
Definition: DimensionSpan.h:41
SliceMixin< Slice< is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...> > SliceType
Definition: Slice.h:133
parent_iterator const & offset(parent_iterator const &)
Definition: Slice.cpp:274
OperatorSliceTypeHelper< Dim, Slice< is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...> >::type type
Definition: Slice.cpp:87
ConstOperatorSliceTypeHelper< Dim, Slice >::type type
Definition: Slice.cpp:148
std::size_t contiguous_span() const
Definition: Slice.cpp:293
STL namespace.
OperatorSliceTypeHelper< Dim, Slice >::type type
Definition: Slice.cpp:141
SliceMixin< BaseT > ReducedSliceType
Definition: Slice.h:134
Representation of a Slice through a Data Array.
Definition: Slice.h:105
impl_iterator impl_begin()
iterator pointing to the first element in the slice
Definition: Slice.cpp:479
std::enable_if< std::is_same< Dim, Dimension >::value, DimensionSize< Dimension > >::type size() const
impl_const_iterator impl_cbegin() const
Definition: Slice.cpp:491
std::size_t diff_base_span() const
Definition: Slice.cpp:287
std::conditional< is_const, typename ConstOperatorSliceTypeHelper< Dim, Slice< is_const, SliceTraitsT, SliceMixin, Dim, Dimensions...> >::type, typename Slice< is_const, SliceTraitsT, SliceMixin, Dim, Dimensions...>::ReducedSliceType >::type type
Definition: Slice.cpp:112
ConstOperatorSliceTypeHelper< Dim, Slice< is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...> >::type type
Definition: Slice.cpp:94
DimensionSize< Dimension > & span()
Definition: DimensionSpan.h:52
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 ...
represents a point in an
Definition: SlicePosition.h:37
SelfType & operator+=(std::size_t n)
Definition: Slice.cpp:388
const_iterator cend() const
Definition: Slice.cpp:467
parent_iterator const & base_ptr() const
Definition: Slice.cpp:305
Parent & parent() const
return refernce to the parent object the Slice is based on
Definition: Slice.cpp:473
impl_const_iterator impl_cend() const
Definition: Slice.cpp:509
provides a template to determine the returned type of an operator[]
Definition: Slice.cpp:139
return true if the Dimensions provided match exactly those of the structure T (including order) ...
Definition: TypeTraits.h:107
A compile time dimesion tagging of size_t.
Definition: DimensionSize.h:39
impl_iterator impl_end()
iterator pointing to just after the last element
Definition: Slice.cpp:497
IteratorDifferenceT diff_it(IteratorDifferenceT const &diff) const
Definition: Slice.cpp:534
bool increment_it(IteratorT &current, SlicePosition< rank > &pos) const
Definition: Slice.cpp:516
std::size_t base_span() const
Definition: Slice.cpp:281
OperatorSliceType< Dimension >::type operator[](DimensionIndex< Dimension >)
Take a slice in the specified dimension with a span of 1.
Definition: Slice.cpp:350
std::size_t data_size() const
the total number of data members in this slice
Definition: Slice.cpp:311
DimensionIndex< Dimension > & start()
Definition: DimensionSpan.h:49
Slice< is_const, SliceTraitsT, SliceMixin, Dim >::reference_type type
Definition: Slice.cpp:117
SliceMixin< Slice< true, SliceTraitsT, SliceMixin, Dimension, Dimensions...> > ConstSliceType
Definition: Slice.h:135
std::conditional< is_const, const ParentT, ParentT >::type Parent
Definition: Slice.h:128
return true if the Dimension is represented in the structure
Definition: TypeTraits.h:71
friend class Slice
Definition: Slice.h:266
std::conditional< is_const, typename ConstOperatorSliceTypeHelper< Dim, Slice< is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...> >::type, SliceMixin< multiarray::ReducedRankSlice< Slice< is_const, SliceTraitsT, SliceMixin, Dimension, Dimensions...>, Dim > > >::type type
Definition: Slice.cpp:103
SliceMixin< multiarray::ReducedRankSlice< Slice< true, SliceTraitsT, SliceMixin, Dimension, Dimensions...>, Dim > > type
Definition: Slice.cpp:123
const_iterator cbegin() const
Definition: Slice.cpp:449
std::enable_if< std::is_same< Dim, Dimension >::value, DimensionSize< Dimension > >::type dimension() const