_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 + -
显示快捷键?