type_with_alignment_test.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. // (C) Copyright John Maddock 2000.
  2. // Use, modification and distribution are subject to the
  3. // Boost Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifdef TEST_STD
  6. # include <type_traits>
  7. #else
  8. # include <boost/type_traits/alignment_of.hpp>
  9. # include <boost/type_traits/type_with_alignment.hpp>
  10. # include <boost/type_traits/is_pod.hpp>
  11. #endif
  12. #include "test.hpp"
  13. #include "check_integral_constant.hpp"
  14. #if defined(BOOST_MSVC) || (defined(BOOST_INTEL) && defined(_MSC_VER))
  15. #if (_MSC_VER >= 1400) && defined(_M_IX86)
  16. #include <xmmintrin.h>
  17. #endif
  18. struct __declspec(align(8)) a8 { char m[8]; };
  19. struct __declspec(align(16)) a16 { char m[16]; };
  20. struct __declspec(align(32)) a32 { char m[32]; };
  21. struct __declspec(align(64)) a64 { char m[64]; };
  22. struct __declspec(align(128)) a128 { char m[128]; };
  23. #endif
  24. #ifdef __CLR_VER
  25. #pragma warning(disable:4793) // vaarg function
  26. #endif
  27. void check_call2(...){}
  28. template <class T>
  29. void check_call(const T& v)
  30. {
  31. check_call2(v);
  32. }
  33. #define TYPE_WITH_ALIGNMENT_TEST(T)\
  34. {\
  35. std::cout << "\ntesting type " << typeid(T).name() << std::endl;\
  36. std::cout << "Alignment of T is " << ::tt::alignment_of< T >::value << std::endl;\
  37. std::cout << "Aligned type is " << typeid(::tt::type_with_alignment< ::tt::alignment_of< T >::value>::type).name() << std::endl;\
  38. std::cout << "Alignment of aligned type is " << ::tt::alignment_of<\
  39. ::tt::type_with_alignment<\
  40. ::tt::alignment_of< T >::value\
  41. >::type\
  42. >::value << std::endl;\
  43. BOOST_CHECK(::tt::alignment_of<\
  44. ::tt::type_with_alignment<\
  45. ::tt::alignment_of< T >::value\
  46. >::type\
  47. >::value == ::boost::alignment_of< T >::value);\
  48. BOOST_CHECK(::tt::is_pod<\
  49. ::tt::type_with_alignment<\
  50. ::tt::alignment_of< T >::value>::type\
  51. >::value);\
  52. }
  53. #define TYPE_WITH_ALIGNMENT_TEST_EX(T)\
  54. TYPE_WITH_ALIGNMENT_TEST(T)\
  55. {\
  56. ::tt::type_with_alignment<\
  57. ::tt::alignment_of< T >::value\
  58. >::type val;\
  59. check_call(val);\
  60. }
  61. TT_TEST_BEGIN(type_with_alignment)
  62. TYPE_WITH_ALIGNMENT_TEST_EX(char)
  63. TYPE_WITH_ALIGNMENT_TEST_EX(short)
  64. TYPE_WITH_ALIGNMENT_TEST_EX(int)
  65. TYPE_WITH_ALIGNMENT_TEST_EX(long)
  66. TYPE_WITH_ALIGNMENT_TEST_EX(float)
  67. TYPE_WITH_ALIGNMENT_TEST_EX(double)
  68. TYPE_WITH_ALIGNMENT_TEST_EX(long double)
  69. #ifdef BOOST_HAS_LONG_LONG
  70. TYPE_WITH_ALIGNMENT_TEST_EX(::boost::long_long_type)
  71. #endif
  72. #ifdef BOOST_HAS_MS_INT64
  73. TYPE_WITH_ALIGNMENT_TEST_EX(__int64)
  74. #endif
  75. TYPE_WITH_ALIGNMENT_TEST_EX(int[4])
  76. TYPE_WITH_ALIGNMENT_TEST_EX(int(*)(int))
  77. TYPE_WITH_ALIGNMENT_TEST_EX(int*)
  78. TYPE_WITH_ALIGNMENT_TEST_EX(VB)
  79. TYPE_WITH_ALIGNMENT_TEST_EX(VD)
  80. TYPE_WITH_ALIGNMENT_TEST_EX(enum_UDT)
  81. TYPE_WITH_ALIGNMENT_TEST_EX(mf2)
  82. TYPE_WITH_ALIGNMENT_TEST_EX(POD_UDT)
  83. TYPE_WITH_ALIGNMENT_TEST_EX(empty_UDT)
  84. TYPE_WITH_ALIGNMENT_TEST_EX(union_UDT)
  85. #if defined(BOOST_MSVC) || (defined(BOOST_INTEL) && defined(_MSC_VER))
  86. #if (_MSC_VER >= 1400) && defined(_M_IX86)
  87. TYPE_WITH_ALIGNMENT_TEST(__m128)
  88. TYPE_WITH_ALIGNMENT_TEST(__m64)
  89. #endif
  90. TYPE_WITH_ALIGNMENT_TEST(a8)
  91. TYPE_WITH_ALIGNMENT_TEST(a16)
  92. TYPE_WITH_ALIGNMENT_TEST(a32)
  93. #endif
  94. TT_TEST_END