Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
6 * This material is provided "as is", with absolutely no warranty expressed
7 * or implied. Any use is at your own risk.
9 * Permission to use or copy this software for any purpose is hereby granted
10 * without fee, provided the above notices are retained on all copies.
11 * Permission to modify the code and to distribute modified code is granted,
12 * provided the above notices are retained, and a notice that the code was
13 * modified is included with the above copyright notice.
17 #ifndef _STLP_MOVE_CONSTRUCT_FWK_H
18 #define _STLP_MOVE_CONSTRUCT_FWK_H
20 #ifndef _STLP_TYPE_TRAITS_H
21 # include <stl/type_traits.h>
26 /*************************************************************
27 * Move constructor framework
28 *************************************************************/
30 /*************************************************************
32 *The source HAS to be a valid instance after the move!
33 *************************************************************/
37 explicit __move_source (_Tp &_src) : _M_data(_src)
45 //We explicitely forbid assignment to avoid warning:
46 typedef __move_source<_Tp> _Self;
47 _Self& operator = (_Self const&);
50 //Class used to signal move constructor support, implementation and type.
52 struct __move_traits {
54 * implemented tells if a the special move constructor has to be called or the classic
55 * copy constructor is just fine. Most of the time the copy constructor is fine only
56 * if the following info is true.
58 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && \
59 !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && \
60 !defined (_STLP_NO_MOVE_SEMANTIC)
61 typedef typename _IsSTLportClass<_Tp>::_Ret implemented;
63 typedef __false_type implemented;
66 * complete tells if the move is complete or partial, that is to say, does the source
67 * needs to be destroyed once it has been moved.
69 typedef typename __type_traits<_Tp>::has_trivial_destructor complete;
72 #if !defined (_STLP_NO_MOVE_SEMANTIC)
73 typedef __true_type __stlp_movable;
75 typedef __false_type __stlp_movable;
78 _STLP_MOVE_TO_PRIV_NAMESPACE
81 * This struct should never be used if the user has not explicitely stipulated
82 * that its class support the full move concept. To check that the return type
83 * in such a case will be __invalid_source<_Tp> to generate a compile error
84 * revealing the configuration problem.
87 struct _MoveSourceTraits {
88 typedef typename __move_traits<_Tp>::implemented _MvImpRet;
89 #if defined (__BORLANDC__)
90 typedef typename __selectT<_MvImpRet,
92 enum {_MvImp = __type2bool<_MvImpRet>::_Ret};
93 typedef typename __select<_MvImp,
96 _Tp const&>::_Ret _Type;
101 inline _STLP_TYPENAME_ON_RETURN_TYPE _MoveSourceTraits<_Tp>::_Type
102 _AsMoveSource (_Tp &src) {
103 typedef typename _MoveSourceTraits<_Tp>::_Type _SrcType;
104 return _SrcType(src);
107 //Helper structs used for many class.
109 struct __move_traits_aux {
110 typedef typename __move_traits<_Tp>::implemented implemented;
111 typedef typename __move_traits<_Tp>::complete complete;
114 template <class _Tp1, class _Tp2>
115 struct __move_traits_aux2 {
116 typedef __move_traits<_Tp1> _MoveTraits1;
117 typedef __move_traits<_Tp2> _MoveTraits2;
119 typedef typename _Lor2<typename _MoveTraits1::implemented,
120 typename _MoveTraits2::implemented>::_Ret implemented;
121 typedef typename _Land2<typename _MoveTraits1::complete,
122 typename _MoveTraits2::complete>::_Ret complete;
126 * Most of the time a class implement a move constructor but its use depends
127 * on a third party, this is what the following struct are for.
130 struct __move_traits_help {
131 typedef __true_type implemented;
132 typedef typename __move_traits<_Tp>::complete complete;
135 template <class _Tp1, class _Tp2>
136 struct __move_traits_help1 {
137 typedef __move_traits<_Tp1> _MoveTraits1;
138 typedef __move_traits<_Tp2> _MoveTraits2;
140 typedef typename _Lor2<typename _MoveTraits1::implemented,
141 typename _MoveTraits2::implemented>::_Ret implemented;
142 typedef typename _Land2<typename _MoveTraits1::complete,
143 typename _MoveTraits2::complete>::_Ret complete;
146 template <class _Tp1, class _Tp2>
147 struct __move_traits_help2 {
148 typedef __move_traits<_Tp1> _MoveTraits1;
149 typedef __move_traits<_Tp2> _MoveTraits2;
151 typedef __stlp_movable implemented;
152 typedef typename _Land2<typename _MoveTraits1::complete,
153 typename _MoveTraits2::complete>::_Ret complete;
156 _STLP_MOVE_TO_STD_NAMESPACE
160 #endif /* _STLP_MOVE_CONSTRUCT_FWK_H */