// Copyright David Abrahams 2002. | |
// Distributed under 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) | |
#ifndef REFERENT_STORAGE_DWA200278_HPP | |
# define REFERENT_STORAGE_DWA200278_HPP | |
# include <boost/mpl/if.hpp> | |
# include <cstddef> | |
namespace boost { namespace python { namespace detail { | |
struct alignment_dummy; | |
typedef void (*function_ptr)(); | |
typedef int (alignment_dummy::*member_ptr); | |
typedef int (alignment_dummy::*member_function_ptr)(); | |
# define BOOST_PYTHON_ALIGNER(T, n) \ | |
typename mpl::if_c< \ | |
sizeof(T) <= size, T, char>::type t##n | |
// Storage for size bytes, aligned to all fundamental types no larger than size | |
template <std::size_t size> | |
union aligned_storage | |
{ | |
BOOST_PYTHON_ALIGNER(char, 0); | |
BOOST_PYTHON_ALIGNER(short, 1); | |
BOOST_PYTHON_ALIGNER(int, 2); | |
BOOST_PYTHON_ALIGNER(long, 3); | |
BOOST_PYTHON_ALIGNER(float, 4); | |
BOOST_PYTHON_ALIGNER(double, 5); | |
BOOST_PYTHON_ALIGNER(long double, 6); | |
BOOST_PYTHON_ALIGNER(void*, 7); | |
BOOST_PYTHON_ALIGNER(function_ptr, 8); | |
BOOST_PYTHON_ALIGNER(member_ptr, 9); | |
BOOST_PYTHON_ALIGNER(member_function_ptr, 10); | |
char bytes[size]; | |
}; | |
# undef BOOST_PYTHON_ALIGNER | |
// Compute the size of T's referent. We wouldn't need this at all, | |
// but sizeof() is broken in CodeWarriors <= 8.0 | |
template <class T> struct referent_size; | |
# ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | |
template <class T> | |
struct referent_size<T&> | |
{ | |
BOOST_STATIC_CONSTANT( | |
std::size_t, value = sizeof(T)); | |
}; | |
# else | |
template <class T> struct referent_size | |
{ | |
static T f(); | |
BOOST_STATIC_CONSTANT(std::size_t, value = sizeof(f())); | |
}; | |
# endif | |
// A metafunction returning a POD type which can store U, where T == | |
// U&. If T is not a reference type, returns a POD which can store T. | |
template <class T> | |
struct referent_storage | |
{ | |
typedef aligned_storage< | |
::boost::python::detail::referent_size<T>::value | |
> type; | |
}; | |
}}} // namespace boost::python::detail | |
#endif // REFERENT_STORAGE_DWA200278_HPP |