////////////////////////////////////////////////////////////////////////////// // (C) Copyright John Maddock 2000. // (C) Copyright Ion Gaztanaga 2005-2012. // // 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) // // See http://www.boost.org/libs/container for documentation. // // The alignment_of implementation comes from John Maddock's boost::alignment_of code // ////////////////////////////////////////////////////////////////////////////// #ifndef BOOST_CONTAINER_CONTAINER_DETAIL_TYPE_TRAITS_HPP #define BOOST_CONTAINER_CONTAINER_DETAIL_TYPE_TRAITS_HPP #if (defined _MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif #include "config_begin.hpp" #include namespace boost { namespace container { namespace container_detail { struct nat{}; template struct LowPriorityConversion { // Convertible from T with user-defined-conversion rank. LowPriorityConversion(const U&) { } }; //boost::alignment_of yields to 10K lines of preprocessed code, so we //need an alternative template struct alignment_of; template struct alignment_of_hack { char c; T t; alignment_of_hack(); }; template struct alignment_logic { enum{ value = A < S ? A : S }; }; template< typename T > struct alignment_of { enum{ value = alignment_logic < sizeof(alignment_of_hack) - sizeof(T) , sizeof(T)>::value }; }; //This is not standard, but should work with all compilers union max_align { char char_; short short_; int int_; long long_; #ifdef BOOST_HAS_LONG_LONG long long long_long_; #endif float float_; double double_; long double long_double_; void * void_ptr_; }; template struct remove_reference { typedef T type; }; template struct remove_reference { typedef T type; }; #ifndef BOOST_NO_RVALUE_REFERENCES template struct remove_reference { typedef T type; }; #else template struct remove_reference< ::boost::rv > { typedef T type; }; #endif template struct is_reference { enum { value = false }; }; template struct is_reference { enum { value = true }; }; template struct is_pointer { enum { value = false }; }; template struct is_pointer { enum { value = true }; }; template struct add_reference { typedef T& type; }; template struct add_reference { typedef T& type; }; template<> struct add_reference { typedef nat &type; }; template<> struct add_reference { typedef const nat &type; }; template struct add_const_reference { typedef const T &type; }; template struct add_const_reference { typedef T& type; }; template struct is_same { typedef char yes_type; struct no_type { char padding[8]; }; template static yes_type is_same_tester(V*, V*); static no_type is_same_tester(...); static T *t; static U *u; static const bool value = sizeof(yes_type) == sizeof(is_same_tester(t,u)); }; template struct remove_const { typedef T type; }; template struct remove_const< const T> { typedef T type; }; template struct remove_ref_const { typedef typename remove_const< typename remove_reference::type >::type type; }; } // namespace container_detail } //namespace container { } //namespace boost { #include #endif //#ifndef BOOST_CONTAINER_CONTAINER_DETAIL_TYPE_TRAITS_HPP