improve(CompositeArr): remove dispatch from implementation

HTGFixUnlimitedToRoot
Julien Fausty 2022-11-18 11:38:12 +01:00
parent 139d236f13
commit 73b84ead94
2 changed files with 42 additions and 54 deletions

View File

@ -42,8 +42,8 @@
* CHECK(compositArr->GetValue(1) == 1);
* ```
*/
#include "vtkSmartPointer.h" // for internal variables
#include "vtkCommonImplicitArraysModule.h"
#include <memory>
VTK_ABI_NAMESPACE_BEGIN
class vtkDataArray;
@ -52,14 +52,13 @@ class vtkCompositeImplicitBackend
{
public:
vtkCompositeImplicitBackend(vtkDataArray* leftArr, vtkDataArray* rightArr);
~vtkCompositeImplicitBackend() = default;
~vtkCompositeImplicitBackend();
ValueType operator()(int idx) const;
protected:
vtkSmartPointer<vtkDataArray> Left = nullptr;
vtkSmartPointer<vtkDataArray> Right = nullptr;
int Offset = 0;
struct Internals;
std::unique_ptr<Internals> Internal;
};
VTK_ABI_NAMESPACE_END

View File

@ -17,66 +17,55 @@
#include "vtkArrayDispatch.h"
#include "vtkArrayDispatchImplicitArrayList.h"
#include "vtkDataArray.h"
//-----------------------------------------------------------------------
namespace
{
template <typename ValueType>
struct GetValueDispatch
{
template <typename ArrayT>
void operator()(ArrayT* arr, int& idx, ValueType& val) const
{
val = static_cast<ValueType>(arr->GetValue(idx));
}
};
}
#include "vtkDataArrayRange.h"
#include "vtkSmartPointer.h"
VTK_ABI_NAMESPACE_BEGIN
//-----------------------------------------------------------------------
template <typename ValueType>
struct vtkCompositeImplicitBackend<ValueType>::Internals
{
Internals(vtkDataArray* leftArr, vtkDataArray* rightArr)
: Left(leftArr)
, Right(rightArr)
{
if (this->Left == nullptr || this->Right == nullptr)
{
vtkWarningWithObjectMacro(nullptr, "Creating composite array with nullptr");
return;
}
this->LeftRange = vtk::DataArrayValueRange(this->Left);
this->RightRange = vtk::DataArrayValueRange(this->Right);
this->Offset = 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;
};
//-----------------------------------------------------------------------
template <typename ValueType>
vtkCompositeImplicitBackend<ValueType>::vtkCompositeImplicitBackend(
vtkDataArray* leftArr, vtkDataArray* rightArr)
: Left(leftArr)
, Right(rightArr)
: Internal(std::unique_ptr<Internals>(new Internals(leftArr, rightArr)))
{
}
//-----------------------------------------------------------------------
template <typename ValueType>
vtkCompositeImplicitBackend<ValueType>::~vtkCompositeImplicitBackend()
{
if (this->Left == nullptr || this->Right == nullptr)
{
vtkWarningWithObjectMacro(nullptr, "Creating composite array with nullptr");
return;
}
this->Offset = this->Left->GetDataSize();
}
//-----------------------------------------------------------------------
template <typename ValueType>
ValueType vtkCompositeImplicitBackend<ValueType>::operator()(int idx) const
{
int nxtIdx = idx;
vtkDataArray* branch;
if (idx < this->Offset)
{
branch = this->Left;
}
else
{
nxtIdx -= this->Offset;
branch = this->Right;
}
using DisArrays = vtkArrayDispatch::AllArrays;
using Dispatcher = vtkArrayDispatch::DispatchByArray<DisArrays>;
ValueType val;
::GetValueDispatch<ValueType> worklet;
if (!Dispatcher::Execute(branch, worklet, nxtIdx, val))
{
int iTup = nxtIdx / branch->GetNumberOfComponents();
int iComp = iTup * branch->GetNumberOfComponents() - nxtIdx;
val = static_cast<ValueType>(branch->GetComponent(iTup, iComp));
}
return val;
return static_cast<ValueType>((idx < this->Internal->Offset)
? this->Internal->LeftRange[idx]
: this->Internal->RightRange[idx - this->Internal->Offset]);
}
VTK_ABI_NAMESPACE_END