VTK  9.5.20251009
vtkDataArrayValueRange_AOS.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
7#ifndef vtkDataArrayValueRange_AOS_h
8#define vtkDataArrayValueRange_AOS_h
9
11#include "vtkDataArrayMeta.h"
13#include "vtkDebugRangeIterators.h"
14
15#include <algorithm>
16#include <cassert>
17#include <iterator>
18#include <type_traits>
19
20// Disable this specialization when iterator debugging is requested:
21#ifndef VTK_DEBUG_RANGE_ITERATORS
22
24
25namespace vtk
26{
27namespace detail
28{
29VTK_ABI_NAMESPACE_BEGIN
30
31//------------------------------------------------------------------------------
32// ValueRange
33// For vtkAOSDataArrayTemplate, the `ForceValueTypeForVtkDataArray` template parameter is not used
34// at all.
35template <typename ValueTypeT, ComponentIdType TupleSize, typename ForceValueTypeForVtkDataArray>
36struct ValueRange<vtkAOSDataArrayTemplate<ValueTypeT>, TupleSize, ForceValueTypeForVtkDataArray>
37{
38private:
39 static_assert(IsValidTupleSize<TupleSize>::value, "Invalid tuple size.");
40
43
44public:
46 using ValueType = ValueTypeT;
47
52
53 // May be DynamicTupleSize, or the actual tuple size.
54 constexpr static ComponentIdType TupleSizeTag = TupleSize;
55
56 // STL-compat
63
65 ValueRange() noexcept = default;
66
68 ValueRange(ArrayType* arr, ValueIdType beginValue, ValueIdType endValue) noexcept
69 : Array(arr)
70 , NumComps(arr)
71 , BeginValue(beginValue)
72 , EndValue(endValue)
73 {
74 assert(this->Array);
75 assert(beginValue >= 0 && beginValue <= endValue);
76 assert(endValue >= 0 && endValue <= this->Array->GetNumberOfValues());
77 }
78
80 ValueRange GetSubRange(ValueIdType beginValue = 0, ValueIdType endValue = -1) const noexcept
81 {
82 const ValueIdType realBegin =
83 std::distance(this->Array->GetPointer(0), this->Array->GetPointer(this->BeginValue)) +
84 beginValue;
85 const ValueIdType realEnd = endValue >= 0
86 ? std::distance(this->Array->GetPointer(0), this->Array->GetPointer(this->BeginValue)) +
87 endValue
88 : std::distance(this->Array->GetPointer(0), this->Array->GetPointer(this->EndValue));
89
91 realEnd };
92 }
93
95 ArrayType* GetArray() const noexcept { return this->Array; }
96
98 ComponentIdType GetTupleSize() const noexcept { return this->NumComps.value; }
99
102 {
103 return static_cast<ValueIdType>(
104 this->Array->GetPointer(this->BeginValue) - this->Array->GetPointer(0));
105 }
106
108 ValueIdType GetEndValueId() const noexcept
109 {
110 return static_cast<ValueIdType>(
111 this->Array->GetPointer(this->EndValue) - this->Array->GetPointer(0));
112 }
113
115 size_type size() const noexcept
116 {
117 return static_cast<size_type>(
118 this->Array->GetPointer(this->EndValue) - this->Array->GetPointer(this->BeginValue));
119 }
120
122 iterator begin() noexcept { return this->Array->GetPointer(this->BeginValue); }
124 iterator end() noexcept { return this->Array->GetPointer(this->EndValue); }
125
127 const_iterator begin() const noexcept { return this->Array->GetPointer(this->BeginValue); }
129 const_iterator end() const noexcept { return this->Array->GetPointer(this->EndValue); }
130
132 const_iterator cbegin() const noexcept { return this->Array->GetPointer(this->BeginValue); }
134 const_iterator cend() const noexcept { return this->Array->GetPointer(this->EndValue); }
135
138 {
139 return this->Array->Buffer->GetBuffer()[this->BeginValue + i];
140 }
143 {
144 return this->Array->Buffer->GetBuffer()[this->BeginValue + i];
145 }
146
147 // Danger! pointer is non-const!
148 VTK_DEPRECATED_IN_9_6_0("Use iterators instead.")
149 value_type* data() noexcept { return this->Array->Buffer->GetBuffer(); }
150
151 VTK_DEPRECATED_IN_9_6_0("Use iterators instead.")
152 value_type* data() const noexcept { return this->Array->Buffer->GetBuffer(); }
153
154private:
155 mutable ArrayType* Array{ nullptr };
156 NumCompsType NumComps{};
157 ValueIdType BeginValue{ 0 };
158 ValueIdType EndValue{ 0 };
159};
160
161// Unimplemented, only used inside decltype in SelectValueRange:
162template <typename ArrayType, ComponentIdType TupleSize, typename ForceValueTypeForVtkDataArray,
163 // Convenience:
164 typename ValueType = typename ArrayType::ValueType,
165 typename AOSArrayType = vtkAOSDataArrayTemplate<ValueType>,
166 // SFINAE to select AOS arrays:
167 typename = typename std::enable_if<IsAOSDataArray<ArrayType>::value>::type>
169 ArrayType*);
170
171VTK_ABI_NAMESPACE_END
172}
173} // end namespace vtk::detail
174
176
177#endif // VTK_DEBUG_RANGE_ITERATORS
178#endif // vtkDataArrayValueRange_AOS_h
179
180// VTK-HeaderTest-Exclude: vtkDataArrayValueRange_AOS.h
Array-Of-Structs implementation of vtkGenericDataArray.
ValueRange< AOSArrayType, TupleSize, ForceValueTypeForVtkDataArray > DeclareValueRangeSpecialization(ArrayType *)
Specialization of tuple ranges and iterators for vtkAOSDataArrayTemplate.
vtkIdType ValueIdType
int ComponentIdType
VTK_ITER_INLINE ValueRange GetSubRange(ValueIdType beginValue=0, ValueIdType endValue=-1) const noexcept
static constexpr ComponentIdType TupleSizeTag
GetAPIType< ArrayType, ForceValueTypeForVtkDataArray > ValueType
ConstValueReference< ArrayType, TupleSize, ForceValueTypeForVtkDataArray > ConstReferenceType
ValueReference< ArrayType, TupleSize, ForceValueTypeForVtkDataArray > ReferenceType
ConstValueIterator< ArrayType, TupleSize, ForceValueTypeForVtkDataArray > ConstIteratorType
ValueIterator< ArrayType, TupleSize, ForceValueTypeForVtkDataArray > IteratorType
This file contains a variety of metaprogramming constructs for working with vtkDataArrays.
#define VTK_ITER_OPTIMIZE_START
#define VTK_ITER_INLINE
#define VTK_ITER_OPTIMIZE_END
#define VTK_DEPRECATED_IN_9_6_0(reason)