cplusplus.hpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #pragma once
  2. #ifdef __cplusplus
  3. namespace types::traits::inner {
  4. template <typename Tp, typename>
  5. struct remove_pointer {
  6. using type = Tp;
  7. };
  8. template <typename Tp, typename T>
  9. struct remove_pointer<Tp, T*> {
  10. using type = T;
  11. };
  12. template <typename Tr, typename>
  13. struct remove_reference {
  14. using type = Tr;
  15. };
  16. template <typename Tr, typename T>
  17. struct remove_reference<Tr, T&> {
  18. using type = T;
  19. };
  20. } // namespace types::traits::inner
  21. namespace types::traits {
  22. template <typename Tp>
  23. struct remove_pointer
  24. : inner::remove_pointer<Tp, Tp> {
  25. };
  26. template <typename Tr>
  27. struct remove_reference
  28. : inner::remove_reference<Tr, Tr> {
  29. };
  30. template <typename T>
  31. struct add_pointer {
  32. using type = T*;
  33. };
  34. template <typename T>
  35. struct add_reference {
  36. using type = T&;
  37. };
  38. template <typename T>
  39. struct remove_cv {
  40. using type = T;
  41. };
  42. template <typename T>
  43. struct remove_cv<const T> {
  44. using type = T;
  45. };
  46. template <typename T>
  47. struct remove_cv<volatile T> {
  48. using type = T;
  49. };
  50. template <typename T>
  51. struct remove_cv<const volatile T> {
  52. using type = T;
  53. };
  54. template <typename T>
  55. struct decay {
  56. private:
  57. using U = remove_reference<T>;
  58. public:
  59. using type = typename remove_cv<U>::type;
  60. };
  61. } // namespace types::traits
  62. namespace types {
  63. template <typename T>
  64. T&& move(T& val)
  65. {
  66. return static_cast<T&&>(val);
  67. }
  68. template <typename T>
  69. T&& forward(typename traits::remove_reference<T>::type& val)
  70. {
  71. return static_cast<T&&>(val);
  72. }
  73. template <typename T, T _value>
  74. struct constant_value {
  75. static constexpr T value = _value;
  76. };
  77. using true_type = constant_value<bool, true>;
  78. using false_type = constant_value<bool, false>;
  79. template <typename>
  80. struct template_true_type : public true_type {
  81. };
  82. template <typename>
  83. struct template_false_type : public false_type {
  84. };
  85. template <typename, typename>
  86. struct is_same : false_type {
  87. };
  88. template <typename T>
  89. struct is_same<T, T> : true_type {
  90. };
  91. } // namespace types
  92. #endif