blob: 759641f2d88867f62c172fb4f18b9463d0164136 [file] [log] [blame]
// (C) Copyright John Maddock 2005.
// Use, modification and distribution are subject to 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)
#ifdef TEST_STD_HEADERS
#include <type_traits>
#else
#include <boost/tr1/type_traits.hpp>
#endif
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/is_base_and_derived.hpp>
template <class T>
void check_value_trait(const T&)
{
T t;
(void)t;
typedef typename T::type type;
typedef typename T::value_type value_type;
BOOST_STATIC_ASSERT((::boost::is_base_and_derived<
std::tr1::integral_constant<value_type, T::value>, T>::value));
BOOST_STATIC_ASSERT((::boost::is_same<
std::tr1::integral_constant<value_type, T::value>, type>::value));
}
template <class T>
void check_transform_trait(const T* p)
{
typedef typename T::type type;
}
struct UDT{};
union union_type{ char c; int i; };
enum enum_type{ one, two };
#define check_unary_trait(trait)\
check_value_trait(std::tr1::trait<void>());\
check_value_trait(std::tr1::trait<int>());\
check_value_trait(std::tr1::trait<float>());\
check_value_trait(std::tr1::trait<UDT>());\
/*check_value_trait(std::tr1::trait<union_type>());*/\
check_value_trait(std::tr1::trait<enum_type>());\
check_value_trait(std::tr1::trait<void *>());\
check_value_trait(std::tr1::trait<UDT&>());\
check_value_trait(std::tr1::trait<int (void)>());\
check_value_trait(std::tr1::trait<int (&)(void)>());\
check_value_trait(std::tr1::trait<int (*)(void)>());\
check_value_trait(std::tr1::trait<int (UDT::*)(void)>());\
check_value_trait(std::tr1::trait<int (UDT::*)>());\
check_value_trait(std::tr1::trait<int[4]>());\
check_value_trait(std::tr1::trait<int[]>());
#define check_binary_trait(trait)\
check_value_trait(std::tr1::trait<void, int>());\
check_value_trait(std::tr1::trait<int, double>());\
check_value_trait(std::tr1::trait<float, float>());\
check_value_trait(std::tr1::trait<UDT, UDT&>());\
/*check_value_trait(std::tr1::trait<union_type>());*/\
check_value_trait(std::tr1::trait<enum_type, enum_type>());\
check_value_trait(std::tr1::trait<void *, const void*>());\
check_value_trait(std::tr1::trait<UDT&, int>());\
check_value_trait(std::tr1::trait<int (void), int (void)>());\
check_value_trait(std::tr1::trait<int (&)(void), int (void)>());\
check_value_trait(std::tr1::trait<int (*)(void), int (void)>());\
check_value_trait(std::tr1::trait<int (UDT::*)(void), int (void)>());\
check_value_trait(std::tr1::trait<int (UDT::*), int (UDT::*)>());\
check_value_trait(std::tr1::trait<int[4], int[3]>());\
check_value_trait(std::tr1::trait<int[4], int[4]>());
#define check_transform(trait)\
check_transform_trait((std::tr1::trait<void>*)(0));\
check_transform_trait((std::tr1::trait<int>*)(0));\
check_transform_trait((std::tr1::trait<float>*)(0));\
check_transform_trait((std::tr1::trait<UDT>*)(0));\
check_transform_trait((std::tr1::trait<enum_type>*)(0));\
check_transform_trait((std::tr1::trait<void *>*)(0));\
check_transform_trait((std::tr1::trait<UDT&>*)(0));\
check_transform_trait((std::tr1::trait<int (void)>*)(0));\
check_transform_trait((std::tr1::trait<int (&)(void)>*)(0));\
check_transform_trait((std::tr1::trait<int (*)(void)>*)(0));\
check_transform_trait((std::tr1::trait<int (UDT::*)(void)>*)(0));\
check_transform_trait((std::tr1::trait<int (UDT::*)>*)(0));\
check_transform_trait((std::tr1::trait<int[4]>*)(0));
int main()
{
check_unary_trait(is_void);
check_unary_trait(is_integral);
check_unary_trait(is_floating_point);
check_unary_trait(is_array);
check_unary_trait(is_pointer);
check_unary_trait(is_reference);
check_unary_trait(is_member_object_pointer);
check_unary_trait(is_member_function_pointer);
check_unary_trait(is_enum);
check_unary_trait(is_union);
check_unary_trait(is_class);
check_unary_trait(is_function);
check_unary_trait(is_arithmetic);
check_unary_trait(is_fundamental);
check_unary_trait(is_object);
check_unary_trait(is_scalar);
check_unary_trait(is_compound);
check_unary_trait(is_member_pointer);
check_unary_trait(is_const);
check_unary_trait(is_volatile);
check_unary_trait(is_pod);
check_unary_trait(is_empty);
check_unary_trait(is_polymorphic);
check_unary_trait(is_abstract);
check_unary_trait(has_trivial_constructor);
check_unary_trait(has_trivial_copy);
check_unary_trait(has_trivial_assign);
check_unary_trait(has_trivial_destructor);
check_unary_trait(has_nothrow_constructor);
check_unary_trait(has_nothrow_copy);
check_unary_trait(has_nothrow_assign);
check_unary_trait(has_virtual_destructor);
check_unary_trait(is_signed);
check_unary_trait(is_unsigned);
check_value_trait(std::tr1::alignment_of<int>());
check_value_trait(std::tr1::alignment_of<UDT>());
check_value_trait(std::tr1::alignment_of<int[4]>());
check_unary_trait(rank);
check_unary_trait(extent);
check_binary_trait(is_same);
check_binary_trait(is_base_of);
check_binary_trait(is_convertible);
check_transform(remove_const);
check_transform(remove_volatile);
check_transform(remove_cv);
check_transform(add_const);
check_transform(add_volatile);
check_transform(add_cv);
check_transform(remove_reference);
check_transform(add_reference);
check_transform(remove_extent);
check_transform(remove_all_extents);
check_transform(remove_pointer);
check_transform(add_pointer);
check_transform_trait((::std::tr1::aligned_storage<1,1>*)(0));
check_transform_trait((::std::tr1::aligned_storage<4,1>*)(0));
check_transform_trait((::std::tr1::aligned_storage<2,2>*)(0));
check_transform_trait((::std::tr1::aligned_storage<4,2>*)(0));
check_transform_trait((::std::tr1::aligned_storage<4,4>*)(0));
check_transform_trait((::std::tr1::aligned_storage<4,4>*)(0));
check_transform_trait((::std::tr1::aligned_storage<8,8>*)(0));
return 0;
}