_alloc.h

来自「stl的源码」· C头文件 代码 · 共 581 行 · 第 1/2 页

H
581
字号
#endif  allocator(const allocator<_Tp>&) _STLP_NOTHROW {}#if !defined (_STLP_NO_MOVE_SEMANTIC)  allocator(__move_source<allocator<_Tp> > src) _STLP_NOTHROW {}#endif  ~allocator() _STLP_NOTHROW {}  pointer address(reference __x) const {return &__x;}  const_pointer address(const_reference __x) const { return &__x; }  // __n is permitted to be 0.  The C++ standard says nothing about what the return value is when __n == 0.  _Tp* allocate(size_type __n, const void* = 0) {    if (__n > max_size()) {      _STLP_THROW_BAD_ALLOC;    }    if (__n != 0) {      size_type __buf_size = __n * sizeof(value_type);      _Tp* __ret = __REINTERPRET_CAST(_Tp*, __sgi_alloc::allocate(__buf_size));#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)      memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size);#endif      return __ret;    }    return 0;  }  // __p is permitted to be a null pointer, only if n==0.  void deallocate(pointer __p, size_type __n) {    _STLP_ASSERT( (__p == 0) == (__n == 0) )    if (__p != 0) {#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)      memset((char*)__p, _STLP_SHRED_BYTE, __n * sizeof(value_type));#endif      __sgi_alloc::deallocate((void*)__p, __n * sizeof(value_type));    }  }#if !defined (_STLP_NO_ANACHRONISMS)  // backwards compatibility  void deallocate(pointer __p) const {  if (__p != 0) __sgi_alloc::deallocate((void*)__p, sizeof(value_type)); }#endif  size_type max_size() const _STLP_NOTHROW  { return size_t(-1) / sizeof(value_type); }  void construct(pointer __p, const_reference __val) { _STLP_STD::_Copy_Construct(__p, __val); }  void destroy(pointer __p) { _STLP_STD::_Destroy(__p); }#if defined (_STLP_NO_EXTENSIONS)  /* STLport extension giving rounded size of an allocated memory buffer   * This method do not have to be part of a user defined allocator implementation   * and won't even be called if such a function was granted.   */protected:#endif  _Tp* _M_allocate(size_type __n, size_type& __allocated_n) {    if (__n > max_size()) {      _STLP_THROW_BAD_ALLOC;    }    if (__n != 0) {      size_type __buf_size = __n * sizeof(value_type);      _Tp* __ret = __REINTERPRET_CAST(_Tp*, __sgi_alloc::allocate(__buf_size));#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)      memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size);#endif      __allocated_n = __buf_size / sizeof(value_type);      return __ret;    }    return 0;  }#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)  void _M_swap_workaround(allocator<_Tp>& __other) {}#endif};_STLP_TEMPLATE_NULLclass _STLP_CLASS_DECLSPEC allocator<void> {public:  typedef size_t      size_type;  typedef ptrdiff_t   difference_type;  typedef void*       pointer;  typedef const void* const_pointer;#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)  typedef void        value_type;#endif#if defined (_STLP_MEMBER_TEMPLATE_CLASSES)  template <class _Tp1> struct rebind {    typedef allocator<_Tp1> other;  };#endif};template <class _T1, class _T2>inline bool _STLP_CALL operator==(const allocator<_T1>&, const allocator<_T2>&) _STLP_NOTHROW{ return true; }template <class _T1, class _T2>inline bool _STLP_CALL operator!=(const allocator<_T1>&, const allocator<_T2>&) _STLP_NOTHROW{ return false; }#if defined (_STLP_USE_TEMPLATE_EXPORT)_STLP_EXPORT_TEMPLATE_CLASS allocator<char>;#  if defined (_STLP_HAS_WCHAR_T)_STLP_EXPORT_TEMPLATE_CLASS allocator<wchar_t>;#  endif#  if defined (_STLP_USE_PTR_SPECIALIZATIONS)_STLP_EXPORT_TEMPLATE_CLASS allocator<void*>;#  endif#endif_STLP_MOVE_TO_PRIV_NAMESPACEtemplate <class _Tp>struct __alloc_type_traits {#if !defined (__BORLANDC__)  typedef typename _IsSTLportClass<allocator<_Tp> >::_Ret _STLportAlloc;#else  enum { _Is = _IsSTLportClass<allocator<_Tp> >::_Is };  typedef typename __bool2type<_Is>::_Ret _STLportAlloc;#endif  //The default allocator implementation which is recognize thanks to the  //__stlport_class inheritance is a stateless object so:  typedef _STLportAlloc has_trivial_default_constructor;  typedef _STLportAlloc has_trivial_copy_constructor;  typedef _STLportAlloc has_trivial_assignment_operator;  typedef _STLportAlloc has_trivial_destructor;  typedef _STLportAlloc is_POD_type;};_STLP_MOVE_TO_STD_NAMESPACE#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)template <class _Tp>struct __type_traits<allocator<_Tp> > : _STLP_PRIV __alloc_type_traits<_Tp> {};#else_STLP_TEMPLATE_NULLstruct __type_traits<allocator<char> > : _STLP_PRIV __alloc_type_traits<char> {};#  if defined (_STLP_HAS_WCHAR_T)_STLP_TEMPLATE_NULLstruct __type_traits<allocator<wchar_t> > : _STLP_PRIV __alloc_type_traits<wchar_t> {};#  endif#  if defined (_STLP_USE_PTR_SPECIALIZATIONS)_STLP_TEMPLATE_NULLstruct __type_traits<allocator<void*> > : _STLP_PRIV __alloc_type_traits<void*> {};#  endif#endif#if !defined (_STLP_FORCE_ALLOCATORS)#  define _STLP_FORCE_ALLOCATORS(a,y)#endif#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_MEMBER_TEMPLATE_CLASSES)// The version for the default allocator, for rare occasion when we have partial spec w/o member template classestemplate <class _Tp, class _Tp1>struct _Alloc_traits<_Tp, allocator<_Tp1> > {  typedef allocator<_Tp1> _Orig;  typedef allocator<_Tp> allocator_type;  static allocator_type create_allocator(const allocator<_Tp1 >& __a)  { return allocator_type(_STLP_CONVERT_ALLOCATOR(__a, _Tp)); }};#endif#if !defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE) && defined (_STLP_MEMBER_TEMPLATES)template <class _Tp, class _Alloc>inline _STLP_TYPENAME_ON_RETURN_TYPE _Alloc_traits<_Tp, _Alloc>::allocator_type  _STLP_CALL__stl_alloc_create(const _Alloc& __a, const _Tp*) {  typedef typename _Alloc::_STLP_TEMPLATE rebind<_Tp>::other _Rebound_type;  return _Rebound_type(__a);}#else// If custom allocators are being used without member template classes support :// user (on purpose) is forced to define rebind/get operations !!!template <class _Tp1, class _Tp2>inline allocator<_Tp2>& _STLP_CALL__stl_alloc_rebind(allocator<_Tp1>& __a, const _Tp2*) {  return (allocator<_Tp2>&)(__a); }template <class _Tp1, class _Tp2>inline allocator<_Tp2> _STLP_CALL__stl_alloc_create(const allocator<_Tp1>&, const _Tp2*) { return allocator<_Tp2>(); }#endif_STLP_MOVE_TO_PRIV_NAMESPACE// inheritance is being used for EBO optimizationtemplate <class _Value, class _Tp, class _MaybeReboundAlloc>class _STLP_alloc_proxy : public _MaybeReboundAlloc {private:  typedef _MaybeReboundAlloc _Base;  typedef typename _Base::size_type size_type;  typedef _STLP_alloc_proxy<_Value, _Tp, _MaybeReboundAlloc> _Self;public:  _Value _M_data;  _STLP_alloc_proxy (const _MaybeReboundAlloc& __a, _Value __p) :    _MaybeReboundAlloc(__a), _M_data(__p) {}#if !defined (_STLP_NO_MOVE_SEMANTIC)  _STLP_alloc_proxy (__move_source<_Self> src) :    _Base(_STLP_PRIV _AsMoveSource(src.get()._M_base())),    _M_data(_STLP_PRIV _AsMoveSource(src.get()._M_data)) {}  _Base& _M_base()  { return *this; }#endifprivate:  /* Following are helper methods to detect stateless allocators and avoid   * swap in this case. For some compilers (VC6) it is a workaround for a   * compiler bug in the Empty Base class Optimization feature, for others   * it is a small optimization or nothing if no EBO. */  void _M_swap_alloc(_Self&, const __true_type& /*_IsStateless*/)  {}  void _M_swap_alloc(_Self& __x, const __false_type& /*_IsStateless*/) {    _MaybeReboundAlloc &__base_this = *this;    _MaybeReboundAlloc &__base_x = __x;    _STLP_STD::swap(__base_this, __base_x);  }public:  void _M_swap_alloc(_Self& __x) {#if !defined (__BORLANDC__)    typedef typename _IsStateless<_MaybeReboundAlloc>::_Ret _StatelessAlloc;#else    typedef typename __bool2type<_IsStateless<_MaybeReboundAlloc>::_Is>::_Ret _StatelessAlloc;#endif    _M_swap_alloc(__x, _StatelessAlloc());  }  /* We need to define the following swap implementation for allocator with state   * as those allocators might have implement a special swap function to correctly   * move datas from an instance to the oher, _STLP_alloc_proxy should not break   * this mecanism. */  void swap(_Self& __x) {    _M_swap_alloc(__x);    _STLP_STD::swap(_M_data, __x._M_data);  }  _Tp* allocate(size_type __n, size_type& __allocated_n) {#if !defined (__BORLANDC__)    typedef typename _IsSTLportClass<_MaybeReboundAlloc>::_Ret _STLportAlloc;#else    typedef typename __bool2type<_IsSTLportClass<_MaybeReboundAlloc>::_Is>::_Ret _STLportAlloc;#endif    return allocate(__n, __allocated_n, _STLportAlloc());  }  // Unified interface to perform allocate()/deallocate() with limited  // language support#if defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE)  // else it is rebound already, and allocate() member is accessible  _Tp* allocate(size_type __n)  { return __stl_alloc_rebind(__STATIC_CAST(_Base&, *this), __STATIC_CAST(_Tp*, 0)).allocate(__n, 0); }  void deallocate(_Tp* __p, size_type __n)  { __stl_alloc_rebind(__STATIC_CAST(_Base&, *this), __STATIC_CAST(_Tp*, 0)).deallocate(__p, __n); }private:  _Tp* allocate(size_type __n, size_type& __allocated_n, const __true_type& /*STLport allocator*/)  { return __stl_alloc_rebind(__STATIC_CAST(_Base&, *this), __STATIC_CAST(_Tp*, 0))._M_allocate(__n, __allocated_n); }#else  //Expose Standard allocate overload (using expression do not work for some compilers (Borland))  _Tp* allocate(size_type __n)  { return _Base::allocate(__n); }private:  _Tp* allocate(size_type __n, size_type& __allocated_n, const __true_type& /*STLport allocator*/)  { return _Base::_M_allocate(__n, __allocated_n); }#endif  _Tp* allocate(size_type __n, size_type& __allocated_n, const __false_type& /*STLport allocator*/)  { __allocated_n = __n; return allocate(__n); }};#if defined (_STLP_USE_TEMPLATE_EXPORT)_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<char*, char, allocator<char> >;#  if defined (_STLP_HAS_WCHAR_T)_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<wchar_t*, wchar_t, allocator<wchar_t> >;#  endif#  if defined (_STLP_USE_PTR_SPECIALIZATIONS)_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<void**, void*, allocator<void*> >;#  endif#endif_STLP_MOVE_TO_STD_NAMESPACE_STLP_END_NAMESPACE#if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)#  include <stl/_alloc.c>#endif#endif /* _STLP_INTERNAL_ALLOC_H */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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