123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- #ifndef BOOST_MPI_PACKED_IARCHIVE_HPP
- #define BOOST_MPI_PACKED_IARCHIVE_HPP
- #include <boost/mpi/datatype.hpp>
- #include <boost/archive/detail/auto_link_archive.hpp>
- #include <boost/archive/detail/common_iarchive.hpp>
- #include <boost/archive/basic_archive.hpp>
- #include <boost/mpi/detail/packed_iprimitive.hpp>
- #include <boost/mpi/detail/binary_buffer_iprimitive.hpp>
- #include <boost/serialization/string.hpp>
- #include <boost/serialization/collection_size_type.hpp>
- #include <boost/serialization/item_version_type.hpp>
- #include <boost/assert.hpp>
- namespace boost { namespace mpi {
- #ifdef BOOST_MPI_HOMOGENEOUS
- typedef binary_buffer_iprimitive iprimitive;
- #else
- typedef packed_iprimitive iprimitive;
- #endif
- class BOOST_MPI_DECL packed_iarchive
- : public iprimitive
- , public archive::detail::common_iarchive<packed_iarchive>
- {
- 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::detail::common_iarchive<packed_iarchive>(flags)
- {}
-
- packed_iarchive
- ( MPI_Comm const & comm , std::size_t s=0,
- unsigned int flags = boost::archive::no_header)
- : iprimitive(internal_buffer_,comm)
- , archive::detail::common_iarchive<packed_iarchive>(flags)
- , internal_buffer_(s)
- {}
-
- template<class T>
- void load_override(T& x, mpl::false_)
- {
- archive::detail::common_iarchive<packed_iarchive>::load_override(x);
- }
-
- template<class T>
- void load_override(T& x, mpl::true_)
- {
- iprimitive::load(x);
- }
-
- template<class T>
- void load_override(T& x)
- {
- typedef typename mpl::apply1<use_array_optimization
- , BOOST_DEDUCED_TYPENAME remove_const<T>::type
- >::type use_optimized;
- load_override(x, use_optimized());
- }
-
- void load_override(archive::class_id_optional_type & ){}
- void load_override(archive::class_id_type & t){
- int_least16_t x=0;
- * this->This() >> x;
- t = boost::archive::class_id_type(x);
- }
- void load_override(archive::version_type & t){
- int_least8_t x=0;
- * this->This() >> x;
- t = boost::archive::version_type(x);
- }
- void load_override(archive::class_id_reference_type & t){
- load_override(static_cast<archive::class_id_type &>(t));
- }
- void load_override(archive::class_name_type & t)
- {
- std::string cn;
- cn.reserve(BOOST_SERIALIZATION_MAX_KEY_SIZE);
- * this->This() >> cn;
- std::memcpy(t, cn.data(), cn.size());
-
- t.t[cn.size()] = '\0';
- }
- private:
-
-
- buffer_type internal_buffer_;
- };
- } }
- BOOST_SERIALIZATION_REGISTER_ARCHIVE(boost::mpi::packed_iarchive)
- BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(boost::mpi::packed_iarchive)
- #endif
|