utility 625 B

1234567891011121314151617181920212223242526272829303132333435
  1. #ifndef __GBLIBCPP_UTILITY__
  2. #define __GBLIBCPP_UTILITY__
  3. #include <type_traits>
  4. namespace std {
  5. template <typename T>
  6. constexpr remove_reference_t<T>&& move(T&& val)
  7. {
  8. return static_cast<remove_reference_t<T>&&>(val);
  9. }
  10. template <typename T>
  11. constexpr T&& forward(remove_reference_t<T>& val)
  12. {
  13. return static_cast<T&&>(val);
  14. }
  15. template <typename T>
  16. constexpr T&& forward(remove_reference_t<T>&& val)
  17. {
  18. return static_cast<T&&>(val);
  19. }
  20. template <typename T, typename U = T>
  21. constexpr T exchange(T& dst, U&& val)
  22. {
  23. T tmp = move(dst);
  24. dst = forward<U>(val);
  25. return tmp;
  26. }
  27. } // namespace std
  28. #endif