VTK  9.1.0
vtkDataArrayValueRange_AOS.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkDataArrayValueRange_AOS.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
19 #ifndef vtkDataArrayValueRange_AOS_h
20 #define vtkDataArrayValueRange_AOS_h
21 
23 #include "vtkDataArrayMeta.h"
25 #include "vtkDebugRangeIterators.h"
26 
27 #include <algorithm>
28 #include <cassert>
29 #include <iterator>
30 #include <type_traits>
31 
32 #ifndef __VTK_WRAP__
33 
34 // Disable this specialization when iterator debugging is requested:
35 #ifndef VTK_DEBUG_RANGE_ITERATORS
36 
38 
39 namespace vtk
40 {
41 
42 namespace detail
43 {
44 
45 //------------------------------------------------------------------------------
46 // ValueRange
47 template <typename ValueTypeT, ComponentIdType TupleSize>
48 struct ValueRange<vtkAOSDataArrayTemplate<ValueTypeT>, TupleSize>
49 {
50 private:
51  static_assert(IsValidTupleSize<TupleSize>::value, "Invalid tuple size.");
52 
55 
56 public:
58  using ValueType = ValueTypeT;
59 
61  using ConstIteratorType = ValueType const*;
63  using ConstReferenceType = ValueType const&;
64 
65  // May be DynamicTupleSize, or the actual tuple size.
66  constexpr static ComponentIdType TupleSizeTag = TupleSize;
67 
68  // STL-compat
75 
77  ValueRange() noexcept = default;
78 
80  ValueRange(ArrayType* arr, ValueIdType beginValue, ValueIdType endValue) noexcept
81  : Array(arr)
82  , NumComps(arr)
83  , Begin(arr->GetPointer(beginValue))
84  , End(arr->GetPointer(endValue))
85  {
86  assert(this->Array);
87  assert(beginValue >= 0 && beginValue <= endValue);
88  assert(endValue >= 0 && endValue <= this->Array->GetNumberOfValues());
89  }
90 
92  ValueRange GetSubRange(ValueIdType beginValue = 0, ValueIdType endValue = -1) const noexcept
93  {
94  const ValueIdType realBegin =
95  std::distance(this->Array->GetPointer(0), this->Begin) + beginValue;
96  const ValueIdType realEnd = endValue >= 0
97  ? std::distance(this->Array->GetPointer(0), this->Begin) + endValue
98  : std::distance(this->Array->GetPointer(0), this->End);
99 
100  return ValueRange{ this->Array, realBegin, realEnd };
101  }
102 
104  ArrayType* GetArray() const noexcept { return this->Array; }
105 
107  ComponentIdType GetTupleSize() const noexcept { return this->NumComps.value; }
108 
110  ValueIdType GetBeginValueId() const noexcept
111  {
112  return static_cast<ValueIdType>(this->Begin - this->Array->GetPointer(0));
113  }
114 
116  ValueIdType GetEndValueId() const noexcept
117  {
118  return static_cast<ValueIdType>(this->End - this->Array->GetPointer(0));
119  }
120 
122  size_type size() const noexcept { return static_cast<size_type>(this->End - this->Begin); }
123 
125  iterator begin() noexcept { return this->Begin; }
127  iterator end() noexcept { return this->End; }
128 
130  const_iterator begin() const noexcept { return this->Begin; }
132  const_iterator end() const noexcept { return this->End; }
133 
135  const_iterator cbegin() const noexcept { return this->Begin; }
137  const_iterator cend() const noexcept { return this->End; }
138 
140  reference operator[](size_type i) noexcept { return this->Begin[i]; }
142  const_reference operator[](size_type i) const noexcept { return this->Begin[i]; }
143 
144 private:
145  mutable ArrayType* Array{ nullptr };
146  NumCompsType NumComps{};
147  ValueType* Begin{ nullptr };
148  ValueType* End{ nullptr };
149 };
150 
151 // Unimplemented, only used inside decltype in SelectValueRange:
152 template <typename ArrayType, ComponentIdType TupleSize,
153  // Convenience:
154  typename ValueType = typename ArrayType::ValueType,
155  typename AOSArrayType = vtkAOSDataArrayTemplate<ValueType>,
156  // SFINAE to select AOS arrays:
159 
160 }
161 } // end namespace vtk::detail
162 
164 
165 #endif // VTK_DEBUG_RANGE_ITERATORS
166 #endif // __VTK_WRAP__
167 #endif // vtkDataArrayValueRange_AOS_h
168 
169 // VTK-HeaderTest-Exclude: vtkDataArrayValueRange_AOS.h
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::GetArray
VTK_ITER_INLINE ArrayType * GetArray() const noexcept
Definition: vtkDataArrayValueRange_AOS.h:104
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::GetSubRange
VTK_ITER_INLINE ValueRange GetSubRange(ValueIdType beginValue=0, ValueIdType endValue=-1) const noexcept
Definition: vtkDataArrayValueRange_AOS.h:92
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::cbegin
VTK_ITER_INLINE const_iterator cbegin() const noexcept
Definition: vtkDataArrayValueRange_AOS.h:135
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::size
VTK_ITER_INLINE size_type size() const noexcept
Definition: vtkDataArrayValueRange_AOS.h:122
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::const_iterator
ConstIteratorType const_iterator
Definition: vtkDataArrayValueRange_AOS.h:72
vtkDataArrayValueRange_Generic.h
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::ConstIteratorType
ValueType const * ConstIteratorType
Definition: vtkDataArrayValueRange_AOS.h:61
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::ConstReferenceType
ValueType const & ConstReferenceType
Definition: vtkDataArrayValueRange_AOS.h:63
vtkX3D::value
@ value
Definition: vtkX3D.h:226
vtkX3D::type
@ type
Definition: vtkX3D.h:522
VTK_ITER_OPTIMIZE_START
#define VTK_ITER_OPTIMIZE_START
Definition: vtkDataArrayMeta.h:54
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::end
VTK_ITER_INLINE iterator end() noexcept
Definition: vtkDataArrayValueRange_AOS.h:127
vtk::detail::ValueRange::ArrayType
ArrayTypeT ArrayType
Definition: vtkDataArrayValueRange_Generic.h:850
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::size_type
ValueIdType size_type
Definition: vtkDataArrayValueRange_AOS.h:70
vtk::ValueIdType
vtkIdType ValueIdType
Definition: vtkDataArrayMeta.h:70
vtkAOSDataArrayTemplate.h
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::const_reference
ConstReferenceType const_reference
Definition: vtkDataArrayValueRange_AOS.h:74
detail
Definition: vtkGenericDataArrayLookupHelper.h:33
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::GetTupleSize
VTK_ITER_INLINE ComponentIdType GetTupleSize() const noexcept
Definition: vtkDataArrayValueRange_AOS.h:107
vtk::ComponentIdType
int ComponentIdType
Definition: vtkDataArrayMeta.h:68
vtk::detail::ValueRange::IteratorType
ValueIterator< ArrayType, TupleSize > IteratorType
Definition: vtkDataArrayValueRange_Generic.h:853
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::begin
VTK_ITER_INLINE iterator begin() noexcept
Definition: vtkDataArrayValueRange_AOS.h:125
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::ReferenceType
ValueType & ReferenceType
Definition: vtkDataArrayValueRange_AOS.h:62
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::begin
VTK_ITER_INLINE const_iterator begin() const noexcept
Definition: vtkDataArrayValueRange_AOS.h:130
vtk::detail::ValueRange
Definition: vtkDataArrayValueRange_Generic.h:841
vtk::detail::IdStorage
Definition: vtkDataArrayValueRange_Generic.h:64
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::operator[]
VTK_ITER_INLINE reference operator[](size_type i) noexcept
Definition: vtkDataArrayValueRange_AOS.h:140
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::GetEndValueId
VTK_ITER_INLINE ValueIdType GetEndValueId() const noexcept
Definition: vtkDataArrayValueRange_AOS.h:116
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::operator[]
VTK_ITER_INLINE const_reference operator[](size_type i) const noexcept
Definition: vtkDataArrayValueRange_AOS.h:142
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::ValueType
ValueTypeT ValueType
Definition: vtkDataArrayValueRange_AOS.h:58
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::ValueRange
VTK_ITER_INLINE ValueRange() noexcept=default
vtk::detail::ValueRange::TupleSizeTag
constexpr static ComponentIdType TupleSizeTag
Definition: vtkDataArrayValueRange_Generic.h:859
VTK_ITER_OPTIMIZE_END
#define VTK_ITER_OPTIMIZE_END
Definition: vtkDataArrayMeta.h:55
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::iterator
IteratorType iterator
Definition: vtkDataArrayValueRange_AOS.h:71
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::end
VTK_ITER_INLINE const_iterator end() const noexcept
Definition: vtkDataArrayValueRange_AOS.h:132
vtk::detail::ValueRange::ConstReferenceType
ConstValueReference< ArrayType, TupleSize > ConstReferenceType
Definition: vtkDataArrayValueRange_Generic.h:856
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::GetBeginValueId
VTK_ITER_INLINE ValueIdType GetBeginValueId() const noexcept
Definition: vtkDataArrayValueRange_AOS.h:110
vtk::detail::ValueRange::ConstIteratorType
ConstValueIterator< ArrayType, TupleSize > ConstIteratorType
Definition: vtkDataArrayValueRange_Generic.h:854
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::cend
VTK_ITER_INLINE const_iterator cend() const noexcept
Definition: vtkDataArrayValueRange_AOS.h:137
vtk
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
Definition: vtkSMPThreadLocalAPI.h:42
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::value_type
ValueType value_type
Definition: vtkDataArrayValueRange_AOS.h:69
vtk::detail::IsValidTupleSize
Definition: vtkDataArrayMeta.h:93
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::reference
ReferenceType reference
Definition: vtkDataArrayValueRange_AOS.h:73
vtk::detail::ValueRange::ValueType
GetAPIType< ArrayTypeT > ValueType
Definition: vtkDataArrayValueRange_Generic.h:851
vtk::detail::ValueRange::ReferenceType
ValueReference< ArrayType, TupleSize > ReferenceType
Definition: vtkDataArrayValueRange_Generic.h:855
vtkAOSDataArrayTemplate
Array-Of-Structs implementation of vtkGenericDataArray.
Definition: vtkAOSDataArrayTemplate.h:45
vtkDataArrayMeta.h
This file contains a variety of metaprogramming constructs for working with vtkDataArrays.
VTK_ITER_INLINE
#define VTK_ITER_INLINE
Definition: vtkDataArrayMeta.h:52
vtk::detail::ValueRange< vtkAOSDataArrayTemplate< ValueTypeT >, TupleSize >::IteratorType
ValueType * IteratorType
Definition: vtkDataArrayValueRange_AOS.h:60
vtk::detail::GenericTupleSize
Definition: vtkDataArrayMeta.h:138
vtk::detail::DeclareValueRangeSpecialization
ValueRange< AOSArrayType, TupleSize > DeclareValueRangeSpecialization(ArrayType *)