cplusplus.hpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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::inner {
  13. template <typename Tp, typename>
  14. struct remove_pointer {
  15. using type = Tp;
  16. };
  17. template <typename Tp, typename T>
  18. struct remove_pointer<Tp, T*> {
  19. using type = T;
  20. };
  21. template <typename Tr, typename>
  22. struct remove_reference {
  23. using type = Tr;
  24. };
  25. template <typename Tr, typename T>
  26. struct remove_reference<Tr, T&> {
  27. using type = T;
  28. };
  29. } // namespace types::traits::inner
  30. namespace types::traits {
  31. template <typename Tp>
  32. struct remove_pointer
  33. : inner::remove_pointer<Tp, Tp> {
  34. };
  35. template <typename Tr>
  36. struct remove_reference
  37. : inner::remove_reference<Tr, Tr> {
  38. };
  39. template <typename T>
  40. struct add_pointer {
  41. using type = T*;
  42. };
  43. template <typename T>
  44. struct add_reference {
  45. using type = T&;
  46. };
  47. template <typename T>
  48. struct remove_cv {
  49. using type = T;
  50. };
  51. template <typename T>
  52. struct remove_cv<const T> {
  53. using type = T;
  54. };
  55. template <typename T>
  56. struct remove_cv<volatile T> {
  57. using type = T;
  58. };
  59. template <typename T>
  60. struct remove_cv<const volatile T> {
  61. using type = T;
  62. };
  63. template <typename T>
  64. struct is_pointer : false_type {
  65. };
  66. template <typename T>
  67. struct is_pointer<T*> : true_type {
  68. };
  69. template <typename T>
  70. struct decay {
  71. private:
  72. using U = remove_reference<T>;
  73. public:
  74. using type = typename remove_cv<U>::type;
  75. };
  76. } // namespace types::traits
  77. namespace types {
  78. template <typename T>
  79. T&& move(T& val)
  80. {
  81. return static_cast<T&&>(val);
  82. }
  83. template <typename T>
  84. T&& forward(typename traits::remove_reference<T>::type& val)
  85. {
  86. return static_cast<T&&>(val);
  87. }
  88. template <typename>
  89. struct template_true_type : public true_type {
  90. };
  91. template <typename>
  92. struct template_false_type : public false_type {
  93. };
  94. template <typename, typename>
  95. struct is_same : false_type {
  96. };
  97. template <typename T>
  98. struct is_same<T, T> : true_type {
  99. };
  100. template <typename T>
  101. struct add_rvalue_reference {
  102. using type = T&&;
  103. };
  104. template <>
  105. struct add_rvalue_reference<void> {
  106. using type = void;
  107. };
  108. template <typename Src, typename Dst>
  109. concept convertible_to = (traits::is_pointer<Src>::value && is_same<Dst, uint32_t>::value)
  110. || (traits::is_pointer<Dst>::value && is_same<Src, uint32_t>::value)
  111. || requires(Src _src)
  112. {
  113. { static_cast<Dst>(_src) };
  114. };
  115. template <typename A, typename B>
  116. concept same_as = is_same<A, B>::value;
  117. } // namespace types
  118. #endif