traits.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // Copyright Louis Dionne 2013-2017
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. #include <boost/hana/traits.hpp>
  5. #include <boost/hana/assert.hpp>
  6. #include <boost/hana/integral_constant.hpp>
  7. #include <boost/hana/type.hpp>
  8. namespace hana = boost::hana;
  9. enum Enumeration { };
  10. struct Structure { };
  11. constexpr auto e = hana::type_c<Enumeration>;
  12. constexpr auto s = hana::type_c<Structure>;
  13. int main() {
  14. // We just make sure that they compile. If the forwarding to `std::` is
  15. // well done, it is the job of `std::` to return the right thing.
  16. ///////////////////////
  17. // Type properties
  18. ///////////////////////
  19. // Primary type categories
  20. static_assert(!hana::traits::is_void(s), "the traits should be compile-time checkable");
  21. hana::traits::is_null_pointer(s);
  22. hana::traits::is_integral(s);
  23. hana::traits::is_floating_point(s);
  24. hana::traits::is_array(s);
  25. hana::traits::is_enum(s);
  26. hana::traits::is_union(s);
  27. hana::traits::is_class(s);
  28. hana::traits::is_function(s);
  29. hana::traits::is_pointer(s);
  30. hana::traits::is_lvalue_reference(s);
  31. hana::traits::is_rvalue_reference(s);
  32. hana::traits::is_member_object_pointer(s);
  33. hana::traits::is_member_function_pointer(s);
  34. // Composite type categories
  35. hana::traits::is_fundamental(s);
  36. hana::traits::is_arithmetic(s);
  37. hana::traits::is_scalar(s);
  38. hana::traits::is_object(s);
  39. hana::traits::is_compound(s);
  40. hana::traits::is_reference(s);
  41. hana::traits::is_member_pointer(s);
  42. // Type properties
  43. hana::traits::is_const(s);
  44. hana::traits::is_volatile(s);
  45. hana::traits::is_trivial(s);
  46. hana::traits::is_trivially_copyable(s);
  47. hana::traits::is_standard_layout(s);
  48. hana::traits::is_pod(s);
  49. hana::traits::is_literal_type(s);
  50. hana::traits::is_empty(s);
  51. hana::traits::is_polymorphic(s);
  52. hana::traits::is_abstract(s);
  53. hana::traits::is_signed(s);
  54. hana::traits::is_unsigned(s);
  55. // Supported operations
  56. hana::traits::is_constructible(s, s);
  57. hana::traits::is_trivially_constructible(s, s);
  58. hana::traits::is_nothrow_constructible(s, s);
  59. hana::traits::is_default_constructible(s);
  60. hana::traits::is_trivially_default_constructible(s);
  61. hana::traits::is_nothrow_default_constructible(s);
  62. hana::traits::is_copy_constructible(s);
  63. hana::traits::is_trivially_copy_constructible(s);
  64. hana::traits::is_nothrow_copy_constructible(s);
  65. hana::traits::is_move_constructible(s);
  66. hana::traits::is_trivially_move_constructible(s);
  67. hana::traits::is_nothrow_move_constructible(s);
  68. hana::traits::is_assignable(s, s);
  69. hana::traits::is_trivially_assignable(s, s);
  70. hana::traits::is_nothrow_assignable(s, s);
  71. hana::traits::is_copy_assignable(s);
  72. hana::traits::is_trivially_copy_assignable(s);
  73. hana::traits::is_nothrow_copy_assignable(s);
  74. hana::traits::is_move_assignable(s);
  75. hana::traits::is_trivially_move_assignable(s);
  76. hana::traits::is_nothrow_move_assignable(s);
  77. hana::traits::is_destructible(s);
  78. hana::traits::is_trivially_destructible(s);
  79. hana::traits::is_nothrow_destructible(s);
  80. hana::traits::has_virtual_destructor(s);
  81. // Property queries
  82. hana::traits::alignment_of(s);
  83. hana::traits::rank(s);
  84. hana::traits::extent(s);
  85. hana::traits::extent(hana::type_c<int[2][3]>, hana::uint_c<1>);
  86. // Type relationships
  87. hana::traits::is_same(s, s);
  88. hana::traits::is_base_of(s, s);
  89. hana::traits::is_convertible(s, s);
  90. ///////////////////////
  91. // Type modifications
  92. ///////////////////////
  93. // Const-volatility specifiers
  94. hana::traits::remove_cv(s);
  95. hana::traits::remove_const(s);
  96. hana::traits::remove_volatile(s);
  97. hana::traits::add_cv(s);
  98. hana::traits::add_const(s);
  99. hana::traits::add_volatile(s);
  100. // References
  101. hana::traits::remove_reference(s);
  102. hana::traits::add_lvalue_reference(s);
  103. hana::traits::add_rvalue_reference(s);
  104. // Pointers
  105. hana::traits::remove_pointer(s);
  106. hana::traits::add_pointer(s);
  107. // Sign modifiers
  108. hana::traits::make_signed(hana::type_c<unsigned>);
  109. hana::traits::make_unsigned(hana::type_c<signed>);
  110. // Arrays
  111. hana::traits::remove_extent(s);
  112. hana::traits::remove_all_extents(s);
  113. // Miscellaneous transformations
  114. hana::traits::aligned_storage(hana::size_c<1>);
  115. hana::traits::aligned_storage(hana::size_c<1>, hana::size_c<1>);
  116. hana::traits::aligned_union(hana::size_c<0>, s);
  117. hana::traits::decay(s);
  118. hana::traits::common_type(s, s);
  119. hana::traits::underlying_type(e);
  120. using FunctionPointer = void(*)();
  121. hana::traits::result_of(hana::type_c<FunctionPointer(void)>);
  122. ///////////////////////
  123. // Utilities
  124. ///////////////////////
  125. using Z = decltype(hana::traits::declval(hana::type_c<Structure>));
  126. }