vtk::DataArray[Tuple|Value]Range iterators
In a nutshell, there are two new types of iterators that can be used with vtkDataArray
s: vtk::DataArrayTupleRange
and vtk::DataArrayValueRange
.
They can be use like so:
// TupleRange per component:
template <typename ArrayType>
auto ReadTupleRange(ArrayType *array) -> vtk::GetAPIType<ArrayType>
{
using APIType = typename vtk::GetAPIType<ArrayType>;
APIType sum{0};
for (const auto& tuple : vtk::DataArrayTupleRange(array))
{
for (APIType comp : tuple)
{
sum += comp;
}
}
return sum;
}
// TupleRange per tuple:
template <typename ArrayType>
auto ReadIterGetTuple(ArrayType *array) -> vtk::GetAPIType<ArrayType>
{
using APIType = typename vtk::GetAPIType<ArrayType>;
const auto range = vtk::DataArrayTupleRange(array);
std::array<APIType, static_cast<size_t>(NumComps)> data;
APIType sum{0};
for (const auto& tuple: range)
{
// Copy tuple into std::array if contiguous memory layout desired:
tuple.GetTuple(data.data());
for (const auto& comp : data)
{
sum += comp;
}
}
return sum;
}
// ValueRange:
template <typename ArrayType>
auto ReadValueRange(ArrayType *array) -> vtk::GetAPIType<ArrayType>
{
using APIType = typename vtk::GetAPIType<ArrayType>;
const auto range = vtk::DataArrayValueRange(array);
APIType sum{0};
for (const auto& value : range)
{
sum += value;
}
return sum;
}
These are also optimized when the number of components is passed in as a compile-time template parameter, eg.
// TupleRange with known tuple size:
template <vtk::ComponentIdType TupleSize, typename ArrayType>
auto ReadTupleRangeFixedSize(ArrayType *array) -> vtk::GetAPIType<ArrayType>
{
using APIType = typename vtk::GetAPIType<ArrayType>;
const auto range = vtk::DataArrayTupleRange<TupleSize>(array);
APIType sum{0};
for (const auto& tuple : range)
{
for (const auto& comp : tuple)
{
sum += comp;
}
}
return sum;
}
I have benchmarked, profiled, and tuned these so that they work as efficiently as the equivalent vtkDataArray
methods when given a vtkDataArray, or as efficiently as working with GetPointer
when given more derived array classes:
For Rob, here's the godbolt ;) https://godbolt.org/z/JhXjod
Edited by Allison Vacanti