cplusplus.hpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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, typename>
  57. struct is_same : false_type
  58. {};
  59. template <typename T>
  60. struct is_same<T, T>: true_type
  61. {};
  62. } // namespace types
  63. #endif