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 106 107 108 109 110 111
|
// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
// SPDX-License-Identifier: BSD-3-Clause
#ifndef vtkImplicitArray_txx
#define vtkImplicitArray_txx
#include "vtkImplicitArray.h"
#include "vtkAOSDataArrayTemplate.h"
#include "vtkLogger.h"
#include "vtkObjectFactory.h"
#include "vtkSmartPointer.h"
VTK_ABI_NAMESPACE_BEGIN
//-----------------------------------------------------------------------------
template <class BackendT>
struct vtkImplicitArray<BackendT>::vtkInternals
{
vtkSmartPointer<vtkAOSDataArrayTemplate<ValueType>> Cache;
};
//-----------------------------------------------------------------------------
template <class BackendT>
vtkImplicitArray<BackendT>* vtkImplicitArray<BackendT>::New()
{
VTK_STANDARD_NEW_BODY(vtkImplicitArray<BackendT>);
}
//-----------------------------------------------------------------------------
template <class BackendT>
vtkImplicitArray<BackendT>::vtkImplicitArray()
: Internals(new vtkInternals())
{
this->Initialize();
}
//-----------------------------------------------------------------------------
template <class BackendT>
vtkImplicitArray<BackendT>::~vtkImplicitArray() = default;
//-----------------------------------------------------------------------------
template <class BackendT>
void vtkImplicitArray<BackendT>::SetValue(vtkIdType vtkNotUsed(idx), ValueType vtkNotUsed(value))
{
}
//-----------------------------------------------------------------------------
template <class BackendT>
void vtkImplicitArray<BackendT>::SetTypedTuple(
vtkIdType vtkNotUsed(idx), const ValueType* vtkNotUsed(tuple))
{
}
//-----------------------------------------------------------------------------
template <class BackendT>
void vtkImplicitArray<BackendT>::SetTypedComponent(
vtkIdType vtkNotUsed(idx), int vtkNotUsed(comp), ValueType vtkNotUsed(value))
{
}
//-----------------------------------------------------------------------------
template <class BackendT>
void* vtkImplicitArray<BackendT>::GetVoidPointer(vtkIdType idx)
{
if (!this->Internals->Cache)
{
vtkLog(TRACE,
<< "Calling GetVoidPointer on a vtkImplicitArray allocates memory for an explicit copy.");
this->Internals->Cache = vtkSmartPointer<vtkAOSDataArrayTemplate<ValueType>>::New();
this->Internals->Cache->DeepCopy(this);
}
return this->Internals->Cache->GetVoidPointer(idx);
}
//-----------------------------------------------------------------------------
template <class BackendT>
void vtkImplicitArray<BackendT>::Squeeze()
{
this->Internals->Cache = nullptr;
}
//-----------------------------------------------------------------------------
template <class BackendT>
vtkImplicitArray<BackendT>* vtkImplicitArray<BackendT>::FastDownCast(vtkAbstractArray* source)
{
if (source)
{
switch (source->GetArrayType())
{
case vtkAbstractArray::ImplicitArray:
if (vtkDataTypesCompare(source->GetDataType(), vtkTypeTraits<ValueType>::VTK_TYPE_ID))
{
// In a perfect world, this part should do something like
//
// return static_cast<vtkImplicitArray<BackendT>*>(source);
//
// The problem here is that we do not know what type of backend to use and any pointer to
// an implicit array will down cast to any other pointer to an implicit array. Barring
// something better to do here, we use the SafeDownCast mechanism to ensure safety at the
// cost of performance.
return vtkImplicitArray<BackendT>::SafeDownCast(source);
}
break;
}
}
return nullptr;
}
VTK_ABI_NAMESPACE_END
#endif // vtkImplicitArray_txx
|