move.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // -*- C++ -*-
  2. //===----------------------------------------------------------------------===//
  3. //
  4. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5. // See https://llvm.org/LICENSE.txt for license information.
  6. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #ifndef _LIBCPP___UTILITY_MOVE_H
  10. #define _LIBCPP___UTILITY_MOVE_H
  11. #include <__config>
  12. #include <type_traits>
  13. #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
  14. # pragma GCC system_header
  15. #endif
  16. _LIBCPP_BEGIN_NAMESPACE_STD
  17. template <class _Tp>
  18. _LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR typename remove_reference<_Tp>::type&&
  19. move(_Tp&& __t) _NOEXCEPT {
  20. typedef _LIBCPP_NODEBUG typename remove_reference<_Tp>::type _Up;
  21. return static_cast<_Up&&>(__t);
  22. }
  23. #ifndef _LIBCPP_CXX03_LANG
  24. template <class _Tp>
  25. using __move_if_noexcept_result_t =
  26. typename conditional<!is_nothrow_move_constructible<_Tp>::value && is_copy_constructible<_Tp>::value, const _Tp&,
  27. _Tp&&>::type;
  28. #else // _LIBCPP_CXX03_LANG
  29. template <class _Tp>
  30. using __move_if_noexcept_result_t = const _Tp&;
  31. #endif
  32. template <class _Tp>
  33. _LIBCPP_NODISCARD_EXT inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 __move_if_noexcept_result_t<_Tp>
  34. move_if_noexcept(_Tp& __x) _NOEXCEPT {
  35. return _VSTD::move(__x);
  36. }
  37. _LIBCPP_END_NAMESPACE_STD
  38. #endif // _LIBCPP___UTILITY_MOVE_H