1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- #ifndef __GBLIBCPP_UTILITY__
- #define __GBLIBCPP_UTILITY__
- namespace std {
- namespace __helpers {
- template <typename T>
- struct __utility_remove_reference { using type = T; };
- template <typename T>
- struct __utility_remove_reference<T&> { using type = T; };
- template <typename T>
- struct __utility_remove_reference<T&&> { using type = T; };
- };
- template <typename T>
- constexpr typename __helpers::__utility_remove_reference<T>::type&&
- move(T&& val) noexcept
- {
- return static_cast<
- typename __helpers::__utility_remove_reference<T>::type&&
- >(val);
- }
- template <typename T>
- constexpr T&& forward(
- typename __helpers::__utility_remove_reference<T>::type& val) noexcept
- {
- return static_cast<T&&>(val);
- }
- template <typename T>
- constexpr T&& forward(
- typename __helpers::__utility_remove_reference<T>::type&& val) noexcept
- {
- return static_cast<T&&>(val);
- }
- template <typename T, typename U = T>
- constexpr T exchange(T& dst, U&& val)
- {
- T tmp = move(dst);
- dst = forward<U>(val);
- return tmp;
- }
- } // namespace std
- #endif
|