annotate DEPENDENCIES/generic/include/boost/property_map/parallel/unsafe_serialize.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 f46d142149f5
children
rev   line source
Chris@102 1 // Copyright (C) 2006 The Trustees of Indiana University.
Chris@102 2
Chris@102 3 // Use, modification and distribution is subject to the Boost Software
Chris@102 4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@102 5 // http://www.boost.org/LICENSE_1_0.txt)
Chris@102 6
Chris@102 7 // Authors: Douglas Gregor
Chris@102 8 // Andrew Lumsdaine
Chris@102 9
Chris@102 10 // This file contains the "unsafe_serialize" routine, which transforms
Chris@102 11 // types they may not be serializable (such as void*) into
Chris@102 12 // serializable equivalents.
Chris@102 13 #ifndef BOOST_PROPERTY_MAP_UNSAFE_SERIALIZE_HPP
Chris@102 14 #define BOOST_PROPERTY_MAP_UNSAFE_SERIALIZE_HPP
Chris@102 15
Chris@102 16 #include <boost/mpi/datatype.hpp>
Chris@102 17 #include <boost/serialization/is_bitwise_serializable.hpp>
Chris@102 18 #include <boost/mpl/bool.hpp>
Chris@102 19 #include <boost/mpl/if.hpp>
Chris@102 20 #include <boost/cstdint.hpp>
Chris@102 21 #include <boost/static_assert.hpp>
Chris@102 22 #include <boost/type_traits.hpp>
Chris@102 23 #include <utility>
Chris@102 24
Chris@102 25 BOOST_IS_BITWISE_SERIALIZABLE(void*)
Chris@102 26 namespace boost { namespace mpi {
Chris@102 27 template<> struct is_mpi_datatype<void*> : mpl::true_ { };
Chris@102 28 } } // end namespace boost::mpi
Chris@102 29
Chris@102 30 namespace boost {
Chris@102 31 typedef mpl::if_c<(sizeof(int) == sizeof(void*)),
Chris@102 32 int,
Chris@102 33 mpl::if_c<(sizeof(long) == sizeof(void*)),
Chris@102 34 long,
Chris@102 35 mpl::if_c<(sizeof(void*) <= sizeof(boost::intmax_t)),
Chris@102 36 boost::intmax_t,
Chris@102 37 void>::type
Chris@102 38 >::type
Chris@102 39 >::type ptr_serialize_type;
Chris@102 40
Chris@102 41 BOOST_STATIC_ASSERT ((!boost::is_void<ptr_serialize_type>::value));
Chris@102 42
Chris@102 43 template<typename T> inline T& unsafe_serialize(T& x) { return x; }
Chris@102 44
Chris@102 45 inline ptr_serialize_type& unsafe_serialize(void*& x)
Chris@102 46 { return reinterpret_cast<ptr_serialize_type&>(x); }
Chris@102 47
Chris@102 48 // Force Boost.MPI to serialize a void* like a ptr_serialize_type
Chris@102 49 namespace mpi {
Chris@102 50 template<> inline MPI_Datatype get_mpi_datatype<void*>(void* const& x)
Chris@102 51 {
Chris@102 52 return get_mpi_datatype<ptr_serialize_type>();
Chris@102 53 }
Chris@102 54 }
Chris@102 55
Chris@102 56 template<typename T, typename U>
Chris@102 57 struct unsafe_pair
Chris@102 58 {
Chris@102 59 unsafe_pair() { }
Chris@102 60 unsafe_pair(const T& t, const U& u) : first(t), second(u) { }
Chris@102 61 unsafe_pair(const std::pair<T, U>& p) : first(p.first), second(p.second) { }
Chris@102 62 T first;
Chris@102 63 U second;
Chris@102 64
Chris@102 65 template<typename Archiver>
Chris@102 66 void serialize(Archiver& ar, const unsigned /*version*/)
Chris@102 67 {
Chris@102 68 ar & unsafe_serialize(first) & unsafe_serialize(second);
Chris@102 69 }
Chris@102 70 };
Chris@102 71
Chris@102 72 template<typename T, typename U>
Chris@102 73 bool operator<(unsafe_pair<T,U> const& x, unsafe_pair<T,U> const& y)
Chris@102 74 {
Chris@102 75 return std::make_pair(x.first, x.second) <
Chris@102 76 std::make_pair(y.first, y.second);
Chris@102 77 }
Chris@102 78
Chris@102 79 } // end namespace boost
Chris@102 80
Chris@102 81 #endif // BOOST_PROPERTY_MAP_UNSAFE_SERIALIZE_HPP