diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2013-10-19 08:57:20 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2013-10-19 08:57:20 +0200 |
commit | ed6115361006240e3c7b02295599e4534cc55a13 (patch) | |
tree | 612f12d6c7c49421102041fceb7609db8ab8257e /cutl/details/boost/type_traits/remove_pointer.hpp | |
parent | af8d1a0139ca105c6830f4ac7c320aca2e1c1f5e (diff) |
Update internal Boost subset to 1.54.0
Diffstat (limited to 'cutl/details/boost/type_traits/remove_pointer.hpp')
-rw-r--r-- | cutl/details/boost/type_traits/remove_pointer.hpp | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/cutl/details/boost/type_traits/remove_pointer.hpp b/cutl/details/boost/type_traits/remove_pointer.hpp index 46d3fc8..6aa2c0e 100644 --- a/cutl/details/boost/type_traits/remove_pointer.hpp +++ b/cutl/details/boost/type_traits/remove_pointer.hpp @@ -9,12 +9,17 @@ #ifndef BOOST_TT_REMOVE_POINTER_HPP_INCLUDED #define BOOST_TT_REMOVE_POINTER_HPP_INCLUDED -#include <cutl/details/boost/type_traits/broken_compiler_spec.hpp> #include <cutl/details/boost/config.hpp> #include <cutl/details/boost/detail/workaround.hpp> +#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +#include <cutl/details/boost/type_traits/broken_compiler_spec.hpp> +#endif #if BOOST_WORKAROUND(BOOST_MSVC,<=1300) #include <cutl/details/boost/type_traits/msvc/remove_pointer.hpp> +#elif defined(BOOST_MSVC) +#include <cutl/details/boost/type_traits/remove_cv.hpp> +#include <cutl/details/boost/type_traits/is_pointer.hpp> #endif // should be the last #include @@ -22,7 +27,51 @@ namespace cutl_details_boost { -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION +#ifdef BOOST_MSVC + +namespace detail{ + + // + // We need all this crazy indirection because a type such as: + // + // T (*const)(U) + // + // Does not bind to a <T*> or <T*const> partial specialization with VC10 and earlier + // + template <class T> + struct remove_pointer_imp + { + typedef T type; + }; + + template <class T> + struct remove_pointer_imp<T*> + { + typedef T type; + }; + + template <class T, bool b> + struct remove_pointer_imp3 + { + typedef typename remove_pointer_imp<typename cutl_details_boost::remove_cv<T>::type>::type type; + }; + + template <class T> + struct remove_pointer_imp3<T, false> + { + typedef T type; + }; + + template <class T> + struct remove_pointer_imp2 + { + typedef typename remove_pointer_imp3<T, ::cutl_details_boost::is_pointer<T>::value>::type type; + }; +} + +BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,typename cutl_details_boost::detail::remove_pointer_imp2<T>::type) + +#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,T) BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T*,T) |