diff --git a/Parallel/DIY/vtkDIYUtilities.cxx b/Parallel/DIY/vtkDIYUtilities.cxx index c84a8a62bbbe5bfb39b924f87d3dd469fe43225b..952703964f5957e2647857483f7421fc7d22360e 100644 --- a/Parallel/DIY/vtkDIYUtilities.cxx +++ b/Parallel/DIY/vtkDIYUtilities.cxx @@ -45,40 +45,19 @@ struct SaveArrayWorker { } - template <class ArrayT> - void operator()(ArrayT* array) + template <typename ValueType> + void operator()(vtkAOSDataArrayTemplate<ValueType>* array) { - using ValueType = vtk::GetAPIType<ArrayT>; - ValueType* data(nullptr); - if (array->HasStandardMemoryLayout()) - { - // get the void pointer, this is OK for standard memory layout - data = static_cast<ValueType*>(array->GetVoidPointer(0)); - } - else - { - // create a temporary data array for saving. - data = new ValueType[array->GetNumberOfValues()]; - - const auto range = vtk::DataArrayTupleRange(array); - using ConstTupleRef = typename decltype(range)::ConstTupleReferenceType; - using ComponentType = typename decltype(range)::ComponentType; - - vtkIdType i(0); - for (ConstTupleRef tpl : range) - { - for (ComponentType comp : tpl) - { - data[i++] = comp; - } - } - assert(i == array->GetNumberOfValues()); - } + diy::save(this->BB, array->GetPointer(0), array->GetNumberOfValues()); + } - diy::save(this->BB, data, array->GetNumberOfValues()); - if (!array->HasStandardMemoryLayout()) + template <typename ArrayT> + void operator()(ArrayT* array) + { + switch (array->GetDataType()) { - delete[] data; + vtkTemplateMacro(vtkNew<vtkAOSDataArrayTemplate<VTK_TT>> aosArray; aosArray->DeepCopy(array); + this->operator()(aosArray.Get())); } }