cplusplus.hpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #pragma once
  2. #include <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 <bool Expression, typename TTrue, typename TFalse>
  14. struct condition {
  15. using type = TFalse;
  16. };
  17. template <typename TTrue, typename TFalse>
  18. struct condition<true, TTrue, TFalse> {
  19. using type = TTrue;
  20. };
  21. template <typename T>
  22. struct remove_pointer {
  23. using type = T;
  24. };
  25. template <typename T>
  26. struct remove_pointer<T*> {
  27. using type = T;
  28. };
  29. template <typename T>
  30. struct remove_reference {
  31. using type = T;
  32. };
  33. template <typename T>
  34. struct remove_reference<T&> {
  35. using type = T;
  36. };
  37. template <typename T>
  38. struct remove_reference<T&&> {
  39. using type = T;
  40. };
  41. template <typename T>
  42. struct add_pointer {
  43. using type = T*;
  44. };
  45. template <typename T>
  46. struct add_reference {
  47. using type = T&;
  48. };
  49. template <typename T>
  50. struct remove_cv {
  51. using type = T;
  52. };
  53. template <typename T>
  54. struct remove_cv<const T> {
  55. using type = T;
  56. };
  57. template <typename T>
  58. struct remove_cv<volatile T> {
  59. using type = T;
  60. };
  61. template <typename T>
  62. struct remove_cv<const volatile T> {
  63. using type = T;
  64. };
  65. template <typename T>
  66. struct add_const {
  67. using type = const T;
  68. };
  69. template <typename T>
  70. struct add_const<const T> {
  71. using type = const T;
  72. };
  73. template <>
  74. struct add_const<void> {
  75. using type = void;
  76. };
  77. template <typename T>
  78. struct is_pointer : false_type {
  79. };
  80. template <typename T>
  81. struct is_pointer<T*> : true_type {
  82. };
  83. template <typename T>
  84. struct is_const : public false_type {
  85. };
  86. template <typename T>
  87. struct is_const<const T> : public true_type {
  88. };
  89. template <typename U, template <typename...> class T, typename...>
  90. struct is_template_instance : public false_type {
  91. };
  92. template <template <typename...> class T, typename... Ts>
  93. struct is_template_instance<T<Ts...>, T> : public true_type {
  94. };
  95. template <typename T>
  96. struct decay {
  97. private:
  98. using U = typename remove_reference<T>::type;
  99. public:
  100. using type = typename remove_cv<U>::type;
  101. };
  102. } // namespace types::traits
  103. namespace types {
  104. template <typename>
  105. struct template_true_type : public true_type {
  106. };
  107. template <typename>
  108. struct template_false_type : public false_type {
  109. };
  110. template <typename, typename>
  111. struct is_same : false_type {
  112. };
  113. template <typename T>
  114. struct is_same<T, T> : true_type {
  115. };
  116. template <typename T>
  117. struct add_rvalue_reference {
  118. using type = T&&;
  119. };
  120. template <>
  121. struct add_rvalue_reference<void> {
  122. using type = void;
  123. };
  124. template <typename Src, typename Dst>
  125. concept convertible_to = (traits::is_pointer<Src>::value && is_same<Dst, uint32_t>::value)
  126. || (traits::is_pointer<Dst>::value && is_same<Src, uint32_t>::value)
  127. || requires(Src _src)
  128. {
  129. { static_cast<Dst>(_src) };
  130. };
  131. template <typename T>
  132. concept PointerType = traits::is_pointer<T>::value;
  133. template <typename A, typename B>
  134. concept same_as = is_same<A, B>::value;
  135. class non_copyable {
  136. public:
  137. non_copyable() = default;
  138. non_copyable(const non_copyable&) = delete;
  139. non_copyable& operator=(const non_copyable&) = delete;
  140. };
  141. } // namespace types
  142. #endif