Skip to content

vtk::DataArray[Tuple|Value]Range iterators

In a nutshell, there are two new types of iterators that can be used with vtkDataArrays: 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

Merge request reports