_move_construct_fwk.h

来自「stl的源码」· C头文件 代码 · 共 160 行

H
160
字号
/* * * Copyright (c) 2003 * Francois Dumont * * This material is provided "as is", with absolutely no warranty expressed * or implied. Any use is at your own risk. * * Permission to use or copy this software for any purpose is hereby granted * without fee, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */#ifndef _STLP_MOVE_CONSTRUCT_FWK_H#define _STLP_MOVE_CONSTRUCT_FWK_H#ifndef _STLP_TYPE_TRAITS_H#  include <stl/type_traits.h>#endif_STLP_BEGIN_NAMESPACE/************************************************************* * Move constructor framework *************************************************************//************************************************************* *Partial move: *The source HAS to be a valid instance after the move! *************************************************************/template <class _Tp>class __move_source {public:  explicit __move_source (_Tp &_src) : _M_data(_src)  {}  _Tp& get() const  { return _M_data; }private:  _Tp &_M_data;  //We explicitely forbid assignment to avoid warning:  typedef __move_source<_Tp> _Self;  _Self& operator = (_Self const&);};//Class used to signal move constructor support, implementation and type.template <class _Tp>struct __move_traits {  /*   * implemented tells if a the special move constructor has to be called or the classic   * copy constructor is just fine. Most of the time the copy constructor is fine only   * if the following info is true.   */#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && \   !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && \   !defined (_STLP_NO_MOVE_SEMANTIC)  typedef typename _IsSTLportClass<_Tp>::_Ret implemented;#else  typedef __false_type implemented;#endif  /*   * complete tells if the move is complete or partial, that is to say, does the source   * needs to be destroyed once it has been moved.   */#  if defined (__BORLANDC__) && (__BORLANDC__ >= 0x564)  typedef __type_traits<_Tp>::has_trivial_destructor _TpMoveComplete;  typedef typename __bool2type<__type2bool<_TpMoveComplete>::_Ret>::_Ret complete;#  else  typedef typename __type_traits<_Tp>::has_trivial_destructor complete;#  endif};_STLP_MOVE_TO_PRIV_NAMESPACE/* * This struct should never be used if the user has not explicitely stipulated * that its class support the full move concept. To check that the return type * in such a case will be __invalid_source<_Tp> to generate a compile error * revealing the configuration problem. */template <class _Tp>struct _MoveSourceTraits {  typedef typename __move_traits<_Tp>::implemented _MvImpRet;#if defined (__BORLANDC__)  typedef typename __selectT<_MvImpRet,#else  enum {_MvImp = __type2bool<_MvImpRet>::_Ret};  typedef typename __select<_MvImp,#endif                            __move_source<_Tp>,                            _Tp const&>::_Ret _Type;};//The helper functiontemplate <class _Tp>inline _STLP_TYPENAME_ON_RETURN_TYPE _MoveSourceTraits<_Tp>::_Type_AsMoveSource (_Tp &src) {  typedef typename _MoveSourceTraits<_Tp>::_Type _SrcType;  return _SrcType(src);}//Helper structs used for many class.template <class _Tp>struct __move_traits_aux {  typedef typename __move_traits<_Tp>::implemented implemented;  typedef typename __move_traits<_Tp>::complete complete;};template <class _Tp1, class _Tp2>struct __move_traits_aux2 {  typedef __move_traits<_Tp1> _MoveTraits1;  typedef __move_traits<_Tp2> _MoveTraits2;  typedef typename _Lor2<typename _MoveTraits1::implemented,                         typename _MoveTraits2::implemented>::_Ret implemented;  typedef typename _Land2<typename _MoveTraits1::complete,                          typename _MoveTraits2::complete>::_Ret complete;};/* * Most of the time a class implement a move constructor but its use depends * on a third party, this is what the following struct are for. */template <class _Tp>struct __move_traits_help {  typedef __true_type implemented;  typedef typename __move_traits<_Tp>::complete complete;};template <class _Tp1, class _Tp2>struct __move_traits_help1 {  typedef __move_traits<_Tp1> _MoveTraits1;  typedef __move_traits<_Tp2> _MoveTraits2;  typedef typename _Lor2<typename _MoveTraits1::implemented,                         typename _MoveTraits2::implemented>::_Ret implemented;  typedef typename _Land2<typename _MoveTraits1::complete,                          typename _MoveTraits2::complete>::_Ret complete;};template <class _Tp1, class _Tp2>struct __move_traits_help2 {  typedef __move_traits<_Tp1> _MoveTraits1;  typedef __move_traits<_Tp2> _MoveTraits2;  typedef __true_type implemented;  typedef typename _Land2<typename _MoveTraits1::complete,                          typename _MoveTraits2::complete>::_Ret complete;};_STLP_MOVE_TO_STD_NAMESPACE_STLP_END_NAMESPACE#endif /* _STLP_MOVE_CONSTRUCT_FWK_H */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?