/*========================================================================= Program: Visualization Toolkit Module: vtkMultiProcessSerialization.h Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm 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. =========================================================================*/ /** * @file vtkMultiProcessStreamSerialization.h * @brief Utility to serialize STL containers to vtkMultiProcessStream * * This header provides helpers to make it easier to serialize STL containers * to vtkMultiProcessStream. * * Typical usage is as follows: * * @code{.cpp} * * std::set set_of_strings; * ... * vtkMultiProcessStream stream; * stream << set_of_strings; // save * * .... do communication ... * * vtkMultiProcessStream result; * stream >> result; // load * * ... * @endcode */ #ifndef vtkMultiProcessSerialization_h #define vtkMultiProcessSerialization_h #include "vtkMultiProcessStream.h" #include #include #include #include #include template struct Serialization { static void Save(vtkMultiProcessStream& stream, const T& t) { stream << t; } static void Load(vtkMultiProcessStream& stream, T& t) { stream >> t; } }; template struct Serialization> { static void Save(vtkMultiProcessStream& stream, const std::set& set) { stream << static_cast(set.size()); for (const auto& elem : set) { Serialization::Save(stream, elem); } } static void Load(vtkMultiProcessStream& stream, std::set& set) { vtkTypeInt64 count; stream >> count; for (vtkTypeInt64 cc = 0; cc < count; ++cc) { ElementType elem; Serialization::Load(stream, elem); set.insert(std::move(elem)); } } }; template struct Serialization> { static void Save(vtkMultiProcessStream& stream, const std::array& array) { for (const auto& elem : array) { Serialization::Save(stream, elem); } } static void Load(vtkMultiProcessStream& stream, std::array& array) { for (std::size_t cc = 0; cc < N; ++cc) { Serialization::Load(stream, array[cc]); } } }; template struct Serialization> { static void Save(vtkMultiProcessStream& stream, const std::pair& pair) { Serialization::Save(stream, pair.first); Serialization::Save(stream, pair.second); } static void Load(vtkMultiProcessStream& stream, std::pair& pair) { Serialization::Load(stream, pair.first); Serialization::Load(stream, pair.second); } }; template struct Serialization> { static void Save(vtkMultiProcessStream& stream, const std::map& map) { stream << static_cast(map.size()); for (const auto& pair : map) { Serialization>::Save(stream, pair); } } static void Load(vtkMultiProcessStream& stream, std::map& map) { vtkTypeInt64 count; stream >> count; for (vtkTypeInt64 cc = 0; cc < count; ++cc) { std::pair pair; Serialization>::Load(stream, pair); map.insert(std::move(pair)); } } }; template struct Serialization> { static void Save(vtkMultiProcessStream& stream, const std::vector& vector) { stream << static_cast(vector.size()); for (const auto& elem : vector) { Serialization::Save(stream, elem); } } static void Load(vtkMultiProcessStream& stream, std::vector& vector) { vtkTypeInt64 count; stream >> count; for (vtkTypeInt64 cc = 0; cc < count; ++cc) { ElementType elem; Serialization::Load(stream, elem); vector.push_back(std::move(elem)); } } }; template inline vtkMultiProcessStream& operator<<(vtkMultiProcessStream& stream, const T& value) { Serialization::Save(stream, value); return stream; } template inline vtkMultiProcessStream& operator>>(vtkMultiProcessStream& stream, T& value) { Serialization::Load(stream, value); return stream; } #endif // VTK-HeaderTest-Exclude: vtkMultiProcessStreamSerialization.h