diff --git a/include/cereal/details/helpers.hpp b/include/cereal/details/helpers.hpp index 8dafb8ec..aa9b7e3c 100644 --- a/include/cereal/details/helpers.hpp +++ b/include/cereal/details/helpers.hpp @@ -256,6 +256,8 @@ namespace cereal @internal */ DeferredData( T && v ) : value(std::forward(v)) {} + DeferredData(const DeferredData &) = default; + Type value; }; diff --git a/include/cereal/types/filesystem.hpp b/include/cereal/types/filesystem.hpp new file mode 100644 index 00000000..bc136c75 --- /dev/null +++ b/include/cereal/types/filesystem.hpp @@ -0,0 +1,62 @@ +/*! \file filesystem.hpp + \brief Support for types found in \ + \ingroup STLSupport */ +/* + Copyright (c) 2023, Francois Michaut + 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. +*/ + +#ifndef CEREAL_TYPES_FILESYSTEM_HPP_ +#define CEREAL_TYPES_FILESYSTEM_HPP_ + +#include "cereal/cereal.hpp" +#include "cereal/types/string.hpp" +#include + +namespace cereal +{ + //! Serialization for std::filesystem::path types, if binary data is supported + template inline + typename std::enable_if, Archive>::value, void>::type + CEREAL_SAVE_FUNCTION_NAME(Archive & ar, std::filesystem::path const & path) + { + // Save native path format + ar(path.native()); + } + + //! Serialization for std::filesystem::path types, if binary data is supported + template inline + typename std::enable_if, Archive>::value, void>::type + CEREAL_LOAD_FUNCTION_NAME(Archive & ar, std::filesystem::path & path) + { + // load native path string + std::filesystem::path::string_type str; + + ar(str); + path = std::move(str); + } +} // namespace cereal + +#endif // CEREAL_TYPES_FILESYSTEM_HPP_ diff --git a/include/cereal/types/tuple.hpp b/include/cereal/types/tuple.hpp index 80c68075..a4f8c651 100644 --- a/include/cereal/types/tuple.hpp +++ b/include/cereal/types/tuple.hpp @@ -95,7 +95,7 @@ namespace cereal template inline static void apply( Archive & ar, std::tuple & tuple ) { - serialize::template apply( ar, tuple ); + serialize::template apply<>( ar, tuple ); ar( CEREAL_NVP_(tuple_element_name::c_str(), std::get( tuple )) ); } @@ -116,7 +116,7 @@ namespace cereal template inline void CEREAL_SERIALIZE_FUNCTION_NAME( Archive & ar, std::tuple & tuple ) { - tuple_detail::serialize>::value>::template apply( ar, tuple ); + tuple_detail::serialize>::value>::template apply<>( ar, tuple ); } } // namespace cereal diff --git a/unittests/cpp17/filesystem.cpp b/unittests/cpp17/filesystem.cpp new file mode 100644 index 00000000..727c84b9 --- /dev/null +++ b/unittests/cpp17/filesystem.cpp @@ -0,0 +1,57 @@ +/* + Copyright (c) 2025, Francois Michaut + 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. +*/ + +#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN +#include "filesystem.hpp" + +#ifdef CEREAL_HAS_CPP17 + +TEST_SUITE_BEGIN("std_filesystem"); + +TEST_CASE("binary_std_filesystem") +{ + test_std_filesystem_path(); +} + +TEST_CASE("portable_binary_std_filesystem") +{ + test_std_filesystem_path(); +} + +TEST_CASE("xml_std_filesystem") +{ + test_std_filesystem_path(); +} + +TEST_CASE("json_std_filesystem") +{ + test_std_filesystem_path(); +} + +TEST_SUITE_END(); + +#endif // CEREAL_HAS_CPP17 diff --git a/unittests/cpp17/filesystem.hpp b/unittests/cpp17/filesystem.hpp new file mode 100644 index 00000000..cc152334 --- /dev/null +++ b/unittests/cpp17/filesystem.hpp @@ -0,0 +1,88 @@ +/* + Copyright (c) 2025, Francois Michaut + 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. +*/ + +#ifndef CEREAL_TEST_CPP17_FILESYSTEM_H_ +#define CEREAL_TEST_CPP17_FILESYSTEM_H_ +#include "../common.hpp" + +#ifdef CEREAL_HAS_CPP17 + +#include + +template inline +void test_std_filesystem_path() +{ + std::random_device rd; + std::mt19937 gen(rd()); + + using char_type = std::filesystem::path::value_type; + + for(size_t i=0; i<100; ++i) + { + + std::filesystem::path path_a = random_basic_string(gen); + std::filesystem::path path_b = random_basic_string(gen); + std::filesystem::path path_c = random_basic_string(gen); + + std::filesystem::path o_path1 = random_basic_string(gen); + std::filesystem::path o_path2 = ""; + std::filesystem::path o_path3; + std::filesystem::path o_long_path = path_a / path_b / path_c; + + std::ostringstream os; + { + OArchive oar(os); + oar(o_path1); + oar(o_path2); + oar(o_path3); + oar(o_long_path); + } + + std::filesystem::path i_path1; + std::filesystem::path i_path2; + std::filesystem::path i_path3; + std::filesystem::path i_long_path; + + std::istringstream is(os.str()); + { + IArchive iar(is); + + iar(i_path1); + iar(i_path2); + iar(i_path3); + iar(i_long_path); + } + + CHECK_EQ(i_path1, o_path1); + CHECK_EQ(i_path2, o_path2); + CHECK_EQ(i_path3, o_path3); + CHECK_EQ(i_long_path, o_long_path); + } +} + +#endif // CEREAL_HAS_CPP17 +#endif // CEREAL_TEST_CPP17_VARIANT_H_