vtk-m/vtkm/cont/ArrayHandleIndex.h

130 lines
3.3 KiB
C
Raw Normal View History

2019-04-15 23:24:21 +00:00
//============================================================================
// 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.
2019-04-15 23:24:21 +00:00
//============================================================================
#ifndef vtk_m_cont_ArrayHandleIndex_h
#define vtk_m_cont_ArrayHandleIndex_h
#include <vtkm/cont/ArrayHandleImplicit.h>
2017-05-18 14:29:41 +00:00
namespace vtkm
{
namespace cont
{
struct VTKM_ALWAYS_EXPORT StorageTagIndex
{
};
namespace internal
2017-05-18 14:29:41 +00:00
{
2017-05-18 14:29:41 +00:00
struct VTKM_ALWAYS_EXPORT IndexFunctor
{
VTKM_EXEC_CONT
vtkm::Id operator()(vtkm::Id index) const { return index; }
};
using StorageTagIndexSuperclass =
typename vtkm::cont::ArrayHandleImplicit<IndexFunctor>::StorageTag;
template <>
struct Storage<vtkm::Id, vtkm::cont::StorageTagIndex> : Storage<vtkm::Id, StorageTagIndexSuperclass>
{
using Superclass = Storage<vtkm::Id, StorageTagIndexSuperclass>;
using Superclass::Superclass;
};
template <typename Device>
struct ArrayTransfer<vtkm::Id, vtkm::cont::StorageTagIndex, Device>
: ArrayTransfer<vtkm::Id, StorageTagIndexSuperclass, Device>
{
using Superclass = ArrayTransfer<vtkm::Id, StorageTagIndexSuperclass, Device>;
using Superclass::Superclass;
};
} // namespace internal
/// \brief An implicit array handle containing the its own indices.
///
/// \c ArrayHandleIndex is an implicit array handle containing the values
/// 0, 1, 2, 3,... to a specified size. Every value in the array is the same
/// as the index to that value.
///
class ArrayHandleIndex : public vtkm::cont::ArrayHandle<vtkm::Id, StorageTagIndex>
{
public:
2017-05-18 14:29:41 +00:00
VTKM_ARRAY_HANDLE_SUBCLASS_NT(ArrayHandleIndex,
(vtkm::cont::ArrayHandle<vtkm::Id, StorageTagIndex>));
VTKM_CONT
ArrayHandleIndex(vtkm::Id length)
: Superclass(typename Superclass::PortalConstControl(internal::IndexFunctor{}, length))
2017-05-18 14:29:41 +00:00
{
}
};
}
} // namespace vtkm::cont
2018-06-08 15:56:40 +00:00
//=============================================================================
// Specializations of serialization related classes
/// @cond SERIALIZATION
2018-06-08 15:56:40 +00:00
namespace vtkm
{
namespace cont
{
template <>
struct SerializableTypeString<vtkm::cont::ArrayHandleIndex>
2018-06-08 15:56:40 +00:00
{
static VTKM_CONT const std::string Get() { return "AH_Index"; }
2018-06-08 15:56:40 +00:00
};
template <>
struct SerializableTypeString<vtkm::cont::ArrayHandle<vtkm::Id, vtkm::cont::StorageTagIndex>>
: SerializableTypeString<vtkm::cont::ArrayHandleIndex>
2018-06-08 15:56:40 +00:00
{
};
}
} // vtkm::cont
namespace mangled_diy_namespace
2018-06-08 15:56:40 +00:00
{
template <>
struct Serialization<vtkm::cont::ArrayHandleIndex>
2018-06-08 15:56:40 +00:00
{
private:
using BaseType = vtkm::cont::ArrayHandle<vtkm::Id, vtkm::cont::StorageTagIndex>;
2018-06-08 15:56:40 +00:00
public:
static VTKM_CONT void save(BinaryBuffer& bb, const BaseType& obj)
{
vtkmdiy::save(bb, obj.GetNumberOfValues());
}
2018-06-08 15:56:40 +00:00
static VTKM_CONT void load(BinaryBuffer& bb, BaseType& obj)
{
vtkm::Id length = 0;
vtkmdiy::load(bb, length);
obj = vtkm::cont::ArrayHandleIndex(length);
}
2018-06-08 15:56:40 +00:00
};
2020-01-06 19:05:15 +00:00
template <>
struct Serialization<vtkm::cont::ArrayHandle<vtkm::Id, vtkm::cont::StorageTagIndex>>
: Serialization<vtkm::cont::ArrayHandleIndex>
{
};
2018-06-08 15:56:40 +00:00
} // diy
/// @endcond SERIALIZATION
2018-06-08 15:56:40 +00:00
#endif //vtk_m_cont_ArrayHandleIndex_h