diff --git a/include/boost/mpi/datatype.hpp b/include/boost/mpi/datatype.hpp index c23b051..517126b 100644 --- a/include/boost/mpi/datatype.hpp +++ b/include/boost/mpi/datatype.hpp @@ -339,8 +339,8 @@ BOOST_MPI_DATATYPE(boost::archive::class_id_optional_type, get_mpi_datatype(int_ BOOST_MPI_DATATYPE(boost::archive::object_id_type, get_mpi_datatype(uint_least32_t()), integer); BOOST_MPI_DATATYPE(boost::archive::object_reference_type, get_mpi_datatype(uint_least32_t()), integer); BOOST_MPI_DATATYPE(boost::archive::tracking_type, get_mpi_datatype(bool()), builtin); -BOOST_MPI_DATATYPE(boost::serialization::collection_size_type, get_mpi_datatype(std::size_t()), builtin); -BOOST_MPI_DATATYPE(boost::serialization::item_version_type, get_mpi_datatype(uint_least8_t()), builtin); +BOOST_MPI_DATATYPE(boost::serialization::collection_size_type, get_mpi_datatype(std::size_t()), integer); +BOOST_MPI_DATATYPE(boost::serialization::item_version_type, get_mpi_datatype(uint_least8_t()), integer); #endif // Doxygen diff --git a/include/boost/mpi/datatype_fwd.hpp b/include/boost/mpi/datatype_fwd.hpp index 20dedb5..3a5f941 100644 --- a/include/boost/mpi/datatype_fwd.hpp +++ b/include/boost/mpi/datatype_fwd.hpp @@ -25,7 +25,9 @@ template struct is_mpi_logical_datatype; template struct is_mpi_complex_datatype; template struct is_mpi_byte_datatype; template struct is_mpi_datatype; -template MPI_Datatype get_mpi_datatype(const T& x = T()); +template MPI_Datatype get_mpi_datatype(const T& x); +template MPI_Datatype get_mpi_datatype() + { return get_mpi_datatype(T());} /// a dummy data type giving MPI_PACKED as its MPI_Datatype struct packed {}; diff --git a/include/boost/mpi/packed_iarchive.hpp b/include/boost/mpi/packed_iarchive.hpp index 6b49def..d8b4376 100644 --- a/include/boost/mpi/packed_iarchive.hpp +++ b/include/boost/mpi/packed_iarchive.hpp @@ -20,10 +20,13 @@ #include #include -#include +#include #include #include #include +#include +#include +#include #include namespace boost { namespace mpi { @@ -44,7 +47,7 @@ namespace boost { namespace mpi { */ class BOOST_MPI_DECL packed_iarchive : public iprimitive - , public archive::basic_binary_iarchive + , public archive::detail::common_iarchive , public archive::detail::shared_ptr_helper { public: @@ -67,7 +70,7 @@ public: */ packed_iarchive(MPI_Comm const & comm, buffer_type & b, unsigned int flags = boost::archive::no_header, int position = 0) : iprimitive(b,comm,position), - archive::basic_binary_iarchive(flags) + archive::detail::common_iarchive(flags) {} /** @@ -87,7 +90,7 @@ public: ( MPI_Comm const & comm , std::size_t s=0, unsigned int flags = boost::archive::no_header) : iprimitive(internal_buffer_,comm) - , archive::basic_binary_iarchive(flags) + , archive::detail::common_iarchive(flags) , internal_buffer_(s) {} @@ -95,7 +98,7 @@ public: template void load_override(T& x, int version, mpl::false_) { - archive::basic_binary_iarchive::load_override(x,version); + archive::detail::common_iarchive::load_override(x,version); } // Load it directly using the primnivites @@ -115,6 +118,16 @@ public: load_override(x, version, use_optimized()); } + void load_override(archive::class_name_type & t, int) + { + std::string cn; + cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE); + * this->This() >> cn; + std::memcpy(t, cn.data(), cn.size()); + // borland tweak + t.t[cn.size()] = '\0'; + } + private: /// An internal buffer to be used when the user does not supply his /// own buffer. diff --git a/include/boost/mpi/packed_oarchive.hpp b/include/boost/mpi/packed_oarchive.hpp index 274b1f0..c873bb4 100644 --- a/include/boost/mpi/packed_oarchive.hpp +++ b/include/boost/mpi/packed_oarchive.hpp @@ -20,9 +20,12 @@ #include #include -#include +#include #include #include +#include +#include +#include namespace boost { namespace mpi { @@ -43,7 +46,7 @@ namespace boost { namespace mpi { class BOOST_MPI_DECL packed_oarchive : public oprimitive, - public archive::basic_binary_oarchive + public archive::detail::common_oarchive { public: /** @@ -62,7 +65,7 @@ public: */ packed_oarchive( MPI_Comm const & comm, buffer_type & b, unsigned int flags = boost::archive::no_header) : oprimitive(b,comm), - archive::basic_binary_oarchive(flags) + archive::detail::common_oarchive(flags) {} /** @@ -78,14 +81,14 @@ public: */ packed_oarchive ( MPI_Comm const & comm, unsigned int flags = boost::archive::no_header) : oprimitive(internal_buffer_,comm), - archive::basic_binary_oarchive(flags) + archive::detail::common_oarchive(flags) {} // Save everything else in the usual way, forwarding on to the Base class template void save_override(T const& x, int version, mpl::false_) { - archive::basic_binary_oarchive::save_override(x,version); + archive::detail::common_oarchive::save_override(x,version); } // Save it directly using the primnivites @@ -103,6 +106,12 @@ public: save_override(x, version, use_optimized()); } + // explicitly convert to char * to avoid compile ambiguities + void save_override(const archive::class_name_type & t, int){ + const std::string s(t); + * this->This() << s; + } + private: /// An internal buffer to be used when the user does not supply his /// own buffer. diff --git a/src/packed_iarchive.cpp b/src/packed_iarchive.cpp index 4fceb73..a0ea5a6 100644 --- a/src/packed_iarchive.cpp +++ b/src/packed_iarchive.cpp @@ -11,15 +11,11 @@ #include #include -#include -#include -#include namespace boost { namespace archive { // explicitly instantiate all required templates -template class basic_binary_iarchive ; template class detail::archive_serializer_map ; } } // end namespace boost::archive diff --git a/src/packed_oarchive.cpp b/src/packed_oarchive.cpp index 4f5ad28..d340a40 100644 --- a/src/packed_oarchive.cpp +++ b/src/packed_oarchive.cpp @@ -8,17 +8,12 @@ #define BOOST_ARCHIVE_SOURCE #include - #include #include -#include -#include -#include namespace boost { namespace archive { // explicitly instantiate all required templates template class detail::archive_serializer_map ; -template class basic_binary_oarchive ; } } // end namespace boost::archive diff --git a/src/packed_skeleton_iarchive.cpp b/src/packed_skeleton_iarchive.cpp index 99b7d04..97115c2 100644 --- a/src/packed_skeleton_iarchive.cpp +++ b/src/packed_skeleton_iarchive.cpp @@ -10,22 +10,16 @@ #include #include - #include -#include -#include -#include - namespace boost { namespace archive { // explicitly instantiate all required templates -template class basic_binary_iarchive ; +// template class basic_binary_iarchive ; template class detail::archive_serializer_map ; template class detail::archive_serializer_map< mpi::detail::forward_skeleton_iarchive< boost::mpi::packed_skeleton_iarchive, boost::mpi::packed_iarchive> > ; -//template class binary_iarchive_impl ; } } // end namespace boost::archive diff --git a/src/packed_skeleton_oarchive.cpp b/src/packed_skeleton_oarchive.cpp index 8a33241..5cfecc0 100644 --- a/src/packed_skeleton_oarchive.cpp +++ b/src/packed_skeleton_oarchive.cpp @@ -8,12 +8,8 @@ #define BOOST_ARCHIVE_SOURCE #include - #include #include -#include -#include -#include namespace boost { namespace archive { // explicitly instantiate all required templates @@ -22,7 +18,5 @@ template class detail::archive_serializer_map ; template class detail::archive_serializer_map< mpi::detail::forward_skeleton_oarchive< boost::mpi::packed_skeleton_oarchive, boost::mpi::packed_oarchive> > ; -template class basic_binary_oarchive ; -//template class binary_oarchive_impl ; } } // end namespace boost::archive diff --git a/src/text_skeleton_oarchive.cpp b/src/text_skeleton_oarchive.cpp index dea8c8f..7817ea7 100644 --- a/src/text_skeleton_oarchive.cpp +++ b/src/text_skeleton_oarchive.cpp @@ -11,13 +11,10 @@ #include #include -#include -#include -#include namespace boost { namespace archive { // explicitly instantiate all required templates -template class detail::archive_serializer_map; +// template class detail::archive_serializer_map; } } // end namespace boost::archive