cplusplus.hpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. } // namespace types::traits
  39. namespace types {
  40. template <typename T>
  41. T&& move(T& val)
  42. {
  43. return static_cast<T&&>(val);
  44. }
  45. template <typename T>
  46. T&& forward(typename traits::remove_reference<T>::type& val)
  47. {
  48. return static_cast<T&&>(val);
  49. }
  50. template <typename T, T _value>
  51. struct constant_value {
  52. static constexpr T value = _value;
  53. };
  54. using true_type = constant_value<bool, true>;
  55. using false_type = constant_value<bool, false>;
  56. template <typename>
  57. struct template_true_type : public true_type {
  58. };
  59. template <typename>
  60. struct template_false_type : public false_type {
  61. };
  62. template <typename, typename>
  63. struct is_same : false_type {
  64. };
  65. template <typename T>
  66. struct is_same<T, T> : true_type {
  67. };
  68. } // namespace types
  69. #endif