diff --git a/include/boost/core/serialization.hpp b/include/boost/core/serialization.hpp index 5111b38..9c78c58 100644 --- a/include/boost/core/serialization.hpp +++ b/include/boost/core/serialization.hpp @@ -111,6 +111,20 @@ template inline void split_member( A& a, T& t, unsigned int v detail::load_or_save_m< A::is_saving::value >()( a, t, v ); } +// load_construct_data_adl + +template void load_construct_data_adl( Ar& ar, T* t, unsigned int v ) +{ + load_construct_data( ar, t, serialization::core_version_type( v ) ); +} + +// save_construct_data_adl + +template void save_construct_data_adl( Ar& ar, T const* t, unsigned int v ) +{ + save_construct_data( ar, t, serialization::core_version_type( v ) ); +} + } // namespace core } // namespace boost diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 45d4294..ed7e059 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -36,6 +36,7 @@ set(BOOST_TEST_LINK_LIBRARIES Boost::core Boost::serialization) boost_test(TYPE run SOURCES serialization_nvp_test.cpp) boost_test(TYPE run SOURCES serialization_split_free_test.cpp) boost_test(TYPE run SOURCES serialization_split_member_test.cpp) +boost_test(TYPE run SOURCES serialization_construct_data_test.cpp) endif() diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 36b4133..956ee36 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -366,6 +366,7 @@ run size_test.cpp ; run serialization_nvp_test.cpp : : : /boost//serialization/off clang,norecover:no ; run serialization_split_free_test.cpp : : : /boost//serialization/off ; run serialization_split_member_test.cpp : : : /boost//serialization/off ; +run serialization_construct_data_test.cpp : : : /boost//serialization/off ; use-project /boost/core/swap : ./swap ; build-project ./swap ; diff --git a/test/serialization_construct_data_test.cpp b/test/serialization_construct_data_test.cpp new file mode 100644 index 0000000..c2a471e --- /dev/null +++ b/test/serialization_construct_data_test.cpp @@ -0,0 +1,100 @@ +// Copyright 2023 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#if defined(__clang__) && defined(__has_warning) +# if __has_warning( "-Wdeprecated-copy" ) +# pragma clang diagnostic ignored "-Wdeprecated-copy" +# endif +#endif + +#include +#include + +struct X +{ + int v_; + explicit X( int v ): v_( v ) {} + + template void serialize( Ar& /*ar*/, unsigned /*v*/ ) + { + } +}; + +template void save_construct_data( Ar& ar, X const* t, unsigned /*v*/ ) +{ + ar << t->v_; +} + +template void load_construct_data( Ar& ar, X* t, unsigned /*v*/ ) +{ + int v; + ar >> v; + + ::new( t ) X( v ); +} + +struct Y +{ + X data_[ 2 ]; + +private: + + friend class boost::serialization::access; + + template void load( Ar& ar, unsigned v ) + { + boost::core::load_construct_data_adl( ar, &data_[0], v ); + ar >> data_[0]; + + boost::core::load_construct_data_adl( ar, &data_[1], v ); + ar >> data_[1]; + } + + template void save( Ar& ar, unsigned v ) const + { + boost::core::save_construct_data_adl( ar, &data_[0], v ); + ar << data_[0]; + + boost::core::save_construct_data_adl( ar, &data_[1], v ); + ar << data_[1]; + } + + template void serialize( Ar& ar, unsigned v ) + { + boost::core::split_member( ar, *this, v ); + } +}; + +#include +#include +#include +#include +#include + +int main() +{ + std::ostringstream os; + + Y y1 = { X(7), X(11) }; + + { + boost::archive::text_oarchive ar( os ); + ar << y1; + } + + std::string s = os.str(); + + Y y2 = { X(0), X(0) }; + + { + std::istringstream is( s ); + boost::archive::text_iarchive ar( is ); + ar >> y2; + } + + BOOST_TEST_EQ( y1.data_[0].v_, y2.data_[0].v_ ); + BOOST_TEST_EQ( y1.data_[1].v_, y2.data_[1].v_ ); + + return boost::report_errors(); +}