📄 stl_alloc.h
字号:
allocator() throw() {} allocator(const allocator&) throw() {} template<typename _Tp1> allocator(const allocator<_Tp1>&) throw() {} ~allocator() throw() {} pointer address(reference __x) const { return &__x; } const_pointer address(const_reference __x) const { return &__x; } // NB: __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) { _Tp* __ret = 0; if (__n) { if (__n <= this->max_size()) __ret = static_cast<_Tp*>(_Alloc::allocate(__n * sizeof(_Tp))); else __throw_bad_alloc(); } return __ret; } // __p is not permitted to be a null pointer. void deallocate(pointer __p, size_type __n) { _Alloc::deallocate(__p, __n * sizeof(_Tp)); } size_type max_size() const throw() { return size_t(-1) / sizeof(_Tp); } void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); } void destroy(pointer __p) { __p->~_Tp(); } }; template<> class allocator<void> { public: typedef size_t size_type; typedef ptrdiff_t difference_type; typedef void* pointer; typedef const void* const_pointer; typedef void value_type; template<typename _Tp1> struct rebind { typedef allocator<_Tp1> other; }; }; template<typename _T1, typename _T2> inline bool operator==(const allocator<_T1>&, const allocator<_T2>&) { return true; } template<typename _T1, typename _T2> inline bool operator!=(const allocator<_T1>&, const allocator<_T2>&) { return false; } /** * @if maint * Allocator adaptor to turn an "SGI" style allocator (e.g., * __alloc, __malloc_alloc_template) into a "standard" conforming * allocator. Note that this adaptor does *not* assume that all * objects of the underlying alloc class are identical, nor does it * assume that all of the underlying alloc's member functions are * static member functions. Note, also, that __allocator<_Tp, * __alloc> is essentially the same thing as allocator<_Tp>. * @endif * (See @link Allocators allocators info @endlink for more.) */ template<typename _Tp, typename _Alloc> struct __allocator { _Alloc __underlying_alloc; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Tp* pointer; typedef const _Tp* const_pointer; typedef _Tp& reference; typedef const _Tp& const_reference; typedef _Tp value_type; template<typename _Tp1> struct rebind { typedef __allocator<_Tp1, _Alloc> other; }; __allocator() throw() {} __allocator(const __allocator& __a) throw() : __underlying_alloc(__a.__underlying_alloc) {} template<typename _Tp1> __allocator(const __allocator<_Tp1, _Alloc>& __a) throw() : __underlying_alloc(__a.__underlying_alloc) {} ~__allocator() throw() {} pointer address(reference __x) const { return &__x; } const_pointer address(const_reference __x) const { return &__x; } // NB: __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) { _Tp* __ret = 0; if (__n) __ret = static_cast<_Tp*>(_Alloc::allocate(__n * sizeof(_Tp))); return __ret; } // __p is not permitted to be a null pointer. void deallocate(pointer __p, size_type __n) { __underlying_alloc.deallocate(__p, __n * sizeof(_Tp)); } size_type max_size() const throw() { return size_t(-1) / sizeof(_Tp); } void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); } void destroy(pointer __p) { __p->~_Tp(); } }; template<typename _Alloc> struct __allocator<void, _Alloc> { typedef size_t size_type; typedef ptrdiff_t difference_type; typedef void* pointer; typedef const void* const_pointer; typedef void value_type; template<typename _Tp1> struct rebind { typedef __allocator<_Tp1, _Alloc> other; }; }; template<typename _Tp, typename _Alloc> inline bool operator==(const __allocator<_Tp,_Alloc>& __a1, const __allocator<_Tp,_Alloc>& __a2) { return __a1.__underlying_alloc == __a2.__underlying_alloc; } template<typename _Tp, typename _Alloc> inline bool operator!=(const __allocator<_Tp, _Alloc>& __a1, const __allocator<_Tp, _Alloc>& __a2) { return __a1.__underlying_alloc != __a2.__underlying_alloc; } //@{ /** Comparison operators for all of the predifined SGI-style allocators. * This ensures that __allocator<malloc_alloc> (for example) will work * correctly. As required, all allocators compare equal. */ template<int inst> inline bool operator==(const __malloc_alloc_template<inst>&, const __malloc_alloc_template<inst>&) { return true; } template<int __inst> inline bool operator!=(const __malloc_alloc_template<__inst>&, const __malloc_alloc_template<__inst>&) { return false; } template<typename _Alloc> inline bool operator==(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&) { return true; } template<typename _Alloc> inline bool operator!=(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&) { return false; } //@} /** * @if maint * Another allocator adaptor: _Alloc_traits. This serves two purposes. * First, make it possible to write containers that can use either "SGI" * style allocators or "standard" allocators. Second, provide a mechanism * so that containers can query whether or not the allocator has distinct * instances. If not, the container can avoid wasting a word of memory to * store an empty object. For examples of use, see stl_vector.h, etc, or * any of the other classes derived from this one. * * This adaptor uses partial specialization. The general case of * _Alloc_traits<_Tp, _Alloc> assumes that _Alloc is a * standard-conforming allocator, possibly with non-equal instances and * non-static members. (It still behaves correctly even if _Alloc has * static member and if all instances are equal. Refinements affect * performance, not correctness.) * * There are always two members: allocator_type, which is a standard- * conforming allocator type for allocating objects of type _Tp, and * _S_instanceless, a static const member of type bool. If * _S_instanceless is true, this means that there is no difference * between any two instances of type allocator_type. Furthermore, if * _S_instanceless is true, then _Alloc_traits has one additional * member: _Alloc_type. This type encapsulates allocation and * deallocation of objects of type _Tp through a static interface; it * has two member functions, whose signatures are * * - static _Tp* allocate(size_t) * - static void deallocate(_Tp*, size_t) * * The size_t parameters are "standard" style (see top of stl_alloc.h) in * that they take counts, not sizes. * * @endif * (See @link Allocators allocators info @endlink for more.) */ //@{ // The fully general version. template<typename _Tp, typename _Allocator> struct _Alloc_traits { static const bool _S_instanceless = false; typedef typename _Allocator::template rebind<_Tp>::other allocator_type; }; template<typename _Tp, typename _Allocator> const bool _Alloc_traits<_Tp, _Allocator>::_S_instanceless; /// The version for the default allocator. template<typename _Tp, typename _Tp1> struct _Alloc_traits<_Tp, allocator<_Tp1> > { static const bool _S_instanceless = true; typedef __simple_alloc<_Tp, __alloc> _Alloc_type; typedef allocator<_Tp> allocator_type; }; //@} //@{ /// Versions for the predefined "SGI" style allocators. template<typename _Tp, int __inst> struct _Alloc_traits<_Tp, __malloc_alloc_template<__inst> > { static const bool _S_instanceless = true; typedef __simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type; typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type; }; template<typename _Tp, bool __threads, int __inst> struct _Alloc_traits<_Tp, __default_alloc_template<__threads, __inst> > { static const bool _S_instanceless = true; typedef __simple_alloc<_Tp, __default_alloc_template<__threads, __inst> > _Alloc_type; typedef __allocator<_Tp, __default_alloc_template<__threads, __inst> > allocator_type; }; template<typename _Tp, typename _Alloc> struct _Alloc_traits<_Tp, __debug_alloc<_Alloc> > { static const bool _S_instanceless = true; typedef __simple_alloc<_Tp, __debug_alloc<_Alloc> > _Alloc_type; typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type; }; //@} //@{ /// Versions for the __allocator adaptor used with the predefined /// "SGI" style allocators. template<typename _Tp, typename _Tp1, int __inst> struct _Alloc_traits<_Tp, __allocator<_Tp1, __malloc_alloc_template<__inst> > > { static const bool _S_instanceless = true; typedef __simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type; typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type; }; template<typename _Tp, typename _Tp1, bool __thr, int __inst> struct _Alloc_traits<_Tp, __allocator<_Tp1, __default_alloc_template<__thr, __inst> > > { static const bool _S_instanceless = true; typedef __simple_alloc<_Tp, __default_alloc_template<__thr,__inst> > _Alloc_type; typedef __allocator<_Tp, __default_alloc_template<__thr,__inst> > allocator_type; }; template<typename _Tp, typename _Tp1, typename _Alloc> struct _Alloc_traits<_Tp, __allocator<_Tp1, __debug_alloc<_Alloc> > > { static const bool _S_instanceless = true; typedef __simple_alloc<_Tp, __debug_alloc<_Alloc> > _Alloc_type; typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type; }; //@} // Inhibit implicit instantiations for required instantiations, // which are defined via explicit instantiations elsewhere. // NB: This syntax is a GNU extension.#if _GLIBCPP_EXTERN_TEMPLATE extern template class allocator<char>; extern template class allocator<wchar_t>; extern template class __default_alloc_template<true,0>;#endif} // namespace std#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -