//============================================================================ // 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_ArrayHandleVirtual_hxx #define vtk_m_cont_ArrayHandleVirtual_hxx #include #include namespace vtkm { namespace cont { template template ArrayHandleType inline ArrayHandleVirtual::CastToType( std::true_type vtkmNotUsed(valueTypesMatch), std::false_type vtkmNotUsed(notFromArrayHandleVirtual)) const { auto* storage = this->GetStorage().GetStorageVirtual(); if (!storage) { VTKM_LOG_CAST_FAIL(*this, ArrayHandleType); throwFailedDynamicCast("ArrayHandleVirtual", vtkm::cont::TypeToString()); } using S = typename ArrayHandleType::StorageTag; const auto* castStorage = storage->template Cast>(); return castStorage->GetHandle(); } } } // namespace vtkm::cont #include #include //============================================================================= // Specializations of serialization related classes namespace mangled_diy_namespace { template struct Serialization> { static VTKM_CONT void save(vtkmdiy::BinaryBuffer& bb, const vtkm::cont::ArrayHandleVirtual& obj) { vtkm::cont::internal::ArrayHandleDefaultSerialization(bb, obj); } static VTKM_CONT void load(BinaryBuffer& bb, vtkm::cont::ArrayHandleVirtual& obj) { vtkm::cont::ArrayHandle array; vtkmdiy::load(bb, array); obj = std::move(vtkm::cont::ArrayHandleVirtual{ array }); } }; template struct IntAnySerializer { using CountingType = vtkm::cont::ArrayHandleCounting; using ConstantType = vtkm::cont::ArrayHandleConstant; using BasicType = vtkm::cont::ArrayHandle; static VTKM_CONT void save(vtkmdiy::BinaryBuffer& bb, const vtkm::cont::ArrayHandleVirtual& obj) { if (obj.template IsType()) { vtkmdiy::save(bb, vtkm::cont::SerializableTypeString::Get()); using S = typename CountingType::StorageTag; const vtkm::cont::internal::detail::StorageVirtual* storage = obj.GetStorage().GetStorageVirtual(); auto* castStorage = storage->Cast>(); vtkmdiy::save(bb, castStorage->GetHandle()); } else if (obj.template IsType()) { vtkmdiy::save(bb, vtkm::cont::SerializableTypeString::Get()); using S = typename ConstantType::StorageTag; const vtkm::cont::internal::detail::StorageVirtual* storage = obj.GetStorage().GetStorageVirtual(); auto* castStorage = storage->Cast>(); vtkmdiy::save(bb, castStorage->GetHandle()); } else { vtkmdiy::save(bb, vtkm::cont::SerializableTypeString::Get()); vtkm::cont::internal::ArrayHandleDefaultSerialization(bb, obj); } } static VTKM_CONT void load(BinaryBuffer& bb, vtkm::cont::ArrayHandleVirtual& obj) { std::string typeString; vtkmdiy::load(bb, typeString); if (typeString == vtkm::cont::SerializableTypeString::Get()) { CountingType array; vtkmdiy::load(bb, array); obj = std::move(vtkm::cont::ArrayHandleVirtual{ array }); } else if (typeString == vtkm::cont::SerializableTypeString::Get()) { ConstantType array; vtkmdiy::load(bb, array); obj = std::move(vtkm::cont::ArrayHandleVirtual{ array }); } else { vtkm::cont::ArrayHandle array; vtkmdiy::load(bb, array); obj = std::move(vtkm::cont::ArrayHandleVirtual{ array }); } } }; template <> struct Serialization> : public IntAnySerializer { }; template <> struct Serialization> : public IntAnySerializer { }; template <> struct Serialization> : public IntAnySerializer { }; template struct Serialization> : public Serialization> { }; } // mangled_diy_namespace #endif