16 #ifndef BOOST_MOVE_CORE_HPP
17 #define BOOST_MOVE_CORE_HPP
19 #ifndef BOOST_CONFIG_HPP
23 #if defined(BOOST_HAS_PRAGMA_ONCE)
34 #if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
35 #define BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE) \
38 TYPE& operator=(TYPE &);\
40 typedef int boost_move_no_copy_constructor_or_assign; \
44 #define BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE) \
46 TYPE(TYPE const &) = delete;\
47 TYPE& operator=(TYPE const &) = delete;\
49 typedef int boost_move_no_copy_constructor_or_assign; \
52 #endif //BOOST_NO_CXX11_DELETED_FUNCTIONS
56 #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
60 #if defined(BOOST_MOVE_ADDRESS_SANITIZER_ON)
61 #define BOOST_MOVE_TO_RV_CAST(RV_TYPE, ARG) reinterpret_cast<RV_TYPE>(ARG)
63 #define BOOST_MOVE_TO_RV_CAST(RV_TYPE, ARG) static_cast<RV_TYPE>(ARG)
67 #if defined(__GNUC__) && (__GNUC__ >= 4) && \
69 defined(BOOST_GCC) || \
70 (defined(BOOST_INTEL) && (BOOST_INTEL_CXX_VERSION >= 1300)) \
72 #define BOOST_MOVE_ATTRIBUTE_MAY_ALIAS __attribute__((__may_alias__))
74 #define BOOST_MOVE_ATTRIBUTE_MAY_ALIAS
87 < ::boost::move_detail::is_class<T>::value
89 , ::boost::move_detail::nat
95 void operator=(rv const&);
96 } BOOST_MOVE_ATTRIBUTE_MAY_ALIAS;
105 namespace move_detail {
111 : integral_constant<bool, ::boost::move_detail::is_rv_impl<T>::value >
117 static const bool value = !is_rv<T>::value;
128 struct has_move_emulation_enabled
133 struct has_move_emulation_disabled
140 #define BOOST_RV_REF(TYPE)\
141 ::boost::rv< TYPE >& \
144 #define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
145 ::boost::rv< TYPE<ARG1, ARG2> >& \
148 #define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
149 ::boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
152 #define BOOST_RV_REF_BEG\
156 #define BOOST_RV_REF_END\
160 #define BOOST_RV_REF_BEG_IF_CXX11 \
164 #define BOOST_RV_REF_END_IF_CXX11 \
168 #define BOOST_FWD_REF(TYPE)\
172 #define BOOST_COPY_ASSIGN_REF(TYPE)\
173 const ::boost::rv< TYPE >& \
176 #define BOOST_COPY_ASSIGN_REF_BEG \
180 #define BOOST_COPY_ASSIGN_REF_END \
184 #define BOOST_COPY_ASSIGN_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
185 const ::boost::rv< TYPE<ARG1, ARG2> >& \
188 #define BOOST_COPY_ASSIGN_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
189 const ::boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
192 #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
193 const ::boost::rv< TYPE >& \
197 namespace move_detail {
199 template <
class Ret,
class T>
209 template <
class Ret,
class T>
219 template <
class Ret,
class T>
232 #define BOOST_MOVE_RET(RET_TYPE, REF)\
233 boost::move_detail::move_return< RET_TYPE >(REF)
236 #define BOOST_MOVE_BASE(BASE_TYPE, ARG) \
237 ::boost::move((BASE_TYPE&)(ARG))
245 #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
246 BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE)\
248 BOOST_MOVE_FORCEINLINE operator ::boost::rv<TYPE>&() \
249 { return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this); }\
250 BOOST_MOVE_FORCEINLINE operator const ::boost::rv<TYPE>&() const \
251 { return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this); }\
261 #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
263 BOOST_MOVE_FORCEINLINE TYPE& operator=(TYPE &t)\
264 { this->operator=(const_cast<const TYPE&>(t)); return *this;}\
266 BOOST_MOVE_FORCEINLINE operator ::boost::rv<TYPE>&() \
267 { return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this); }\
268 BOOST_MOVE_FORCEINLINE operator const ::boost::rv<TYPE>&() const \
269 { return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this); }\
273 #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
275 BOOST_MOVE_FORCEINLINE operator ::boost::rv<TYPE>&() \
276 { return *BOOST_MOVE_TO_RV_CAST(::boost::rv<TYPE>*, this); }\
277 BOOST_MOVE_FORCEINLINE operator const ::boost::rv<TYPE>&() const \
278 { return *BOOST_MOVE_TO_RV_CAST(const ::boost::rv<TYPE>*, this); }\
283 namespace move_detail{
287 {
typedef const T &
type; };
290 struct forward_type<
boost::rv<T> >
295 #else //BOOST_NO_CXX11_RVALUE_REFERENCES
300 #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
301 BOOST_MOVE_IMPL_NO_COPY_CTOR_OR_ASSIGN(TYPE)\
303 typedef int boost_move_emulation_t;\
310 #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
313 #if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
314 #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
316 #endif //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
340 #define BOOST_RV_REF(TYPE)\
350 #define BOOST_RV_REF_BEG\
360 #define BOOST_RV_REF_END\
366 #define BOOST_RV_REF_BEG_IF_CXX11 \
372 #define BOOST_RV_REF_END_IF_CXX11 \
378 #define BOOST_COPY_ASSIGN_REF(TYPE)\
384 #define BOOST_FWD_REF(TYPE)\
388 #if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
390 #define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
391 TYPE<ARG1, ARG2> && \
394 #define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
395 TYPE<ARG1, ARG2, ARG3> && \
398 #define BOOST_COPY_ASSIGN_REF_BEG \
402 #define BOOST_COPY_ASSIGN_REF_END \
406 #define BOOST_COPY_ASSIGN_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
407 const TYPE<ARG1, ARG2> & \
410 #define BOOST_COPY_ASSIGN_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
411 const TYPE<ARG1, ARG2, ARG3>& \
414 #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
418 #endif //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
420 #if !defined(BOOST_MOVE_MSVC_AUTO_MOVE_RETURN_BUG) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
442 #define BOOST_MOVE_RET(RET_TYPE, REF)\
451 namespace move_detail {
453 template <
class Ret,
class T>
462 template <
class Ret,
class T>
468 return static_cast< Ret&&
>(t);
474 #define BOOST_MOVE_RET(RET_TYPE, REF)\
475 boost::move_detail::move_return< RET_TYPE >(REF)
480 #define BOOST_MOVE_BASE(BASE_TYPE, ARG) \
488 ::boost::move((BASE_TYPE&)(ARG))
492 namespace move_detail {
498 #endif //BOOST_NO_CXX11_RVALUE_REFERENCES
502 #endif //#ifndef BOOST_MOVE_CORE_HPP