123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // (C) Copyright 2005 Matthias Troyer
- // Use, modification and distribution is subject to the Boost Software
- // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- // Authors: Matthias Troyer
- #ifndef BOOST_MPI_DETAIL_TYPE_MPI_DATATYPE_CACHE_HPP
- #define BOOST_MPI_DETAIL_TYPE_MPI_DATATYPE_CACHE_HPP
- #include <boost/mpi/datatype_fwd.hpp>
- #include <boost/mpi/detail/mpi_datatype_oarchive.hpp>
- #include <boost/mpi/exception.hpp>
- #include <boost/utility/enable_if.hpp>
- #include <boost/mpl/assert.hpp>
- #include <boost/noncopyable.hpp>
- #include <typeinfo>
- // The std::type_info::before function in Visual C++ 8.0 (and probably earlier)
- // incorrectly returns an "int" instead of a "bool". Then the compiler has the
- // audacity to complain when that "int" is converted to a "bool". Silence
- // this warning.
- #ifdef BOOST_MSVC
- # pragma warning(push)
- # pragma warning(disable : 4800)
- #endif
- namespace boost { namespace mpi { namespace detail {
- /// @brief comparison function object for two std::type_info pointers
- ///
- /// is implemented using the before() member function of the std::type_info
- /// class
- struct type_info_compare
- {
- bool operator()(std::type_info const* lhs, std::type_info const* rhs) const
- {
- return lhs->before(*rhs);
- }
- };
- /// @brief a map of MPI data types, indexed by their type_info
- ///
- ///
- class BOOST_MPI_DECL mpi_datatype_map
- : public boost::noncopyable
- {
- struct implementation;
- implementation *impl;
- public:
- mpi_datatype_map();
- ~mpi_datatype_map();
- template <class T>
- MPI_Datatype datatype(const T& x = T(), typename boost::enable_if<is_mpi_builtin_datatype<T> >::type* =0)
- {
- return get_mpi_datatype<T>(x);
- }
- template <class T>
- MPI_Datatype datatype(const T& x =T(), typename boost::disable_if<is_mpi_builtin_datatype<T> >::type* =0 )
- {
- BOOST_MPL_ASSERT((is_mpi_datatype<T>));
- // check whether the type already exists
- std::type_info const* t = &typeid(T);
- MPI_Datatype datatype = get(t);
- if (datatype == MPI_DATATYPE_NULL) {
- // need to create a type
- mpi_datatype_oarchive ar(x);
- datatype = ar.get_mpi_datatype();
- set(t, datatype);
- }
- return datatype;
- }
-
- void clear();
- private:
- MPI_Datatype get(const std::type_info* t);
- void set(const std::type_info* t, MPI_Datatype datatype);
- };
- /// Retrieve the MPI datatype cache
- BOOST_MPI_DECL mpi_datatype_map& mpi_datatype_cache();
- } } } // end namespace boost::mpi::detail
- #ifdef BOOST_MSVC
- # pragma warning(pop)
- #endif
- #endif // BOOST_MPI_DETAIL_TYPE_MPI_DATATYPE_CACHE_HPP
|