cplusplus.hpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #pragma once
  2. #include <types/stdint.h>
  3. #ifdef __cplusplus
  4. namespace types {
  5. template <typename T, T _value>
  6. struct constant_value {
  7. static constexpr T value = _value;
  8. };
  9. using true_type = constant_value<bool, true>;
  10. using false_type = constant_value<bool, false>;
  11. };
  12. namespace types::traits {
  13. template <typename T>
  14. struct remove_pointer {
  15. using type = T;
  16. };
  17. template <typename T>
  18. struct remove_pointer<T*> {
  19. using type = T;
  20. };
  21. template <typename T>
  22. struct remove_reference {
  23. using type = T;
  24. };
  25. template <typename T>
  26. struct remove_reference<T&> {
  27. using type = T;
  28. };
  29. template <typename T>
  30. struct remove_reference<T&&> {
  31. using type = T;
  32. };
  33. template <typename T>
  34. struct add_pointer {
  35. using type = T*;
  36. };
  37. template <typename T>
  38. struct add_reference {
  39. using type = T&;
  40. };
  41. template <typename T>
  42. struct remove_cv {
  43. using type = T;
  44. };
  45. template <typename T>
  46. struct remove_cv<const T> {
  47. using type = T;
  48. };
  49. template <typename T>
  50. struct remove_cv<volatile T> {
  51. using type = T;
  52. };
  53. template <typename T>
  54. struct remove_cv<const volatile T> {
  55. using type = T;
  56. };
  57. template <typename T>
  58. struct add_const {
  59. using type = const T;
  60. };
  61. template <typename T>
  62. struct add_const<const T> {
  63. using type = const T;
  64. };
  65. template <>
  66. struct add_const<void> {
  67. using type = void;
  68. };
  69. template <typename T>
  70. struct is_pointer : false_type {
  71. };
  72. template <typename T>
  73. struct is_pointer<T*> : true_type {
  74. };
  75. template <typename T>
  76. struct decay {
  77. private:
  78. using U = typename remove_reference<T>::type;
  79. public:
  80. using type = typename remove_cv<U>::type;
  81. };
  82. } // namespace types::traits
  83. namespace types {
  84. template <typename T>
  85. constexpr typename traits::remove_reference<T>::type&& move(T&& val)
  86. {
  87. return static_cast<typename traits::remove_reference<T>::type&&>(val);
  88. }
  89. template <typename T>
  90. constexpr T&& forward(typename traits::remove_reference<T>::type& val)
  91. {
  92. return static_cast<T&&>(val);
  93. }
  94. template <typename T>
  95. constexpr T&& forward(typename traits::remove_reference<T>::type&& val)
  96. {
  97. return static_cast<T&&>(val);
  98. }
  99. template <typename>
  100. struct template_true_type : public true_type {
  101. };
  102. template <typename>
  103. struct template_false_type : public false_type {
  104. };
  105. template <typename, typename>
  106. struct is_same : false_type {
  107. };
  108. template <typename T>
  109. struct is_same<T, T> : true_type {
  110. };
  111. template <typename T>
  112. struct add_rvalue_reference {
  113. using type = T&&;
  114. };
  115. template <>
  116. struct add_rvalue_reference<void> {
  117. using type = void;
  118. };
  119. template <typename Src, typename Dst>
  120. concept convertible_to = (traits::is_pointer<Src>::value && is_same<Dst, uint32_t>::value)
  121. || (traits::is_pointer<Dst>::value && is_same<Src, uint32_t>::value)
  122. || requires(Src _src)
  123. {
  124. { static_cast<Dst>(_src) };
  125. };
  126. template <typename T>
  127. concept PointerType = traits::is_pointer<T>::value;
  128. template <typename A, typename B>
  129. concept same_as = is_same<A, B>::value;
  130. } // namespace types
  131. #endif