//============================================================================ // 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_ArrayHandleVirtualCoordinates_h #define vtk_m_cont_ArrayHandleVirtualCoordinates_h #include #include #include #include #include #include #include #include namespace vtkm { namespace cont { /// ArrayHandleVirtualCoordinates is a specialization of ArrayHandle. class VTKM_ALWAYS_EXPORT ArrayHandleVirtualCoordinates final : public vtkm::cont::ArrayHandleVirtual { public: VTKM_ARRAY_HANDLE_SUBCLASS_NT(ArrayHandleVirtualCoordinates, (vtkm::cont::ArrayHandleVirtual)); template explicit ArrayHandleVirtualCoordinates(const vtkm::cont::ArrayHandle& ah) : vtkm::cont::ArrayHandleVirtual(vtkm::cont::make_ArrayHandleCast(ah)) { } }; template void CastAndCall(const vtkm::cont::ArrayHandleVirtualCoordinates& coords, Functor&& f, Args&&... args) { using HandleType = ArrayHandleUniformPointCoordinates; if (coords.IsType()) { HandleType uniform = coords.Cast(); f(uniform, std::forward(args)...); } else { f(coords, std::forward(args)...); } } template <> struct SerializableTypeString { static VTKM_CONT const std::string Get() { return "AH_VirtualCoordinates"; } }; } // namespace cont } // namespace vtkm //============================================================================= // Specializations of serialization related classes /// @cond SERIALIZATION namespace mangled_diy_namespace { template <> struct Serialization { private: using Type = vtkm::cont::ArrayHandleVirtualCoordinates; using BaseType = vtkm::cont::ArrayHandle; using BasicCoordsType = vtkm::cont::ArrayHandle; using RectilinearCoordsArrayType = vtkm::cont::ArrayHandleCartesianProduct, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle>; public: static VTKM_CONT void save(BinaryBuffer& bb, const BaseType& baseObj) { Type obj(baseObj); const vtkm::cont::internal::detail::StorageVirtual* storage = obj.GetStorage().GetStorageVirtual(); if (obj.IsType()) { using HandleType = vtkm::cont::ArrayHandleUniformPointCoordinates; using T = typename HandleType::ValueType; using S = typename HandleType::StorageTag; auto array = storage->Cast>(); vtkmdiy::save(bb, vtkm::cont::SerializableTypeString::Get()); vtkmdiy::save(bb, array->GetHandle()); } else if (obj.IsType()) { using HandleType = RectilinearCoordsArrayType; using T = typename HandleType::ValueType; using S = typename HandleType::StorageTag; auto array = storage->Cast>(); vtkmdiy::save(bb, vtkm::cont::SerializableTypeString::Get()); vtkmdiy::save(bb, array->GetHandle()); } else { vtkmdiy::save(bb, vtkm::cont::SerializableTypeString::Get()); vtkm::cont::internal::ArrayHandleDefaultSerialization(bb, obj); } } static VTKM_CONT void load(BinaryBuffer& bb, BaseType& obj) { std::string typeString; vtkmdiy::load(bb, typeString); if (typeString == vtkm::cont::SerializableTypeString::Get()) { vtkm::cont::ArrayHandleUniformPointCoordinates array; vtkmdiy::load(bb, array); obj = vtkm::cont::ArrayHandleVirtualCoordinates(array); } else if (typeString == vtkm::cont::SerializableTypeString::Get()) { RectilinearCoordsArrayType array; vtkmdiy::load(bb, array); obj = vtkm::cont::ArrayHandleVirtualCoordinates(array); } else if (typeString == vtkm::cont::SerializableTypeString::Get()) { BasicCoordsType array; vtkmdiy::load(bb, array); obj = vtkm::cont::ArrayHandleVirtualCoordinates(array); } else { throw vtkm::cont::ErrorBadType( "Error deserializing ArrayHandleVirtualCoordinates. TypeString: " + typeString); } } }; } // diy /// @endcond SERIALIZATION #endif // vtk_m_cont_ArrayHandleVirtualCoordinates_h