meta_utils_core.hpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2015-2015.
  4. // Distributed under the Boost Software License, Version 1.0.
  5. // (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // See http://www.boost.org/libs/move for documentation.
  9. //
  10. //////////////////////////////////////////////////////////////////////////////
  11. //! \file
  12. #ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
  13. #define BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
  14. #ifndef BOOST_CONFIG_HPP
  15. # include <boost/config.hpp>
  16. #endif
  17. #
  18. #if defined(BOOST_HAS_PRAGMA_ONCE)
  19. # pragma once
  20. #endif
  21. //Small meta-typetraits to support move
  22. namespace boost {
  23. namespace move_detail {
  24. template<typename T>
  25. struct voider { typedef void type; };
  26. //////////////////////////////////////
  27. // if_c
  28. //////////////////////////////////////
  29. template<bool C, typename T1, typename T2>
  30. struct if_c
  31. {
  32. typedef T1 type;
  33. };
  34. template<typename T1, typename T2>
  35. struct if_c<false,T1,T2>
  36. {
  37. typedef T2 type;
  38. };
  39. //////////////////////////////////////
  40. // if_
  41. //////////////////////////////////////
  42. template<typename T1, typename T2, typename T3>
  43. struct if_ : if_c<0 != T1::value, T2, T3>
  44. {};
  45. //////////////////////////////////////
  46. // enable_if_c
  47. //////////////////////////////////////
  48. struct enable_if_nat{};
  49. template <bool B, class T = enable_if_nat>
  50. struct enable_if_c
  51. {
  52. typedef T type;
  53. };
  54. template <class T>
  55. struct enable_if_c<false, T> {};
  56. //////////////////////////////////////
  57. // enable_if
  58. //////////////////////////////////////
  59. template <class Cond, class T = enable_if_nat>
  60. struct enable_if : enable_if_c<Cond::value, T> {};
  61. //////////////////////////////////////
  62. // disable_if_c
  63. //////////////////////////////////////
  64. template <bool B, class T = enable_if_nat>
  65. struct disable_if_c
  66. : enable_if_c<!B, T>
  67. {};
  68. //////////////////////////////////////
  69. // disable_if
  70. //////////////////////////////////////
  71. template <class Cond, class T = enable_if_nat>
  72. struct disable_if : enable_if_c<!Cond::value, T> {};
  73. //////////////////////////////////////
  74. // integral_constant
  75. //////////////////////////////////////
  76. template<class T, T v>
  77. struct integral_constant
  78. {
  79. static const T value = v;
  80. typedef T value_type;
  81. typedef integral_constant<T, v> type;
  82. operator T() const { return value; }
  83. T operator()() const { return value; }
  84. };
  85. typedef integral_constant<bool, true > true_type;
  86. typedef integral_constant<bool, false > false_type;
  87. //////////////////////////////////////
  88. // is_same
  89. //////////////////////////////////////
  90. template<class T, class U>
  91. struct is_same
  92. {
  93. static const bool value = false;
  94. };
  95. template<class T>
  96. struct is_same<T, T>
  97. {
  98. static const bool value = true;
  99. };
  100. //////////////////////////////////////
  101. // enable_if_same
  102. //////////////////////////////////////
  103. template <class T, class U, class R = enable_if_nat>
  104. struct enable_if_same : enable_if<is_same<T, U>, R> {};
  105. //////////////////////////////////////
  106. // disable_if_same
  107. //////////////////////////////////////
  108. template <class T, class U, class R = enable_if_nat>
  109. struct disable_if_same : disable_if<is_same<T, U>, R> {};
  110. } //namespace move_detail {
  111. } //namespace boost {
  112. #endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP