Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _MOVE_H
00031 #define _MOVE_H 1
00032
00033 #include <bits/c++config.h>
00034 #include <cstddef>
00035 #include <bits/concept_check.h>
00036
00037 #ifdef __GXX_EXPERIMENTAL_CXX0X__
00038 #include <type_traits>
00039
00040 _GLIBCXX_BEGIN_NAMESPACE(std)
00041
00042
00043 template<typename _Tp>
00044 struct identity
00045 {
00046 typedef _Tp type;
00047 };
00048
00049
00050
00051 template<typename _Tp>
00052 inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type
00053 forward(typename std::identity<_Tp>::type& __t)
00054 { return static_cast<_Tp&&>(__t); }
00055
00056
00057 template<typename _Tp>
00058 inline typename enable_if<!is_lvalue_reference<_Tp>::value, _Tp&&>::type
00059 forward(typename std::identity<_Tp>::type&& __t)
00060 { return static_cast<_Tp&&>(__t); }
00061
00062
00063 template<typename _Tp>
00064 inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type
00065 forward(typename std::identity<_Tp>::type __t)
00066 { return __t; }
00067
00068
00069 template<typename _Tp>
00070 inline typename enable_if<is_lvalue_reference<_Tp>::value, _Tp>::type
00071 forward(typename std::remove_reference<_Tp>::type&& __t) = delete;
00072
00073
00074
00075
00076
00077
00078
00079 template<typename _Tp>
00080 inline typename std::remove_reference<_Tp>::type&&
00081 move(_Tp&& __t)
00082 { return static_cast<typename std::remove_reference<_Tp>::type&&>(__t); }
00083
00084
00085
00086 _GLIBCXX_END_NAMESPACE
00087
00088 #define _GLIBCXX_MOVE(_Tp) std::move(_Tp)
00089 #define _GLIBCXX_FORWARD(_Tp, __val) std::forward<_Tp>(__val)
00090 #else
00091 #define _GLIBCXX_MOVE(_Tp) (_Tp)
00092 #define _GLIBCXX_FORWARD(_Tp, __val) (__val)
00093 #endif
00094
00095 _GLIBCXX_BEGIN_NAMESPACE(std)
00096
00097
00098
00099
00100
00101
00102
00103
00104 template<typename _Tp>
00105 inline void
00106 swap(_Tp& __a, _Tp& __b)
00107 {
00108
00109 __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
00110
00111 _Tp __tmp = _GLIBCXX_MOVE(__a);
00112 __a = _GLIBCXX_MOVE(__b);
00113 __b = _GLIBCXX_MOVE(__tmp);
00114 }
00115
00116
00117
00118 template<typename _Tp, size_t _Nm>
00119 inline void
00120 swap(_Tp (&__a)[_Nm], _Tp (&__b)[_Nm])
00121 {
00122 for (size_t __n = 0; __n < _Nm; ++__n)
00123 swap(__a[__n], __b[__n]);
00124 }
00125
00126 _GLIBCXX_END_NAMESPACE
00127
00128 #endif