From 6a6f4aef468feab7c13e42f6c8b9cdac1d686159 Mon Sep 17 00:00:00 2001 From: Keita Iwabuchi Date: Wed, 29 May 2024 08:29:46 +0900 Subject: [PATCH] Create cereal_boost_container.hpp (#209) Cereal Boost vector Co-authored-by: Keita Iwabuchi --- include/ygm/detail/cereal_boost_container.hpp | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 include/ygm/detail/cereal_boost_container.hpp diff --git a/include/ygm/detail/cereal_boost_container.hpp b/include/ygm/detail/cereal_boost_container.hpp new file mode 100644 index 00000000..f5dde3c5 --- /dev/null +++ b/include/ygm/detail/cereal_boost_container.hpp @@ -0,0 +1,125 @@ +// Copyright 2019-2024 Lawrence Livermore National Security, LLC and other YGM +// Project Developers. See the top-level COPYRIGHT file for details. +// +// SPDX-License-Identifier: MIT +// +// This file contains code from the Cereal library to make Boost Containers work +// with Cereal. +// +// From the original Cereal library: +// ----------------------------------------------------------------------------- +// Copyright (c) 2014, Randolph Voorhies, Shane Grant All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include + +#include + +namespace cereal { +//! Serialization for boost::container::vectors of arithmetic (but not bool) +//! using binary serialization, if supported +template +inline typename std::enable_if< + traits::is_output_serializable, Archive>::value && + std::is_arithmetic::value && !std::is_same::value, + void>::type +CEREAL_SAVE_FUNCTION_NAME(Archive& ar, + boost::container::vector const& vector) { + ar(make_size_tag( + static_cast(vector.size()))); // number of elements + ar(binary_data(vector.data(), vector.size() * sizeof(T))); +} + +//! Serialization for boost::container::vectors of arithmetic (but not bool) +//! using binary serialization, if supported +template +inline typename std::enable_if< + traits::is_input_serializable, Archive>::value && + std::is_arithmetic::value && !std::is_same::value, + void>::type +CEREAL_LOAD_FUNCTION_NAME(Archive& ar, boost::container::vector& vector) { + size_type vectorSize; + ar(make_size_tag(vectorSize)); + + vector.resize(static_cast(vectorSize)); + ar(binary_data(vector.data(), + static_cast(vectorSize) * sizeof(T))); +} + +//! Serialization for non-arithmetic vector types +template +inline typename std::enable_if< + (!traits::is_output_serializable, Archive>::value || + !std::is_arithmetic::value) && + !std::is_same::value, + void>::type +CEREAL_SAVE_FUNCTION_NAME(Archive& ar, + boost::container::vector const& vector) { + ar(make_size_tag( + static_cast(vector.size()))); // number of elements + for (auto&& v : vector) ar(v); +} + +//! Serialization for non-arithmetic vector types +template +inline typename std::enable_if< + (!traits::is_input_serializable, Archive>::value || + !std::is_arithmetic::value) && + !std::is_same::value, + void>::type +CEREAL_LOAD_FUNCTION_NAME(Archive& ar, boost::container::vector& vector) { + size_type size; + ar(make_size_tag(size)); + + vector.resize(static_cast(size)); + for (auto&& v : vector) ar(v); +} + +//! Serialization for bool vector types +template +inline void CEREAL_SAVE_FUNCTION_NAME( + Archive& ar, boost::container::vector const& vector) { + ar(make_size_tag( + static_cast(vector.size()))); // number of elements + for (const auto v : vector) ar(static_cast(v)); +} + +//! Serialization for bool vector types +template +inline void CEREAL_LOAD_FUNCTION_NAME( + Archive& ar, boost::container::vector& vector) { + size_type size; + ar(make_size_tag(size)); + + vector.resize(static_cast(size)); + for (auto&& v : vector) { + bool b; + ar(b); + v = b; + } +} +} // namespace cereal \ No newline at end of file