From 62132b3ad4956c46c78e2e9827dd53934c64608c Mon Sep 17 00:00:00 2001 From: Peder Holt Date: Wed, 29 Mar 2006 17:35:11 +0000 Subject: [PATCH] Merged remove_xxx implementation for VC6.5 and VC7.0 using typeof trick from HEAD [SVN r33524] --- .../type_traits/msvc/remove_all_extents.hpp | 47 +++++ .../boost/type_traits/msvc/remove_bounds.hpp | 43 ++++ .../boost/type_traits/msvc/remove_const.hpp | 143 +++++++++++++ include/boost/type_traits/msvc/remove_cv.hpp | 190 ++++++++++++++++++ .../boost/type_traits/msvc/remove_extent.hpp | 43 ++++ .../boost/type_traits/msvc/remove_pointer.hpp | 42 ++++ .../type_traits/msvc/remove_reference.hpp | 42 ++++ .../type_traits/msvc/remove_volatile.hpp | 143 +++++++++++++ include/boost/type_traits/msvc/typeof.hpp | 50 +++++ .../boost/type_traits/remove_all_extents.hpp | 9 + include/boost/type_traits/remove_bounds.hpp | 9 + include/boost/type_traits/remove_const.hpp | 7 +- include/boost/type_traits/remove_cv.hpp | 7 +- include/boost/type_traits/remove_extent.hpp | 9 + include/boost/type_traits/remove_pointer.hpp | 7 +- .../boost/type_traits/remove_reference.hpp | 7 +- include/boost/type_traits/remove_volatile.hpp | 7 +- 17 files changed, 800 insertions(+), 5 deletions(-) create mode 100644 include/boost/type_traits/msvc/remove_all_extents.hpp create mode 100644 include/boost/type_traits/msvc/remove_bounds.hpp create mode 100644 include/boost/type_traits/msvc/remove_const.hpp create mode 100644 include/boost/type_traits/msvc/remove_cv.hpp create mode 100644 include/boost/type_traits/msvc/remove_extent.hpp create mode 100644 include/boost/type_traits/msvc/remove_pointer.hpp create mode 100644 include/boost/type_traits/msvc/remove_reference.hpp create mode 100644 include/boost/type_traits/msvc/remove_volatile.hpp create mode 100644 include/boost/type_traits/msvc/typeof.hpp diff --git a/include/boost/type_traits/msvc/remove_all_extents.hpp b/include/boost/type_traits/msvc/remove_all_extents.hpp new file mode 100644 index 0000000..b5424a6 --- /dev/null +++ b/include/boost/type_traits/msvc/remove_all_extents.hpp @@ -0,0 +1,47 @@ +// Copyright (C) 2004 Peder Holt +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_EXTENT_HOLT_2004_0827 +#define BOOST_TYPE_TRAITS_MSVC_REMOVE_EXTENT_HOLT_2004_0827 + +#include +#include + +namespace boost { + template + struct remove_all_extents; + + namespace detail { + template + struct remove_all_extents_impl_typeof { + template + struct inner { + typedef T type; + }; + }; + template<> + struct remove_all_extents_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U[]); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) )); + typedef typename msvc_extract_type::id2type::type reduced_type; + typedef typename remove_all_extents::type type; + }; + }; + } //namespace detail + + template + struct remove_all_extents { + typedef typename detail::remove_all_extents_impl_typeof< + boost::is_array::value + >::template inner >::type type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_all_extents,T) + }; +} //namespace boost + +#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 + diff --git a/include/boost/type_traits/msvc/remove_bounds.hpp b/include/boost/type_traits/msvc/remove_bounds.hpp new file mode 100644 index 0000000..12a9b05 --- /dev/null +++ b/include/boost/type_traits/msvc/remove_bounds.hpp @@ -0,0 +1,43 @@ +// Copyright (C) 2004 Peder Holt +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 +#define BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 + +#include +#include + +namespace boost { + namespace detail { + template + struct remove_bounds_impl_typeof { + template + struct inner { + typedef T type; + }; + }; + template<> + struct remove_bounds_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U[]); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + }; + } //namespace detail + + template + struct remove_bounds { + typedef typename detail::remove_bounds_impl_typeof< + boost::is_array::value + >::template inner >::type type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_bounds,T) + }; +} //namespace boost + +#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 + diff --git a/include/boost/type_traits/msvc/remove_const.hpp b/include/boost/type_traits/msvc/remove_const.hpp new file mode 100644 index 0000000..5395e80 --- /dev/null +++ b/include/boost/type_traits/msvc/remove_const.hpp @@ -0,0 +1,143 @@ +// Copyright (C) 2004 Peder Holt +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_CONST_HOLT_2004_0828 +#define BOOST_TYPE_TRAITS_MSVC_REMOVE_CONST_HOLT_2004_0828 + +#include +#include +#include +#include +#include + +namespace boost { + namespace detail { + template + struct remove_const_impl_typeof { + template + struct inner { + typedef T type; + }; + template + struct transform_type { + typedef T type; + }; + }; + template<> //Const + struct remove_const_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U const&(*)()); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T& type; + }; + }; + template<> //CV + struct remove_const_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U const volatile&(*)()); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T& type; + }; + }; + template<> //Const Pointer + struct remove_const_impl_typeof { + template + struct inner { + template + static msvc_register_type test(void(*)(U const[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type[]; + }; + }; + template<> //CV Pointer + struct remove_const_impl_typeof { + template + struct inner { + template + static msvc_register_type test(void(*)(U const volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type[]; + }; + }; + template<> //Const Array + struct remove_const_impl_typeof { + template + struct inner { + BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); + + template + static msvc_register_type test(void(*)(U const[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type; + }; + }; + + template<> //CV Array + struct remove_const_impl_typeof { + template + struct inner { + BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); + + template + static msvc_register_type test(void(*)(U const volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type; + }; + }; + + } //namespace detail + + template + struct remove_const { + typedef detail::remove_const_impl_typeof< + boost::is_pointer::value, + boost::is_array::value, + boost::is_const::value, + boost::is_volatile::value + > remove_const_type; + typedef typename + remove_const_type::template inner< + typename remove_const_type::template transform_type::type, + remove_const + >::type + type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_const,T) + }; +}//namespace boost + +#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_CONST_HOLT_2004_0828 diff --git a/include/boost/type_traits/msvc/remove_cv.hpp b/include/boost/type_traits/msvc/remove_cv.hpp new file mode 100644 index 0000000..c7b0379 --- /dev/null +++ b/include/boost/type_traits/msvc/remove_cv.hpp @@ -0,0 +1,190 @@ +// Copyright (C) 2004 Peder Holt +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_CV_HOLT_2004_0901 +#define BOOST_TYPE_TRAITS_MSVC_REMOVE_CV_HOLT_2004_0901 + +#include +#include +#include +#include +#include + +namespace boost { + namespace detail { + template + struct remove_cv_impl_typeof { + template + struct inner { + typedef T type; + }; + template + struct transform_type { + typedef T type; + }; + }; + template<> //Volatile + struct remove_cv_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U volatile&(*)()); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T& type; + }; + }; + template<> //Const + struct remove_cv_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U const&(*)()); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T& type; + }; + }; + template<> //CV + struct remove_cv_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U const volatile&(*)()); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T& type; + }; + }; + template<> //Volatile Pointer + struct remove_cv_impl_typeof { + template + struct inner { + template + static msvc_register_type test(void(*)(U volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type[]; + }; + }; + template<> //Const Pointer + struct remove_cv_impl_typeof { + template + struct inner { + template + static msvc_register_type test(void(*)(U const[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type[]; + }; + }; + template<> //CV Pointer + struct remove_cv_impl_typeof { + template + struct inner { + template + static msvc_register_type test(void(*)(U const volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type[]; + }; + }; + template<> //Volatile Array + struct remove_cv_impl_typeof { + template + struct inner { + BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); + + template + static msvc_register_type test(void(*)(U volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type; + }; + }; + template<> //Const Array + struct remove_cv_impl_typeof { + template + struct inner { + BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); + + template + static msvc_register_type test(void(*)(U const[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type; + }; + }; + + template<> //CV Array + struct remove_cv_impl_typeof { + template + struct inner { + BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); + + template + static msvc_register_type test(void(*)(U const volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type; + }; + }; + + } //namespace detail + + template + struct remove_cv { + typedef detail::remove_cv_impl_typeof< + boost::is_pointer::value, + boost::is_array::value, + boost::is_const::value, + boost::is_volatile::value + > remove_cv_type; + typedef typename + remove_cv_type::template inner< + typename remove_cv_type::template transform_type::type, + remove_cv + >::type + type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_cv,T) + }; +}//namespace boost + +#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_CV_HOLT_2004_0901 diff --git a/include/boost/type_traits/msvc/remove_extent.hpp b/include/boost/type_traits/msvc/remove_extent.hpp new file mode 100644 index 0000000..f87ec41 --- /dev/null +++ b/include/boost/type_traits/msvc/remove_extent.hpp @@ -0,0 +1,43 @@ +// Copyright (C) 2004 Peder Holt +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_EXTENT_HOLT_2004_0827 +#define BOOST_TYPE_TRAITS_MSVC_REMOVE_EXTENT_HOLT_2004_0827 + +#include +#include + +namespace boost { + namespace detail { + template + struct remove_extent_impl_typeof { + template + struct inner { + typedef T type; + }; + }; + template<> + struct remove_extent_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U[]); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + }; + } //namespace detail + + template + struct remove_extent { + typedef typename detail::remove_extent_impl_typeof< + boost::is_array::value + >::template inner >::type type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_extent,T) + }; +} //namespace boost + +#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_BOUNDS_HOLT_2004_0827 + diff --git a/include/boost/type_traits/msvc/remove_pointer.hpp b/include/boost/type_traits/msvc/remove_pointer.hpp new file mode 100644 index 0000000..8b9b0d4 --- /dev/null +++ b/include/boost/type_traits/msvc/remove_pointer.hpp @@ -0,0 +1,42 @@ +// Copyright (C) 2004 Peder Holt +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_POINTER_HOLT_2004_0827 +#define BOOST_TYPE_TRAITS_MSVC_REMOVE_POINTER_HOLT_2004_0827 + +#include +#include + +namespace boost { + namespace detail { + template + struct remove_pointer_impl_typeof { + template + struct inner { + typedef T type; + }; + }; + template<> + struct remove_pointer_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U*); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( *((T*)NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + }; + } //namespace detail + + template + struct remove_pointer { + typedef typename detail::remove_pointer_impl_typeof< + boost::is_pointer::value + >::template inner >::type type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_pointer,T) + }; +} //namespace boost + +#endif //BOOST_TYPE_TRAITS_REMOVE_POINTER_HOLT_2004_0827 diff --git a/include/boost/type_traits/msvc/remove_reference.hpp b/include/boost/type_traits/msvc/remove_reference.hpp new file mode 100644 index 0000000..367d352 --- /dev/null +++ b/include/boost/type_traits/msvc/remove_reference.hpp @@ -0,0 +1,42 @@ +// Copyright (C) 2004 Peder Holt +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827 +#define BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827 + +#include +#include + +namespace boost { + namespace detail { + template + struct remove_reference_impl_typeof { + template + struct inner { + typedef T type; + }; + }; + template<> + struct remove_reference_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U&(*)()); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + }; + } //namespace detail + + template + struct remove_reference { + typedef typename detail::remove_reference_impl_typeof< + boost::is_reference::value + >::template inner >::type type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_reference,T) + }; +} //namespace boost + +#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_REFERENCE_HOLT_2004_0827 diff --git a/include/boost/type_traits/msvc/remove_volatile.hpp b/include/boost/type_traits/msvc/remove_volatile.hpp new file mode 100644 index 0000000..3759f2a --- /dev/null +++ b/include/boost/type_traits/msvc/remove_volatile.hpp @@ -0,0 +1,143 @@ +// Copyright (C) 2004 Peder Holt +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828 +#define BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828 + +#include +#include +#include +#include +#include + +namespace boost { + namespace detail { + template + struct remove_volatile_impl_typeof { + template + struct inner { + typedef T type; + }; + template + struct transform_type { + typedef T type; + }; + }; + template<> //Volatile + struct remove_volatile_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U volatile&(*)()); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T& type; + }; + }; + template<> //CV + struct remove_volatile_impl_typeof { + template + struct inner { + template + static msvc_register_type test(U const volatile&(*)()); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (T(*)())(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T& type; + }; + }; + template<> //Volatile Pointer + struct remove_volatile_impl_typeof { + template + struct inner { + template + static msvc_register_type test(void(*)(U volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type[]; + }; + }; + template<> //CV Pointer + struct remove_volatile_impl_typeof { + template + struct inner { + template + static msvc_register_type test(void(*)(U const volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type[]; + }; + }; + template<> //Volatile Array + struct remove_volatile_impl_typeof { + template + struct inner { + BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); + + template + static msvc_register_type test(void(*)(U volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type; + }; + }; + + template<> //CV Array + struct remove_volatile_impl_typeof { + template + struct inner { + BOOST_STATIC_CONSTANT(unsigned,value=(sizeof(T)/sizeof((*((T*)NULL))[0]))); + + template + static msvc_register_type test(void(*)(U const volatile[])); + static msvc_register_type test(...); + BOOST_STATIC_CONSTANT(unsigned,register_test=sizeof(test( (void(*)(T))(NULL) ) )); + typedef typename msvc_extract_type::id2type::type type; + }; + template + struct transform_type { + typedef T type; + }; + }; + + } //namespace detail + + template + struct remove_volatile { + typedef detail::remove_volatile_impl_typeof< + boost::is_pointer::value, + boost::is_array::value, + boost::is_const::value, + boost::is_volatile::value + > remove_volatile_type; + typedef typename + remove_volatile_type::template inner< + typename remove_volatile_type::template transform_type::type, + remove_volatile + >::type + type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,remove_volatile,T) + }; +}//namespace boost + +#endif //BOOST_TYPE_TRAITS_MSVC_REMOVE_VOLATILE_HOLT_2004_0828 diff --git a/include/boost/type_traits/msvc/typeof.hpp b/include/boost/type_traits/msvc/typeof.hpp new file mode 100644 index 0000000..ebb0e80 --- /dev/null +++ b/include/boost/type_traits/msvc/typeof.hpp @@ -0,0 +1,50 @@ +// Copyright (C) 2004 Peder Holt +// Use, modification and distribution is subject to the Boost Software +// License, Version 1.0. (http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_TYPETRAITS_MSVC_TYPEOF_HPP +#define BOOST_TYPETRAITS_MSVC_TYPEOF_HPP + +#include +#include + +namespace boost { namespace detail { +# if BOOST_WORKAROUND(BOOST_MSVC,==1300) + template + struct msvc_extract_type + { + template + struct id2type_impl; + + typedef id2type_impl id2type; + }; + + template + struct msvc_register_type : msvc_extract_type + { + template<> + struct id2type_impl //VC7.0 specific bugfeature + { + typedef T type; + }; + }; +# else + template + struct msvc_extract_type + { + struct id2type; + }; + + template + struct msvc_register_type : msvc_extract_type + { + typedef msvc_extract_type base_type; + struct base_type::id2type // This uses nice VC6.5 and VC7.1 bugfeature + { + typedef T type; + }; + }; +# endif +}} + +#endif //BOOST_TYPETRAITS_MSVC_TYPEOF_IMPL_HPP diff --git a/include/boost/type_traits/remove_all_extents.hpp b/include/boost/type_traits/remove_all_extents.hpp index 16abdee..8ae18ee 100755 --- a/include/boost/type_traits/remove_all_extents.hpp +++ b/include/boost/type_traits/remove_all_extents.hpp @@ -11,10 +11,17 @@ #include #include +#include + +#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) +#include +#endif // should be the last #include #include +#if !BOOST_WORKAROUND(BOOST_MSVC,<=1300) + namespace boost { BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_all_extents,T,T) @@ -34,6 +41,8 @@ BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_all_extents,T const vo } // namespace boost +#endif + #include #endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED diff --git a/include/boost/type_traits/remove_bounds.hpp b/include/boost/type_traits/remove_bounds.hpp index 45ff02a..1d7b436 100644 --- a/include/boost/type_traits/remove_bounds.hpp +++ b/include/boost/type_traits/remove_bounds.hpp @@ -11,10 +11,17 @@ #include #include +#include + +#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) +#include +#endif // should be the last #include #include +#if !BOOST_WORKAROUND(BOOST_MSVC,<=1300) + namespace boost { BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_bounds,T,T) @@ -34,6 +41,8 @@ BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_bounds,T const volatil } // namespace boost +#endif + #include #endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED diff --git a/include/boost/type_traits/remove_const.hpp b/include/boost/type_traits/remove_const.hpp index 7637b42..45f8d6e 100644 --- a/include/boost/type_traits/remove_const.hpp +++ b/include/boost/type_traits/remove_const.hpp @@ -15,9 +15,14 @@ #include #include #include +#include #include +#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) +#include +#endif + // should be the last #include #include @@ -60,7 +65,7 @@ BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_const,T const volatile[N],T volatile type[N]) #endif -#else +#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_const,T,typename detail::remove_const_impl::type) diff --git a/include/boost/type_traits/remove_cv.hpp b/include/boost/type_traits/remove_cv.hpp index 689b1f1..09f8ff1 100644 --- a/include/boost/type_traits/remove_cv.hpp +++ b/include/boost/type_traits/remove_cv.hpp @@ -14,9 +14,14 @@ #include #include #include +#include #include +#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) +#include +#endif + // should be the last #include #include @@ -33,7 +38,7 @@ BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T vol BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_cv,T const volatile[N],T type[N]) #endif -#else +#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) namespace detail { template diff --git a/include/boost/type_traits/remove_extent.hpp b/include/boost/type_traits/remove_extent.hpp index 979edb6..32dee6f 100755 --- a/include/boost/type_traits/remove_extent.hpp +++ b/include/boost/type_traits/remove_extent.hpp @@ -10,11 +10,18 @@ #define BOOST_TT_REMOVE_EXTENT_HPP_INCLUDED #include +#include #include +#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) +#include +#endif + // should be the last #include #include +#if !BOOST_WORKAROUND(BOOST_MSVC,<=1300) + namespace boost { BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_extent,T,T) @@ -34,6 +41,8 @@ BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_extent,T const volatil } // namespace boost +#endif + #include #endif // BOOST_TT_REMOVE_BOUNDS_HPP_INCLUDED diff --git a/include/boost/type_traits/remove_pointer.hpp b/include/boost/type_traits/remove_pointer.hpp index 69937e5..893be09 100644 --- a/include/boost/type_traits/remove_pointer.hpp +++ b/include/boost/type_traits/remove_pointer.hpp @@ -11,6 +11,11 @@ #include #include +#include + +#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) +#include +#endif // should be the last #include #include @@ -25,7 +30,7 @@ BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* const,T) BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* volatile,T) BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_pointer,T* const volatile,T) -#else +#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_pointer,T,typename detail::remove_pointer_impl::type) diff --git a/include/boost/type_traits/remove_reference.hpp b/include/boost/type_traits/remove_reference.hpp index 43c0f81..27e9002 100644 --- a/include/boost/type_traits/remove_reference.hpp +++ b/include/boost/type_traits/remove_reference.hpp @@ -11,6 +11,11 @@ #include #include +#include + +#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) +#include +#endif // should be the last #include #include @@ -32,7 +37,7 @@ BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& volatile, BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_1(typename T,remove_reference,T& const volatile,T) #endif -#else +#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_reference,T,typename detail::remove_reference_impl::type) diff --git a/include/boost/type_traits/remove_volatile.hpp b/include/boost/type_traits/remove_volatile.hpp index 71b6cc3..ec6b6c5 100644 --- a/include/boost/type_traits/remove_volatile.hpp +++ b/include/boost/type_traits/remove_volatile.hpp @@ -15,9 +15,14 @@ #include #include #include +#include #include +#if BOOST_WORKAROUND(BOOST_MSVC,<=1300) +#include +#endif + // should be the last #include #include @@ -59,7 +64,7 @@ BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_volatile BOOST_TT_AUX_TYPE_TRAIT_PARTIAL_SPEC1_2(typename T,std::size_t N,remove_volatile,T const volatile[N],T const type[N]) #endif -#else +#elif !BOOST_WORKAROUND(BOOST_MSVC,<=1300) BOOST_TT_AUX_TYPE_TRAIT_DEF1(remove_volatile,T,typename detail::remove_volatile_impl::type)