utility 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef __GBLIBCPP_UTILITY__
  2. #define __GBLIBCPP_UTILITY__
  3. #include <cstddef>
  4. namespace std {
  5. namespace __helpers {
  6. template <typename T>
  7. struct __utility_remove_reference { using type = T; };
  8. template <typename T>
  9. struct __utility_remove_reference<T&> { using type = T; };
  10. template <typename T>
  11. struct __utility_remove_reference<T&&> { using type = T; };
  12. };
  13. template <typename T>
  14. constexpr typename __helpers::__utility_remove_reference<T>::type&&
  15. move(T&& val) noexcept
  16. {
  17. return static_cast<
  18. typename __helpers::__utility_remove_reference<T>::type&&
  19. >(val);
  20. }
  21. template <typename T>
  22. constexpr T&& forward(
  23. typename __helpers::__utility_remove_reference<T>::type& val) noexcept
  24. {
  25. return static_cast<T&&>(val);
  26. }
  27. template <typename T>
  28. constexpr T&& forward(
  29. typename __helpers::__utility_remove_reference<T>::type&& val) noexcept
  30. {
  31. return static_cast<T&&>(val);
  32. }
  33. template <typename T, typename U = T>
  34. constexpr T exchange(T& dst, U&& val)
  35. {
  36. T tmp = move(dst);
  37. dst = forward<U>(val);
  38. return tmp;
  39. }
  40. template <typename T>
  41. constexpr void swap(T& a, T& b)
  42. {
  43. T tmp(std::move(a));
  44. a = std::move(b);
  45. b = std::move(tmp);
  46. }
  47. template <typename T, T... Ints>
  48. struct integer_sequence {
  49. static constexpr std::size_t size() noexcept { return sizeof...(Ints); }
  50. };
  51. template <std::size_t... Indicies>
  52. using index_sequence = integer_sequence<std::size_t, Indicies...>;
  53. template <std::size_t N, std::size_t... Indicies>
  54. struct make_index_sequence : public make_index_sequence<N-1, N-1, Indicies...> {};
  55. template <std::size_t... Indicies>
  56. struct make_index_sequence<0, Indicies...> : public index_sequence<Indicies...> {};
  57. template <typename... Ts>
  58. using index_sequence_for = make_index_sequence<sizeof...(Ts)>;
  59. } // namespace std
  60. #endif