utility 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #ifndef __GBLIBCPP_UTILITY__
  2. #define __GBLIBCPP_UTILITY__
  3. namespace std {
  4. namespace __helpers {
  5. template <typename T>
  6. struct __utility_remove_reference { using type = T; };
  7. template <typename T>
  8. struct __utility_remove_reference<T&> { using type = T; };
  9. template <typename T>
  10. struct __utility_remove_reference<T&&> { using type = T; };
  11. };
  12. template <typename T>
  13. constexpr typename __helpers::__utility_remove_reference<T>::type&&
  14. move(T&& val) noexcept
  15. {
  16. return static_cast<
  17. typename __helpers::__utility_remove_reference<T>::type&&
  18. >(val);
  19. }
  20. template <typename T>
  21. constexpr T&& forward(
  22. typename __helpers::__utility_remove_reference<T>::type& val) noexcept
  23. {
  24. return static_cast<T&&>(val);
  25. }
  26. template <typename T>
  27. constexpr T&& forward(
  28. typename __helpers::__utility_remove_reference<T>::type&& val) noexcept
  29. {
  30. return static_cast<T&&>(val);
  31. }
  32. template <typename T, typename U = T>
  33. constexpr T exchange(T& dst, U&& val)
  34. {
  35. T tmp = move(dst);
  36. dst = forward<U>(val);
  37. return tmp;
  38. }
  39. } // namespace std
  40. #endif