annotate DEPENDENCIES/generic/include/boost/mpi/detail/binary_buffer_oprimitive.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // (C) Copyright 2005-2007 Matthias Troyer
Chris@16 2
Chris@16 3 // Use, modification and distribution is subject to the Boost Software
Chris@16 4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 5 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6
Chris@16 7 // Authors: Matthias Troyer
Chris@16 8
Chris@16 9 #ifndef BOOST_MPI_BINARY_BUFFER_OPRIMITIVE_HPP
Chris@16 10 #define BOOST_MPI_BINARY_BUFFER_OPRIMITIVE_HPP
Chris@16 11
Chris@16 12 #include <mpi.h>
Chris@16 13 #include <iostream>
Chris@16 14 #include <cstddef> // size_t
Chris@16 15 #include <boost/config.hpp>
Chris@16 16
Chris@16 17 #include <boost/serialization/array.hpp>
Chris@16 18 #include <boost/serialization/is_bitwise_serializable.hpp>
Chris@16 19 #include <boost/assert.hpp>
Chris@16 20 #include <boost/mpl/assert.hpp>
Chris@16 21 #include <vector>
Chris@16 22 #include <boost/mpi/allocator.hpp>
Chris@16 23 #include <boost/mpl/always.hpp>
Chris@16 24 #include <boost/type_traits/remove_const.hpp>
Chris@16 25
Chris@16 26 namespace boost { namespace mpi {
Chris@16 27
Chris@16 28 /// serialization using binary copy into a buffer
Chris@16 29
Chris@16 30 class BOOST_MPI_DECL binary_buffer_oprimitive
Chris@16 31 {
Chris@16 32 public:
Chris@16 33 /// the type of the buffer into which the data is packed upon serialization
Chris@16 34 typedef std::vector<char, allocator<char> > buffer_type;
Chris@16 35
Chris@16 36 binary_buffer_oprimitive(buffer_type & b, MPI_Comm const &)
Chris@16 37 : buffer_(b)
Chris@16 38 {
Chris@16 39 }
Chris@16 40
Chris@16 41 void const * address() const
Chris@16 42 {
Chris@16 43 return &buffer_.front();
Chris@16 44 }
Chris@16 45
Chris@16 46 const std::size_t& size() const
Chris@16 47 {
Chris@16 48 return size_ = buffer_.size();
Chris@16 49 }
Chris@16 50
Chris@16 51 void save_binary(void const *address, std::size_t count)
Chris@16 52 {
Chris@16 53 save_impl(address,count);
Chris@16 54 }
Chris@16 55
Chris@16 56 // fast saving of arrays
Chris@16 57 template<class T>
Chris@16 58 void save_array(serialization::array<T> const& x, unsigned int /* file_version */)
Chris@16 59 {
Chris@16 60
Chris@16 61 BOOST_MPL_ASSERT((serialization::is_bitwise_serializable<BOOST_DEDUCED_TYPENAME remove_const<T>::type>));
Chris@16 62 if (x.count())
Chris@16 63 save_impl(x.address(), x.count()*sizeof(T));
Chris@16 64 }
Chris@16 65
Chris@16 66 template<class T>
Chris@16 67 void save(serialization::array<T> const& x)
Chris@16 68 {
Chris@16 69 save_array(x,0u);
Chris@16 70 }
Chris@16 71
Chris@16 72 typedef serialization::is_bitwise_serializable<mpl::_1> use_array_optimization;
Chris@16 73
Chris@16 74 // default saving of primitives.
Chris@16 75 template<class T>
Chris@16 76 void save(const T & t)
Chris@16 77 {
Chris@16 78 BOOST_MPL_ASSERT((serialization::is_bitwise_serializable<BOOST_DEDUCED_TYPENAME remove_const<T>::type>));
Chris@16 79 save_impl(&t, sizeof(T));
Chris@16 80 }
Chris@16 81
Chris@16 82 template<class CharType>
Chris@16 83 void save(const std::basic_string<CharType> &s)
Chris@16 84 {
Chris@16 85 unsigned int l = static_cast<unsigned int>(s.size());
Chris@16 86 save(l);
Chris@16 87 save_impl(s.data(),s.size());
Chris@16 88 }
Chris@16 89
Chris@16 90 private:
Chris@16 91
Chris@16 92 void save_impl(void const * p, int l)
Chris@16 93 {
Chris@16 94 char const* ptr = reinterpret_cast<char const*>(p);
Chris@16 95 buffer_.insert(buffer_.end(),ptr,ptr+l);
Chris@16 96 }
Chris@16 97
Chris@16 98 buffer_type& buffer_;
Chris@16 99 mutable std::size_t size_;
Chris@16 100 };
Chris@16 101
Chris@16 102 } } // end namespace boost::mpi
Chris@16 103
Chris@16 104 #endif // BOOST_MPI_BINARY_BUFFER_OPRIMITIVE_HPP