⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stl_alloc.h

📁 俄罗斯高人Mamaich的Pocket gcc编译器(运行在PocketPC上)的全部源代码。
💻 H
📖 第 1 页 / 共 3 页
字号:
      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 + -