/usr/include/boost/mpi/allocator.hpp is in libboost1.46-dev 1.46.1-7ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | // Copyright (C) 2006 Douglas Gregor <doug.gregor -at- gmail.com>
// 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)
/** @file allocator.hpp
*
* This header provides an STL-compliant allocator that uses the
* MPI-2 memory allocation facilities.
*/
#ifndef BOOST_MPI_ALLOCATOR_HPP
#define BOOST_MPI_ALLOCATOR_HPP
#include <boost/mpi/config.hpp>
#include <boost/mpi/exception.hpp>
#include <cstddef>
#include <memory>
#include <boost/limits.hpp>
namespace boost { namespace mpi {
#if defined(BOOST_MPI_HAS_MEMORY_ALLOCATION)
template<typename T> class allocator;
/** @brief Allocator specialization for @c void value types.
*
* The @c void specialization of @c allocator is useful only for
* rebinding to another, different value type.
*/
template<>
class BOOST_MPI_DECL allocator<void>
{
public:
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template <class U>
struct rebind
{
typedef allocator<U> other;
};
};
/** @brief Standard Library-compliant allocator for the MPI-2 memory
* allocation routines.
*
* This allocator provides a standard C++ interface to the @c
* MPI_Alloc_mem and @c MPI_Free_mem routines of MPI-2. It is
* intended to be used with the containers in the Standard Library
* (@c vector, in particular) in cases where the contents of the
* container will be directly transmitted via MPI. This allocator is
* also used internally by the library for character buffers that
* will be used in the transmission of data.
*
* The @c allocator class template only provides MPI memory
* allocation when the underlying MPI implementation is either MPI-2
* compliant or is known to provide @c MPI_Alloc_mem and @c
* MPI_Free_mem as extensions. When the MPI memory allocation
* routines are not available, @c allocator is brought in directly
* from namespace @c std, so that standard allocators are used
* throughout. The macro @c BOOST_MPI_HAS_MEMORY_ALLOCATION will be
* defined when the MPI-2 memory allocation facilities are available.
*/
template<typename T>
class BOOST_MPI_DECL allocator
{
public:
/// Holds the size of objects
typedef std::size_t size_type;
/// Holds the number of elements between two pointers
typedef std::ptrdiff_t difference_type;
/// A pointer to an object of type @c T
typedef T* pointer;
/// A pointer to a constant object of type @c T
typedef const T* const_pointer;
/// A reference to an object of type @c T
typedef T& reference;
/// A reference to a constant object of type @c T
typedef const T& const_reference;
/// The type of memory allocated by this allocator
typedef T value_type;
/** @brief Retrieve the type of an allocator similar to this
* allocator but for a different value type.
*/
template <typename U>
struct rebind
{
typedef allocator<U> other;
};
/** Default-construct an allocator. */
allocator() throw() { }
/** Copy-construct an allocator. */
allocator(const allocator&) throw() { }
/**
* Copy-construct an allocator from another allocator for a
* different value type.
*/
template <typename U>
allocator(const allocator<U>&) throw() { }
/** Destroy an allocator. */
~allocator() throw() { }
/** Returns the address of object @p x. */
pointer address(reference x) const
{
return &x;
}
/** Returns the address of object @p x. */
const_pointer address(const_reference x) const
{
return &x;
}
/**
* Allocate enough memory for @p n elements of type @c T.
*
* @param n The number of elements for which memory should be
* allocated.
*
* @return a pointer to the newly-allocated memory
*/
pointer allocate(size_type n, allocator<void>::const_pointer /*hint*/ = 0)
{
pointer result;
BOOST_MPI_CHECK_RESULT(MPI_Alloc_mem,
(static_cast<MPI_Aint>(n * sizeof(T)),
MPI_INFO_NULL,
&result));
return result;
}
/**
* Deallocate memory referred to by the pointer @c p.
*
* @param p The pointer whose memory should be deallocated. This
* pointer shall have been returned from the @c allocate() function
* and not have already been freed.
*/
void deallocate(pointer p, size_type /*n*/)
{
BOOST_MPI_CHECK_RESULT(MPI_Free_mem, (p));
}
/**
* Returns the maximum number of elements that can be allocated
* with @c allocate().
*/
size_type max_size() const throw()
{
return (std::numeric_limits<std::size_t>::max)() / sizeof(T);
}
/** Construct a copy of @p val at the location referenced by @c p. */
void construct(pointer p, const T& val)
{
new ((void *)p) T(val);
}
/** Destroy the object referenced by @c p. */
void destroy(pointer p)
{
((T*)p)->~T();
}
};
/** @brief Compare two allocators for equality.
*
* Since MPI allocators have no state, all MPI allocators are equal.
*
* @returns @c true
*/
template<typename T1, typename T2>
inline bool operator==(const allocator<T1>&, const allocator<T2>&) throw()
{
return true;
}
/** @brief Compare two allocators for inequality.
*
* Since MPI allocators have no state, all MPI allocators are equal.
*
* @returns @c false
*/
template<typename T1, typename T2>
inline bool operator!=(const allocator<T1>&, const allocator<T2>&) throw()
{
return false;
}
#else
// Bring in the default allocator from namespace std.
using std::allocator;
#endif
} } /// end namespace boost::mpi
#endif // BOOST_MPI_ALLOCATOR_HPP
|