@ -26,41 +26,37 @@ VTK_ABI_NAMESPACE_BEGIN
template <typename ValueType>
struct vtkCompositeImplicitBackend<ValueType>::Internals
{
Internals(vtkDataArray* leftArr, vtkDataArray* rightArr)
: Left(leftArr)
, Right(rightArr)
template <class Iterator>
Internals(Iterator first, Iterator last)
{
if (!this->Left && !this->Right)
this->Arrays.assign(first, last);
if (this->Arrays.size() > 0)
{
vtkWarningWithObjectMacro(nullptr, "Creating composite array with two nullptrs");
this->Ranges.resize(this->Arrays.size());
std::transform(first, last, this->Ranges.begin(),
[](vtkDataArray* arr) { return vtk::DataArrayValueRange(arr); });
this->Offsets.resize(this->Arrays.size() - 1);
std::size_t runningSum = 0;
std::transform(this->Ranges.begin(), this->Ranges.end() - 1, this->Offsets.begin(),
[&runningSum](vtk::detail::SelectValueRange<vtkDataArray*,
vtk::detail::DynamicTupleSize>::type& range) {
runningSum += range.size();
return runningSum;
});
}
auto checkNullRectify = [](vtkSmartPointer<vtkDataArray>& arr) {
if (!arr)
{
arr = vtkSmartPointer<vtkAOSDataArrayTemplate<ValueType>>::New();
arr->SetNumberOfComponents(1);
arr->SetNumberOfTuples(0);
}
};
checkNullRectify(this->Left);
checkNullRectify(this->Right);
this->LeftRange = vtk::DataArrayValueRange(this->Left);
this->RightRange = vtk::DataArrayValueRange(this->Right);
this->Offset = this->LeftRange.size();
}
vtkSmartPointer<vtkDataArray> Left;
vtk::detail::SelectValueRange<vtkDataArray*, vtk::detail::DynamicTupleSize>::type LeftRange;
vtkSmartPointer<vtkDataArray> Right;
vtk::detail::SelectValueRange<vtkDataArray*, vtk::detail::DynamicTupleSize>::type RightRange;
int Offset = -1;
std::vector<vtkSmartPointer<vtkDataArray>> Arrays;
std::vector<vtk::detail::SelectValueRange<vtkDataArray*, vtk::detail::DynamicTupleSize>::type>
Ranges;
std::vector<std::size_t> Offsets;
};
//-----------------------------------------------------------------------
template <typename ValueType>
vtkCompositeImplicitBackend<ValueType>::vtkCompositeImplicitBackend(
vtkDataArray* leftArr, vtkDataArray* rightArr )
: Internal(std::unique_ptr<Internals>(new Internals(leftArr, rightArr )))
const std::vector<vtkDataArray*>& arrays)
: Internal(std::unique_ptr<Internals>(new Internals(arrays.begin(), arrays.end())))
{
}
@ -72,8 +68,9 @@ vtkCompositeImplicitBackend<ValueType>::~vtkCompositeImplicitBackend() = default
template <typename ValueType>
ValueType vtkCompositeImplicitBackend<ValueType>::operator()(int idx) const
{
return static_cast<ValueType>((idx < this->Internal->Offset)
? this->Internal->LeftRange[idx]
: this->Internal->RightRange[idx - this->Internal->Offset]);
auto itPos =
std::upper_bound(this->Internal->Offsets.begin(), this->Internal->Offsets.end(), idx);
int locIdx = itPos == this->Internal->Offsets.begin() ? idx : idx - *(itPos - 1);
return this->Internal->Ranges[std::distance(this->Internal->Offsets.begin(), itPos)][locIdx];
}
VTK_ABI_NAMESPACE_END