diff --git a/development/alignment_test.cpp b/development/alignment_test.cpp index 44f50ce..b7c2a6f 100644 --- a/development/alignment_test.cpp +++ b/development/alignment_test.cpp @@ -33,6 +33,7 @@ int main(int argc, char* argv[]) //align_test(const int); align_test(VB); align_test(VD); + value_test(0, ::boost::alignment_of::value); return check_result(argc, argv); } diff --git a/development/composite_traits_test.cpp b/development/composite_traits_test.cpp index 7b496a5..e6e564a 100644 --- a/development/composite_traits_test.cpp +++ b/development/composite_traits_test.cpp @@ -43,6 +43,7 @@ int main(int argc, char* argv[]) value_test(true, boost::is_array::value) value_test(false, boost::is_array::value) value_test(false, boost::is_array::value) + value_test(false, boost::is_array::value) value_test(false, boost::is_pointer::value) value_test(false, boost::is_pointer::value) @@ -60,6 +61,7 @@ int main(int argc, char* argv[]) value_test(false, boost::is_pointer::value) value_test(false, boost::is_pointer::value) value_test(false, boost::is_pointer::value) + value_test(false, boost::is_pointer::value) value_test(true, boost::is_pointer::value) value_test(true, boost::is_pointer::value) @@ -78,6 +80,7 @@ int main(int argc, char* argv[]) value_test(true, boost::is_reference::value) value_test(true, boost::is_reference::value) value_test(true, boost::is_reference::value) + value_test(false, boost::is_reference::value) value_test(false, boost::is_member_pointer::value) value_test(false, boost::is_member_pointer::value) @@ -87,11 +90,13 @@ int main(int argc, char* argv[]) value_test(true, boost::is_member_pointer::value) value_test(true, boost::is_member_pointer::value) value_test(true, boost::is_member_pointer::value) + value_test(false, boost::is_member_pointer::value) value_test(false, boost::is_enum::value) value_test(true, boost::is_enum::value) value_test(false, boost::is_enum::value) value_test(false, boost::is_enum::value) + value_test(false, boost::is_enum::value) return check_result(argc, argv); } diff --git a/development/include/boost/type_traits/alignment_traits.hpp b/development/include/boost/type_traits/alignment_traits.hpp index b325017..7de0c30 100644 --- a/development/include/boost/type_traits/alignment_traits.hpp +++ b/development/include/boost/type_traits/alignment_traits.hpp @@ -52,12 +52,28 @@ struct alignment_of // that a reference is just a special pointer: #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template -class alignment_of +struct alignment_of { public: BOOST_DECL_MC(std::size_t, value, alignment_of::value); }; #endif +// +// void has to be treated specially: +template <> +struct alignment_of +{ BOOST_DECL_MC(std::size_t, value, 0); }; +#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS +template <> +struct alignment_of +{ BOOST_DECL_MC(std::size_t, value, 0); }; +template <> +struct alignment_of +{ BOOST_DECL_MC(std::size_t, value, 0); }; +template <> +struct alignment_of +{ BOOST_DECL_MC(std::size_t, value, 0); }; +#endif } // namespace boost diff --git a/development/include/boost/type_traits/ice.hpp b/development/include/boost/type_traits/ice.hpp index eefe00f..1cd5ceb 100644 --- a/development/include/boost/type_traits/ice.hpp +++ b/development/include/boost/type_traits/ice.hpp @@ -51,15 +51,15 @@ struct ice_or BOOST_DECL_MC(bool, value, false); }; -template +template struct ice_and; -template +template struct ice_and { BOOST_DECL_MC(bool, value, false); }; template <> -struct ice_and +struct ice_and { BOOST_DECL_MC(bool, value, true); }; diff --git a/development/include/boost/type_traits/object_traits.hpp b/development/include/boost/type_traits/object_traits.hpp index 31e353e..662dd6f 100644 --- a/development/include/boost/type_traits/object_traits.hpp +++ b/development/include/boost/type_traits/object_traits.hpp @@ -109,6 +109,7 @@ template struct is_POD BOOST_DECL_MC(bool, value, (::boost::type_traits::ice_or< ::boost::is_scalar::value, + ::boost::is_void::value, BOOST_IS_POD(T) >::value)); }; @@ -282,17 +283,21 @@ template struct is_empty { private: - typedef detail::empty_helper_chooser< - !is_convertible::value - & !is_convertible::value - & !is_pointer::value - & !is_member_pointer::value - & !is_array::value - & !is_convertible::value> chooser; + typedef ::boost::detail::empty_helper_chooser< + ::boost::type_traits::ice_and< + !::boost::is_convertible::value, + !::boost::is_convertible::value, + !::boost::is_pointer::value, + !::boost::is_member_pointer::value, + !::boost::is_array::value, + !::boost::is_void::value, + !::boost::is_convertible::value + >::value> chooser; typedef typename chooser::template rebind bound_type; typedef typename bound_type::type eh_type; public: - enum{ value = eh_type::value | BOOST_IS_EMPTY(T) }; + BOOST_DECL_MC(bool, value, + (::boost::type_traits::ice_or::value)); }; #else diff --git a/development/is_same_test.cpp b/development/is_same_test.cpp index 056799a..0803d3c 100644 --- a/development/is_same_test.cpp +++ b/development/is_same_test.cpp @@ -24,11 +24,19 @@ int main(int argc, char* argv[]) value_test(false, (::boost::is_same::value)) value_test(false, (::boost::is_same::value)) value_test(false, (::boost::is_same::value)) + value_test(false, (::boost::is_same::value)) + value_test(true, (::boost::is_same::value)) + value_test(false, (::boost::is_same::value)) return check_result(argc, argv); } // // define the number of failures expected for given compilers: +#ifdef BOOST_MSVC +// can't separate void and cv-void: +unsigned int expected_failures = 1; +#else unsigned int expected_failures = 0; +#endif diff --git a/development/object_type_traits_test.cpp b/development/object_type_traits_test.cpp index 04b4f50..edb9edf 100644 --- a/development/object_type_traits_test.cpp +++ b/development/object_type_traits_test.cpp @@ -50,6 +50,7 @@ int main(int argc, char* argv[]) value_test(false, boost::is_class::value) value_test(false, boost::is_class::value) value_test(false, boost::is_class::value) + value_test(false, boost::is_class::value) value_test(true, boost::is_object::value) value_test(true, boost::is_object::value) @@ -82,6 +83,7 @@ int main(int argc, char* argv[]) value_test(false, boost::is_POD::value) value_test(false, boost::is_POD::value) value_test(true, boost::is_POD::value) + value_test(true, boost::is_POD::value) value_test(true, boost::has_trivial_constructor::value) value_test(true, boost::has_trivial_constructor::value) @@ -96,6 +98,7 @@ int main(int argc, char* argv[]) value_test(false, boost::has_trivial_constructor::value) value_test(true, boost::has_trivial_constructor::value) value_test(true, boost::has_trivial_constructor::value) + value_test(true, boost::has_trivial_constructor::value) value_test(true, boost::has_trivial_copy::value) value_test(true, boost::has_trivial_copy::value) @@ -111,6 +114,7 @@ int main(int argc, char* argv[]) value_test(false, boost::has_trivial_copy::value) value_test(true, boost::has_trivial_copy::value) value_test(true, boost::has_trivial_copy::value) + value_test(true, boost::has_trivial_copy::value) value_test(true, boost::has_trivial_assign::value) value_test(true, boost::has_trivial_assign::value) @@ -126,6 +130,7 @@ int main(int argc, char* argv[]) value_test(false, boost::has_trivial_assign::value) value_test(true, boost::has_trivial_assign::value) value_test(true, boost::has_trivial_assign::value) + value_test(true, boost::has_trivial_assign::value) value_test(true, boost::has_trivial_destructor::value) value_test(true, boost::has_trivial_destructor::value) @@ -140,10 +145,12 @@ int main(int argc, char* argv[]) value_test(false, boost::has_trivial_destructor::value) value_test(false, boost::has_trivial_destructor::value) value_test(true, boost::has_trivial_destructor::value) + value_test(true, boost::has_trivial_destructor::value) soft_value_test(false, boost::is_empty::value) soft_value_test(false, boost::is_empty::value) soft_value_test(false, boost::is_empty::value) + soft_value_test(false, boost::is_empty::value) #if defined(__MWERKS__) // apparent compiler bug causes this to fail to compile: value_fail(false, boost::is_empty::value) diff --git a/development/transform_traits_test.cpp b/development/transform_traits_test.cpp index 48b7884..6c4d22a 100644 --- a/development/transform_traits_test.cpp +++ b/development/transform_traits_test.cpp @@ -21,11 +21,17 @@ int main(int argc, char* argv[]) type_test(volatile int, boost::remove_const::type) type_test(int, boost::remove_const::type) type_test(int*, boost::remove_const::type) + type_test(void, boost::remove_const::type) + type_test(void, boost::remove_const::type) + type_test(int, boost::remove_volatile::type) type_test(const int, boost::remove_volatile::type) type_test(const int, boost::remove_volatile::type) type_test(int, boost::remove_volatile::type) type_test(int*, boost::remove_volatile::type) + type_test(void, boost::remove_volatile::type) + type_test(void, boost::remove_volatile::type) + type_test(int, boost::remove_cv::type) type_test(int, boost::remove_cv::type) type_test(int, boost::remove_cv::type) @@ -34,6 +40,8 @@ int main(int argc, char* argv[]) type_test(int*, boost::remove_cv::type) type_test(int*, boost::remove_cv::type) type_test(const int *, boost::remove_cv::type) + type_test(void, boost::remove_cv::type) + type_test(void, boost::remove_cv::type) type_test(int, boost::remove_reference::type) type_test(const int, boost::remove_reference::type) @@ -41,10 +49,12 @@ int main(int argc, char* argv[]) type_test(const int, boost::remove_reference::type) type_test(volatile int, boost::remove_reference::type) type_test(int, boost::remove_reference::type) + type_test(void, boost::remove_reference::type) type_test(int, boost::remove_bounds::type) type_test(int*, boost::remove_bounds::type) type_test(int, boost::remove_bounds::type) + type_test(void, boost::remove_bounds::type) type_test(int[3], boost::remove_bounds::type) type_test(int, boost::remove_pointer::type) @@ -54,6 +64,7 @@ int main(int argc, char* argv[]) type_test(volatile int, boost::remove_pointer::type) type_test(int[3], boost::remove_pointer::type) type_test(int[2][3], boost::remove_pointer::type) + type_test(void, boost::remove_pointer::type) type_test(int&, boost::add_reference::type) type_test(const int&, boost::add_reference::type)