1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
#include "vtkDataArray.h"
#include "vtkArrayDispatch.h"
namespace
{
//----------------SetTuples (from array+range)----------------------------------
struct SetTuplesRangeWorker
{
vtkIdType SrcStartTuple;
vtkIdType DstStartTuple;
vtkIdType NumTuples;
SetTuplesRangeWorker(vtkIdType srcStartTuple, vtkIdType dstStartTuple, vtkIdType numTuples)
: SrcStartTuple(srcStartTuple)
, DstStartTuple(dstStartTuple)
, NumTuples(numTuples)
{
}
// Generic implementation. We perform the obvious optimizations for AOS/SOA
// in the derived class implementations.
template <typename SrcArrayT, typename DstArrayT>
void operator()(SrcArrayT* src, DstArrayT* dst) const
{
#define VTK_COPY_TUPLES(NUM_COMPONENTS) \
case NUM_COMPONENTS: \
{ \
const auto srcTuples = vtk::DataArrayTupleRange<NUM_COMPONENTS>( \
src, this->SrcStartTuple, this->SrcStartTuple + this->NumTuples); \
auto dstTuples = vtk::DataArrayTupleRange<NUM_COMPONENTS>( \
dst, this->DstStartTuple, this->DstStartTuple + this->NumTuples); \
std::copy(srcTuples.cbegin(), srcTuples.cend(), dstTuples.begin()); \
break; \
}
switch (src->GetNumberOfComponents())
{
VTK_COPY_TUPLES(1)
VTK_COPY_TUPLES(2)
VTK_COPY_TUPLES(3)
default:
VTK_COPY_TUPLES(vtk::detail::DynamicTupleSize)
}
#undef VTK_COPY_TUPLES
}
};
} // end anon namespace
VTK_ABI_NAMESPACE_BEGIN
//------------------------------------------------------------------------------
void vtkDataArray::InsertTuples(
vtkIdType dstStart, vtkIdType n, vtkIdType srcStart, vtkAbstractArray* src)
{
if (n == 0)
{
return;
}
if (src->GetNumberOfComponents() != this->GetNumberOfComponents())
{
vtkErrorMacro("Number of components do not match: Source: "
<< src->GetNumberOfComponents() << " Dest: " << this->GetNumberOfComponents());
return;
}
vtkDataArray* srcDA = vtkDataArray::FastDownCast(src);
if (!srcDA)
{
vtkErrorMacro("Source array must be a subclass of vtkDataArray. Got: " << src->GetClassName());
return;
}
vtkIdType maxSrcTupleId = srcStart + n - 1;
vtkIdType maxDstTupleId = dstStart + n - 1;
if (maxSrcTupleId >= src->GetNumberOfTuples())
{
vtkErrorMacro("Source array too small, requested tuple at index "
<< maxSrcTupleId << ", but there are only " << src->GetNumberOfTuples()
<< " tuples in the array.");
return;
}
vtkIdType newSize = (maxDstTupleId + 1) * this->NumberOfComponents;
if (this->Size < newSize)
{
if (!this->Resize(maxDstTupleId + 1))
{
vtkErrorMacro("Resize failed.");
return;
}
}
this->MaxId = std::max(this->MaxId, newSize - 1);
SetTuplesRangeWorker worker(srcStart, dstStart, n);
if (!vtkArrayDispatch::Dispatch2::Execute(srcDA, this, worker))
{
worker(srcDA, this);
}
}
VTK_ABI_NAMESPACE_END
|