6d37ce9453
Several ArrayHandles (actuall Storage implementations) had a fake portal type that only defined invalid value types and no Get/Set methods. The idea was to quickly identify when using a read-only array for writing. However, this was more trouble than it was worth as the compiler just gives an incomprehensible error and it is hard to track down the actual value. Now actually define some type even if it is never used.
163 lines
4.7 KiB
C++
163 lines
4.7 KiB
C++
//============================================================================
|
|
// Copyright (c) Kitware, Inc.
|
|
// All rights reserved.
|
|
// See LICENSE.txt for details.
|
|
//
|
|
// This software is distributed WITHOUT ANY WARRANTY; without even
|
|
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
// PURPOSE. See the above copyright notice for more information.
|
|
//============================================================================
|
|
#ifndef vtk_m_cont_StorageImplicit
|
|
#define vtk_m_cont_StorageImplicit
|
|
|
|
#include <vtkm/Types.h>
|
|
|
|
#include <vtkm/cont/ArrayPortalToIterators.h>
|
|
#include <vtkm/cont/ErrorBadValue.h>
|
|
#include <vtkm/cont/Storage.h>
|
|
|
|
#include <vtkm/cont/internal/ArrayTransfer.h>
|
|
|
|
namespace vtkm
|
|
{
|
|
namespace cont
|
|
{
|
|
|
|
/// \brief An implementation for read-only implicit arrays.
|
|
///
|
|
/// It is sometimes the case that you want VTK-m to operate on an array of
|
|
/// implicit values. That is, rather than store the data in an actual array, it
|
|
/// is gerenated on the fly by a function. This is handled in VTK-m by creating
|
|
/// an ArrayHandle in VTK-m with a StorageTagImplicit type of \c Storage. This
|
|
/// tag itself is templated to specify an ArrayPortal that generates the
|
|
/// desired values. An ArrayHandle created with this tag will raise an error on
|
|
/// any operation that tries to modify it.
|
|
///
|
|
template <class ArrayPortalType>
|
|
struct VTKM_ALWAYS_EXPORT StorageTagImplicit
|
|
{
|
|
using PortalType = ArrayPortalType;
|
|
};
|
|
|
|
namespace internal
|
|
{
|
|
|
|
template <class ArrayPortalType>
|
|
class VTKM_ALWAYS_EXPORT
|
|
Storage<typename ArrayPortalType::ValueType, StorageTagImplicit<ArrayPortalType>>
|
|
{
|
|
using ClassType =
|
|
Storage<typename ArrayPortalType::ValueType, StorageTagImplicit<ArrayPortalType>>;
|
|
|
|
public:
|
|
using ValueType = typename ArrayPortalType::ValueType;
|
|
using PortalConstType = ArrayPortalType;
|
|
|
|
// Note that this portal is likely to be read-only, so you will probably get an error
|
|
// if you try to write to it.
|
|
using PortalType = ArrayPortalType;
|
|
|
|
VTKM_CONT
|
|
Storage(const PortalConstType& portal = PortalConstType())
|
|
: Portal(portal)
|
|
, NumberOfValues(portal.GetNumberOfValues())
|
|
{
|
|
}
|
|
|
|
VTKM_CONT Storage(const ClassType&) = default;
|
|
VTKM_CONT Storage(ClassType&&) = default;
|
|
VTKM_CONT ClassType& operator=(const ClassType&) = default;
|
|
VTKM_CONT ClassType& operator=(ClassType&&) = default;
|
|
|
|
// All these methods do nothing but raise errors.
|
|
VTKM_CONT
|
|
PortalType GetPortal() { throw vtkm::cont::ErrorBadValue("Implicit arrays are read-only."); }
|
|
VTKM_CONT
|
|
PortalConstType GetPortalConst() const { return this->Portal; }
|
|
VTKM_CONT
|
|
vtkm::Id GetNumberOfValues() const { return this->NumberOfValues; }
|
|
VTKM_CONT
|
|
void Allocate(vtkm::Id numberOfValues)
|
|
{
|
|
VTKM_ASSERT(numberOfValues <= this->Portal.GetNumberOfValues());
|
|
this->NumberOfValues = numberOfValues;
|
|
}
|
|
VTKM_CONT
|
|
void Shrink(vtkm::Id numberOfValues)
|
|
{
|
|
VTKM_ASSERT(numberOfValues <= this->Portal.GetNumberOfValues());
|
|
this->NumberOfValues = numberOfValues;
|
|
}
|
|
VTKM_CONT
|
|
void ReleaseResources() {}
|
|
|
|
private:
|
|
PortalConstType Portal;
|
|
vtkm::Id NumberOfValues;
|
|
};
|
|
|
|
template <typename T, class ArrayPortalType, class DeviceAdapterTag>
|
|
class ArrayTransfer<T, StorageTagImplicit<ArrayPortalType>, DeviceAdapterTag>
|
|
{
|
|
public:
|
|
using StorageTag = StorageTagImplicit<ArrayPortalType>;
|
|
using StorageType = vtkm::cont::internal::Storage<T, StorageTag>;
|
|
|
|
using ValueType = T;
|
|
|
|
using PortalControl = typename StorageType::PortalType;
|
|
using PortalConstControl = typename StorageType::PortalConstType;
|
|
using PortalExecution = PortalControl;
|
|
using PortalConstExecution = PortalConstControl;
|
|
|
|
VTKM_CONT
|
|
ArrayTransfer(StorageType* storage)
|
|
: Storage(storage)
|
|
{
|
|
}
|
|
|
|
VTKM_CONT
|
|
vtkm::Id GetNumberOfValues() const { return this->Storage->GetNumberOfValues(); }
|
|
|
|
VTKM_CONT
|
|
PortalConstExecution PrepareForInput(bool vtkmNotUsed(updateData))
|
|
{
|
|
return this->Storage->GetPortalConst();
|
|
}
|
|
|
|
VTKM_CONT
|
|
PortalExecution PrepareForInPlace(bool vtkmNotUsed(updateData))
|
|
{
|
|
throw vtkm::cont::ErrorBadValue("Implicit arrays cannot be used for output or in place.");
|
|
}
|
|
|
|
VTKM_CONT
|
|
PortalExecution PrepareForOutput(vtkm::Id vtkmNotUsed(numberOfValues))
|
|
{
|
|
throw vtkm::cont::ErrorBadValue("Implicit arrays cannot be used for output.");
|
|
}
|
|
VTKM_CONT
|
|
void RetrieveOutputData(StorageType* vtkmNotUsed(controlArray)) const
|
|
{
|
|
throw vtkm::cont::ErrorBadValue("Implicit arrays cannot be used for output.");
|
|
}
|
|
|
|
VTKM_CONT
|
|
void Shrink(vtkm::Id vtkmNotUsed(numberOfValues))
|
|
{
|
|
throw vtkm::cont::ErrorBadValue("Implicit arrays cannot be resized.");
|
|
}
|
|
|
|
VTKM_CONT
|
|
void ReleaseResources() {}
|
|
|
|
private:
|
|
StorageType* Storage;
|
|
};
|
|
|
|
} // namespace internal
|
|
}
|
|
} // namespace vtkm::cont
|
|
|
|
#endif //vtk_m_cont_StorageImplicit
|