67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // 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; | ||
|  |    | ||
|  |    | ||
|  |   template <class T> | ||
|  |   struct referent_size<T&> | ||
|  |   { | ||
|  |       BOOST_STATIC_CONSTANT( | ||
|  |           std::size_t, value = sizeof(T)); | ||
|  |   }; | ||
|  | 
 | ||
|  | 
 | ||
|  | // 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 |