blob: 8437e9d02bc54e869c7376b5de8f7b785ab33e23 [file] [log] [blame]
// (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
#include <boost/archive/detail/archive_serializer_map.hpp>
#include <boost/mpi/detail/mpi_datatype_cache.hpp>
#include <map>
namespace boost { namespace mpi { namespace detail {
typedef std::map<std::type_info const*,MPI_Datatype,type_info_compare>
stored_map_type;
struct mpi_datatype_map::implementation
{
stored_map_type map;
};
mpi_datatype_map::mpi_datatype_map()
{
impl = new implementation();
}
void mpi_datatype_map::clear()
{
// do not free after call to MPI_FInalize
int finalized=0;
BOOST_MPI_CHECK_RESULT(MPI_Finalized,(&finalized));
if (!finalized) {
// ignore errors in the destructor
for (stored_map_type::iterator it=impl->map.begin(); it != impl->map.end(); ++it)
MPI_Type_free(&(it->second));
}
}
mpi_datatype_map::~mpi_datatype_map()
{
clear();
delete impl;
}
MPI_Datatype mpi_datatype_map::get(const std::type_info* t)
{
stored_map_type::iterator pos = impl->map.find(t);
if (pos != impl->map.end())
return pos->second;
else
return MPI_DATATYPE_NULL;
}
void mpi_datatype_map::set(const std::type_info* t, MPI_Datatype datatype)
{
impl->map[t] = datatype;
}
mpi_datatype_map& mpi_datatype_cache()
{
static mpi_datatype_map cache;
return cache;
}
} } }