Commit 72ea9226 by Benjamin Kosnik Committed by Benjamin Kosnik

stl_alloc.h: Additional formatting.


2002-06-25  Benjamin Kosnik  <bkoz@redhat.com>

	* include/bits/stl_alloc.h: Additional formatting.

From-SVN: r54990
parent da15dae6
2002-06-25 Benjamin Kosnik <bkoz@redhat.com>
* include/bits/stl_alloc.h: Additional formatting.
2002-06-24 Phil Edwards <pme@gcc.gnu.org> 2002-06-24 Phil Edwards <pme@gcc.gnu.org>
* include/bits/stl_alloc.h: Reformat as per C++STYLE. * include/bits/stl_alloc.h: Reformat as per C++STYLE.
......
...@@ -87,18 +87,17 @@ ...@@ -87,18 +87,17 @@
namespace std namespace std
{ {
/**
/**
* @if maint * @if maint
* A new-based allocator, as required by the standard. Allocation and * A new-based allocator, as required by the standard. Allocation and
* deallocation forward to global new and delete. "SGI" style, minus * deallocation forward to global new and delete. "SGI" style, minus
* reallocate(). * reallocate().
* @endif * @endif
* (See @link Allocators allocators info @endlink for more.) * (See @link Allocators allocators info @endlink for more.)
*/ */
class __new_alloc class __new_alloc
{ {
public: public:
static void* static void*
allocate(size_t __n) allocate(size_t __n)
{ return ::operator new(__n); } { return ::operator new(__n); }
...@@ -106,10 +105,9 @@ public: ...@@ -106,10 +105,9 @@ public:
static void static void
deallocate(void* __p, size_t) deallocate(void* __p, size_t)
{ ::operator delete(__p); } { ::operator delete(__p); }
}; };
/** /**
* @if maint * @if maint
* A malloc-based allocator. Typically slower than the * A malloc-based allocator. Typically slower than the
* __default_alloc_template (below). Typically thread-safe and more * __default_alloc_template (below). Typically thread-safe and more
...@@ -118,16 +116,16 @@ public: ...@@ -118,16 +116,16 @@ public:
* for caveats). "SGI" style, plus __set_malloc_handler for OOM conditions. * for caveats). "SGI" style, plus __set_malloc_handler for OOM conditions.
* @endif * @endif
* (See @link Allocators allocators info @endlink for more.) * (See @link Allocators allocators info @endlink for more.)
*/ */
template <int __inst> template<int __inst>
class __malloc_alloc_template class __malloc_alloc_template
{ {
private: private:
static void* _S_oom_malloc(size_t); static void* _S_oom_malloc(size_t);
static void* _S_oom_realloc(void*, size_t); static void* _S_oom_realloc(void*, size_t);
static void (* __malloc_alloc_oom_handler)(); static void (* __malloc_alloc_oom_handler)();
public: public:
static void* static void*
allocate(size_t __n) allocate(size_t __n)
{ {
...@@ -144,7 +142,8 @@ public: ...@@ -144,7 +142,8 @@ public:
reallocate(void* __p, size_t /* old_sz */, size_t __new_sz) reallocate(void* __p, size_t /* old_sz */, size_t __new_sz)
{ {
void* __result = realloc(__p, __new_sz); void* __result = realloc(__p, __new_sz);
if (0 == __result) __result = _S_oom_realloc(__p, __new_sz); if (0 == __result)
__result = _S_oom_realloc(__p, __new_sz);
return __result; return __result;
} }
...@@ -154,16 +153,15 @@ public: ...@@ -154,16 +153,15 @@ public:
__malloc_alloc_oom_handler = __f; __malloc_alloc_oom_handler = __f;
return(__old); return(__old);
} }
}; };
// malloc_alloc out-of-memory handling // malloc_alloc out-of-memory handling
template <int __inst> template<int __inst>
void (* __malloc_alloc_template<__inst>::__malloc_alloc_oom_handler)() = 0; void (* __malloc_alloc_template<__inst>::__malloc_alloc_oom_handler)() = 0;
template <int __inst> template<int __inst>
void* void*
__malloc_alloc_template<__inst>:: __malloc_alloc_template<__inst>::_S_oom_malloc(size_t __n)
_S_oom_malloc(size_t __n)
{ {
void (* __my_malloc_handler)(); void (* __my_malloc_handler)();
void* __result; void* __result;
...@@ -180,7 +178,7 @@ template <int __inst> ...@@ -180,7 +178,7 @@ template <int __inst>
} }
} }
template <int __inst> template<int __inst>
void* void*
__malloc_alloc_template<__inst>:: __malloc_alloc_template<__inst>::
_S_oom_realloc(void* __p, size_t __n) _S_oom_realloc(void* __p, size_t __n)
...@@ -201,7 +199,7 @@ template <int __inst> ...@@ -201,7 +199,7 @@ template <int __inst>
} }
// Determines the underlying allocator choice for the node allocator. // Determines the underlying allocator choice for the node allocator.
#ifdef __USE_MALLOC #ifdef __USE_MALLOC
typedef __malloc_alloc_template<0> __mem_interface; typedef __malloc_alloc_template<0> __mem_interface;
#else #else
...@@ -209,7 +207,7 @@ template <int __inst> ...@@ -209,7 +207,7 @@ template <int __inst>
#endif #endif
/** /**
* @if maint * @if maint
* This is used primarily (only?) in _Alloc_traits and other places to * This is used primarily (only?) in _Alloc_traits and other places to
* help provide the _Alloc_type typedef. * help provide the _Alloc_type typedef.
...@@ -218,11 +216,11 @@ template <int __inst> ...@@ -218,11 +216,11 @@ template <int __inst>
* must be "SGI" style. * must be "SGI" style.
* @endif * @endif
* (See @link Allocators allocators info @endlink for more.) * (See @link Allocators allocators info @endlink for more.)
*/ */
template<class _Tp, class _Alloc> template<typename _Tp, typename _Alloc>
class __simple_alloc class __simple_alloc
{ {
public: public:
static _Tp* static _Tp*
allocate(size_t __n) allocate(size_t __n)
{ return 0 == __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); } { return 0 == __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); }
...@@ -238,10 +236,10 @@ public: ...@@ -238,10 +236,10 @@ public:
static void static void
deallocate(_Tp* __p) deallocate(_Tp* __p)
{ _Alloc::deallocate(__p, sizeof (_Tp)); } { _Alloc::deallocate(__p, sizeof (_Tp)); }
}; };
/** /**
* @if maint * @if maint
* An adaptor for an underlying allocator (_Alloc) to check the size * An adaptor for an underlying allocator (_Alloc) to check the size
* arguments for debugging. Errors are reported using assert; these * arguments for debugging. Errors are reported using assert; these
...@@ -254,15 +252,16 @@ public: ...@@ -254,15 +252,16 @@ public:
* This adaptor is "SGI" style. The _Alloc parameter must also be "SGI". * This adaptor is "SGI" style. The _Alloc parameter must also be "SGI".
* @endif * @endif
* (See @link Allocators allocators info @endlink for more.) * (See @link Allocators allocators info @endlink for more.)
*/ */
template <class _Alloc> template<typename _Alloc>
class __debug_alloc class __debug_alloc
{ {
private: private:
enum {_S_extra = 8}; // Size of space used to store size. Note that this // Size of space used to store size. Note that this must be
// must be large enough to preserve alignment. // large enough to preserve alignment.
enum {_S_extra = 8};
public: public:
static void* static void*
allocate(size_t __n) allocate(size_t __n)
{ {
...@@ -290,18 +289,18 @@ public: ...@@ -290,18 +289,18 @@ public:
*(size_t*)__result = __new_sz; *(size_t*)__result = __new_sz;
return __result + (int) _S_extra; return __result + (int) _S_extra;
} }
}; };
#ifdef __USE_MALLOC #ifdef __USE_MALLOC
typedef __mem_interface __alloc; typedef __mem_interface __alloc;
typedef __mem_interface __single_client_alloc; typedef __mem_interface __single_client_alloc;
#else #else
/** /**
* @if maint * @if maint
* Default node allocator. "SGI" style. Uses __mem_interface for its * Default node allocator. "SGI" style. Uses __mem_interface for its
* underlying requests (and makes as few requests as possible). * underlying requests (and makes as few requests as possible).
...@@ -329,11 +328,11 @@ typedef __mem_interface __single_client_alloc; ...@@ -329,11 +328,11 @@ typedef __mem_interface __single_client_alloc;
* *
* @endif * @endif
* (See @link Allocators allocators info @endlink for more.) * (See @link Allocators allocators info @endlink for more.)
*/ */
template<bool __threads, int __inst> template<bool __threads, int __inst>
class __default_alloc_template class __default_alloc_template
{ {
private: private:
enum {_ALIGN = 8}; enum {_ALIGN = 8};
enum {_MAX_BYTES = 128}; enum {_MAX_BYTES = 128};
enum {_NFREELISTS = _MAX_BYTES / _ALIGN}; enum {_NFREELISTS = _MAX_BYTES / _ALIGN};
...@@ -380,7 +379,7 @@ private: ...@@ -380,7 +379,7 @@ private:
} __attribute__ ((__unused__)); } __attribute__ ((__unused__));
friend struct _Lock; friend struct _Lock;
public: public:
// __n must be > 0 // __n must be > 0
static void* static void*
allocate(size_t __n) allocate(size_t __n)
...@@ -391,9 +390,11 @@ public: ...@@ -391,9 +390,11 @@ public:
__ret = __mem_interface::allocate(__n); __ret = __mem_interface::allocate(__n);
else else
{ {
_Obj* volatile* __my_free_list = _S_free_list + _S_freelist_index(__n); _Obj* volatile* __my_free_list = _S_free_list
// Acquire the lock here with a constructor call. This ensures that + _S_freelist_index(__n);
// it is released in exit or during stack unwinding. // Acquire the lock here with a constructor call. This
// ensures that it is released in exit or during stack
// unwinding.
_Lock __lock_instance; _Lock __lock_instance;
_Obj* __restrict__ __result = *__my_free_list; _Obj* __restrict__ __result = *__my_free_list;
if (__result == 0) if (__result == 0)
...@@ -415,11 +416,13 @@ public: ...@@ -415,11 +416,13 @@ public:
__mem_interface::deallocate(__p, __n); __mem_interface::deallocate(__p, __n);
else else
{ {
_Obj* volatile* __my_free_list = _S_free_list + _S_freelist_index(__n); _Obj* volatile* __my_free_list = _S_free_list
+ _S_freelist_index(__n);
_Obj* __q = (_Obj*)__p; _Obj* __q = (_Obj*)__p;
// Acquire the lock here with a constructor call. This ensures that // Acquire the lock here with a constructor call. This
// it is released in exit or during stack unwinding. // ensures that it is released in exit or during stack
// unwinding.
_Lock __lock_instance; _Lock __lock_instance;
__q -> _M_free_list_link = *__my_free_list; __q -> _M_free_list_link = *__my_free_list;
*__my_free_list = __q; *__my_free_list = __q;
...@@ -428,26 +431,26 @@ public: ...@@ -428,26 +431,26 @@ public:
static void* static void*
reallocate(void* __p, size_t __old_sz, size_t __new_sz); reallocate(void* __p, size_t __old_sz, size_t __new_sz);
}; };
template<bool __threads, int __inst> template<bool __threads, int __inst>
inline bool inline bool
operator==(const __default_alloc_template<__threads,__inst>&, operator==(const __default_alloc_template<__threads,__inst>&,
const __default_alloc_template<__threads,__inst>&) const __default_alloc_template<__threads,__inst>&)
{ return true; } { return true; }
template<bool __threads, int __inst> template<bool __threads, int __inst>
inline bool inline bool
operator!=(const __default_alloc_template<__threads,__inst>&, operator!=(const __default_alloc_template<__threads,__inst>&,
const __default_alloc_template<__threads,__inst>&) const __default_alloc_template<__threads,__inst>&)
{ return false; } { return false; }
// We allocate memory in large chunks in order to avoid fragmenting the // We allocate memory in large chunks in order to avoid fragmenting the
// malloc heap (or whatever __mem_interface is using) too much. We assume // malloc heap (or whatever __mem_interface is using) too much. We assume
// that __size is properly aligned. We hold the allocation lock. // that __size is properly aligned. We hold the allocation lock.
template<bool __threads, int __inst> template<bool __threads, int __inst>
char* char*
__default_alloc_template<__threads, __inst>:: __default_alloc_template<__threads, __inst>::
_S_chunk_alloc(size_t __size, int& __nobjs) _S_chunk_alloc(size_t __size, int& __nobjs)
...@@ -519,13 +522,12 @@ template<bool __threads, int __inst> ...@@ -519,13 +522,12 @@ template<bool __threads, int __inst>
} }
// Returns an object of size __n, and optionally adds to "size // Returns an object of size __n, and optionally adds to "size
// __n"'s free list. We assume that __n is properly aligned. We // __n"'s free list. We assume that __n is properly aligned. We
// hold the allocation lock. // hold the allocation lock.
template<bool __threads, int __inst> template<bool __threads, int __inst>
void* void*
__default_alloc_template<__threads, __inst>:: __default_alloc_template<__threads, __inst>::_S_refill(size_t __n)
_S_refill(size_t __n)
{ {
int __nobjs = 20; int __nobjs = 20;
char* __chunk = _S_chunk_alloc(__n, __nobjs); char* __chunk = _S_chunk_alloc(__n, __nobjs);
...@@ -539,7 +541,7 @@ template<bool __threads, int __inst> ...@@ -539,7 +541,7 @@ template<bool __threads, int __inst>
return(__chunk); return(__chunk);
__my_free_list = _S_free_list + _S_freelist_index(__n); __my_free_list = _S_free_list + _S_freelist_index(__n);
/* Build free list in chunk */ // Build free list in chunk.
__result = (_Obj*)__chunk; __result = (_Obj*)__chunk;
*__my_free_list = __next_obj = (_Obj*)(__chunk + __n); *__my_free_list = __next_obj = (_Obj*)(__chunk + __n);
for (__i = 1; ; __i++) for (__i = 1; ; __i++)
...@@ -552,15 +554,13 @@ template<bool __threads, int __inst> ...@@ -552,15 +554,13 @@ template<bool __threads, int __inst>
break; break;
} }
else else
{
__current_obj -> _M_free_list_link = __next_obj; __current_obj -> _M_free_list_link = __next_obj;
} }
}
return(__result); return(__result);
} }
template<bool threads, int inst> template<bool threads, int inst>
void* void*
__default_alloc_template<threads, inst>:: __default_alloc_template<threads, inst>::
reallocate(void* __p, size_t __old_sz, size_t __new_sz) reallocate(void* __p, size_t __old_sz, size_t __new_sz)
...@@ -579,32 +579,30 @@ template<bool threads, int inst> ...@@ -579,32 +579,30 @@ template<bool threads, int inst>
return(__result); return(__result);
} }
template<bool __threads, int __inst> template<bool __threads, int __inst>
_STL_mutex_lock _STL_mutex_lock
__default_alloc_template<__threads,__inst>::_S_node_allocator_lock __default_alloc_template<__threads,__inst>::_S_node_allocator_lock
__STL_MUTEX_INITIALIZER; __STL_MUTEX_INITIALIZER;
template<bool __threads, int __inst>
char* __default_alloc_template<__threads,__inst>::_S_start_free = 0;
template<bool __threads, int __inst> template<bool __threads, int __inst>
char* __default_alloc_template<__threads,__inst>::_S_end_free = 0; char* __default_alloc_template<__threads,__inst>::_S_start_free = 0;
template<bool __threads, int __inst> template<bool __threads, int __inst>
size_t __default_alloc_template<__threads,__inst>::_S_heap_size = 0; char* __default_alloc_template<__threads,__inst>::_S_end_free = 0;
template<bool __threads, int __inst> template<bool __threads, int __inst>
typename __default_alloc_template<__threads,__inst>::_Obj* volatile size_t __default_alloc_template<__threads,__inst>::_S_heap_size = 0;
__default_alloc_template<__threads,__inst>::_S_free_list[_NFREELISTS];
typedef __default_alloc_template<true,0> __alloc;
typedef __default_alloc_template<false,0> __single_client_alloc;
template<bool __threads, int __inst>
typename __default_alloc_template<__threads,__inst>::_Obj* volatile
__default_alloc_template<__threads,__inst>::_S_free_list[_NFREELISTS];
typedef __default_alloc_template<true,0> __alloc;
typedef __default_alloc_template<false,0> __single_client_alloc;
#endif /* ! __USE_MALLOC */ #endif /* ! __USE_MALLOC */
/** /**
* This is a "standard" allocator, as per [20.4]. The private _Alloc is * This is a "standard" allocator, as per [20.4]. The private _Alloc is
* "SGI" style. (See comments at the top of stl_alloc.h.) * "SGI" style. (See comments at the top of stl_alloc.h.)
* *
...@@ -619,12 +617,12 @@ typedef __default_alloc_template<false,0> __single_client_alloc; ...@@ -619,12 +617,12 @@ typedef __default_alloc_template<false,0> __single_client_alloc;
* - __new_alloc is used for memory requests * - __new_alloc is used for memory requests
* *
* (See @link Allocators allocators info @endlink for more.) * (See @link Allocators allocators info @endlink for more.)
*/ */
template <class _Tp> template<typename _Tp>
class allocator class allocator
{ {
typedef __alloc _Alloc; // The underlying allocator. typedef __alloc _Alloc; // The underlying allocator.
public: public:
typedef size_t size_type; typedef size_t size_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef _Tp* pointer; typedef _Tp* pointer;
...@@ -633,25 +631,29 @@ public: ...@@ -633,25 +631,29 @@ public:
typedef const _Tp& const_reference; typedef const _Tp& const_reference;
typedef _Tp value_type; typedef _Tp value_type;
template <class _Tp1> struct rebind { template<typename _Tp1>
typedef allocator<_Tp1> other; struct rebind
}; { typedef allocator<_Tp1> other; };
allocator() throw() {} allocator() throw() {}
allocator(const allocator&) throw() {} allocator(const allocator&) throw() {}
template <class _Tp1> allocator(const allocator<_Tp1>&) throw() {} template<typename _Tp1>
allocator(const allocator<_Tp1>&) throw() {}
~allocator() throw() {} ~allocator() throw() {}
pointer address(reference __x) const { return &__x; } pointer
const_pointer address(const_reference __x) const { return &__x; } 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 // __n is permitted to be 0. The C++ standard says nothing about what
// the return value is when __n == 0. // the return value is when __n == 0.
_Tp* _Tp*
allocate(size_type __n, const void* = 0) allocate(size_type __n, const void* = 0)
{ {
return __n != 0 ? static_cast<_Tp*>(_Alloc::allocate(__n * sizeof(_Tp))) return __n != 0
: 0; ? static_cast<_Tp*>(_Alloc::allocate(__n * sizeof(_Tp))) : 0;
} }
// __p is not permitted to be a null pointer. // __p is not permitted to be a null pointer.
...@@ -664,36 +666,36 @@ public: ...@@ -664,36 +666,36 @@ public:
void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); } void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
void destroy(pointer __p) { __p->~_Tp(); } void destroy(pointer __p) { __p->~_Tp(); }
}; };
template<> template<>
class allocator<void> class allocator<void>
{ {
public: public:
typedef size_t size_type; typedef size_t size_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef void* pointer; typedef void* pointer;
typedef const void* const_pointer; typedef const void* const_pointer;
typedef void value_type; typedef void value_type;
template <class _Tp1> struct rebind { template<typename _Tp1>
typedef allocator<_Tp1> other; struct rebind
{ typedef allocator<_Tp1> other; };
}; };
};
template <class _T1, class _T2> template<typename _T1, typename _T2>
inline bool inline bool
operator==(const allocator<_T1>&, const allocator<_T2>&) operator==(const allocator<_T1>&, const allocator<_T2>&)
{ return true; } { return true; }
template <class _T1, class _T2> template<typename _T1, typename _T2>
inline bool inline bool
operator!=(const allocator<_T1>&, const allocator<_T2>&) operator!=(const allocator<_T1>&, const allocator<_T2>&)
{ return false; } { return false; }
/** /**
* @if maint * @if maint
* Allocator adaptor to turn an "SGI" style allocator (e.g., __alloc, * Allocator adaptor to turn an "SGI" style allocator (e.g., __alloc,
* __malloc_alloc_template) into a "standard" conforming allocator. Note * __malloc_alloc_template) into a "standard" conforming allocator. Note
...@@ -703,10 +705,10 @@ template <class _T1, class _T2> ...@@ -703,10 +705,10 @@ template <class _T1, class _T2>
* __allocator<_Tp, __alloc> is essentially the same thing as allocator<_Tp>. * __allocator<_Tp, __alloc> is essentially the same thing as allocator<_Tp>.
* @endif * @endif
* (See @link Allocators allocators info @endlink for more.) * (See @link Allocators allocators info @endlink for more.)
*/ */
template <class _Tp, class _Alloc> template<typename _Tp, typename _Alloc>
struct __allocator struct __allocator
{ {
_Alloc __underlying_alloc; _Alloc __underlying_alloc;
typedef size_t size_type; typedef size_t size_type;
...@@ -717,20 +719,25 @@ template <class _Tp, class _Alloc> ...@@ -717,20 +719,25 @@ template <class _Tp, class _Alloc>
typedef const _Tp& const_reference; typedef const _Tp& const_reference;
typedef _Tp value_type; typedef _Tp value_type;
template <class _Tp1> struct rebind { template<typename _Tp1>
typedef __allocator<_Tp1, _Alloc> other; struct rebind
}; { typedef __allocator<_Tp1, _Alloc> other; };
__allocator() throw() {} __allocator() throw() {}
__allocator(const __allocator& __a) throw() __allocator(const __allocator& __a) throw()
: __underlying_alloc(__a.__underlying_alloc) {} : __underlying_alloc(__a.__underlying_alloc) {}
template <class _Tp1>
template<typename _Tp1>
__allocator(const __allocator<_Tp1, _Alloc>& __a) throw() __allocator(const __allocator<_Tp1, _Alloc>& __a) throw()
: __underlying_alloc(__a.__underlying_alloc) {} : __underlying_alloc(__a.__underlying_alloc) {}
~__allocator() throw() {} ~__allocator() throw() {}
pointer address(reference __x) const { return &__x; } pointer
const_pointer address(const_reference __x) const { return &__x; } address(reference __x) const { return &__x; }
const_pointer
address(const_reference __x) const { return &__x; }
// __n is permitted to be 0. // __n is permitted to be 0.
_Tp* _Tp*
...@@ -749,69 +756,70 @@ template <class _Tp, class _Alloc> ...@@ -749,69 +756,70 @@ template <class _Tp, class _Alloc>
size_type size_type
max_size() const throw() { return size_t(-1) / sizeof(_Tp); } max_size() const throw() { return size_t(-1) / sizeof(_Tp); }
void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); } void
void destroy(pointer __p) { __p->~_Tp(); } construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
};
template <class _Alloc> void
class __allocator<void, _Alloc> destroy(pointer __p) { __p->~_Tp(); }
{ };
template<typename _Alloc>
class __allocator<void, _Alloc>
{
typedef size_t size_type; typedef size_t size_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef void* pointer; typedef void* pointer;
typedef const void* const_pointer; typedef const void* const_pointer;
typedef void value_type; typedef void value_type;
template <class _Tp1> struct rebind { template<typename _Tp1>
typedef __allocator<_Tp1, _Alloc> other; struct rebind
{ typedef __allocator<_Tp1, _Alloc> other; };
}; };
};
template <class _Tp, class _Alloc> template<typename _Tp, typename _Alloc>
inline bool inline bool
operator==(const __allocator<_Tp,_Alloc>& __a1, operator==(const __allocator<_Tp,_Alloc>& __a1,
const __allocator<_Tp,_Alloc>& __a2) const __allocator<_Tp,_Alloc>& __a2)
{ return __a1.__underlying_alloc == __a2.__underlying_alloc; } { return __a1.__underlying_alloc == __a2.__underlying_alloc; }
template <class _Tp, class _Alloc> template<typename _Tp, typename _Alloc>
inline bool inline bool
operator!=(const __allocator<_Tp, _Alloc>& __a1, operator!=(const __allocator<_Tp, _Alloc>& __a1,
const __allocator<_Tp, _Alloc>& __a2) const __allocator<_Tp, _Alloc>& __a2)
{ return __a1.__underlying_alloc != __a2.__underlying_alloc; } { return __a1.__underlying_alloc != __a2.__underlying_alloc; }
//@{ //@{
/** Comparison operators for all of the predifined SGI-style allocators. /** Comparison operators for all of the predifined SGI-style allocators.
* This ensures that __allocator<malloc_alloc> (for example) will work * This ensures that __allocator<malloc_alloc> (for example) will work
* correctly. As required, all allocators compare equal. * correctly. As required, all allocators compare equal.
*/ */
template <int inst> template<int inst>
inline bool inline bool
operator==(const __malloc_alloc_template<inst>&, operator==(const __malloc_alloc_template<inst>&,
const __malloc_alloc_template<inst>&) const __malloc_alloc_template<inst>&)
{ return true; } { return true; }
template <int __inst> template<int __inst>
inline bool inline bool
operator!=(const __malloc_alloc_template<__inst>&, operator!=(const __malloc_alloc_template<__inst>&,
const __malloc_alloc_template<__inst>&) const __malloc_alloc_template<__inst>&)
{ return false; } { return false; }
template <class _Alloc> template<typename _Alloc>
inline bool inline bool
operator==(const __debug_alloc<_Alloc>&, operator==(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&)
const __debug_alloc<_Alloc>&)
{ return true; } { return true; }
template <class _Alloc> template<typename _Alloc>
inline bool inline bool
operator!=(const __debug_alloc<_Alloc>&, operator!=(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&)
const __debug_alloc<_Alloc>&)
{ return false; } { return false; }
//@} //@}
/** /**
* @if maint * @if maint
* Another allocator adaptor: _Alloc_traits. This serves two purposes. * Another allocator adaptor: _Alloc_traits. This serves two purposes.
* First, make it possible to write containers that can use either "SGI" * First, make it possible to write containers that can use either "SGI"
...@@ -846,104 +854,103 @@ template <class _Alloc> ...@@ -846,104 +854,103 @@ template <class _Alloc>
* *
* @endif * @endif
* (See @link Allocators allocators info @endlink for more.) * (See @link Allocators allocators info @endlink for more.)
*/ */
//@{ //@{
// The fully general version. // The fully general version.
template <class _Tp, class _Allocator> template<typename _Tp, typename _Allocator>
struct _Alloc_traits struct _Alloc_traits
{ {
static const bool _S_instanceless = false; static const bool _S_instanceless = false;
typedef typename _Allocator::template rebind<_Tp>::other allocator_type; typedef typename _Allocator::template rebind<_Tp>::other allocator_type;
}; };
template <class _Tp, class _Allocator> template<typename _Tp, typename _Allocator>
const bool _Alloc_traits<_Tp, _Allocator>::_S_instanceless; const bool _Alloc_traits<_Tp, _Allocator>::_S_instanceless;
/// The version for the default allocator. /// The version for the default allocator.
template <class _Tp, class _Tp1> template<typename _Tp, typename _Tp1>
struct _Alloc_traits<_Tp, allocator<_Tp1> > struct _Alloc_traits<_Tp, allocator<_Tp1> >
{ {
static const bool _S_instanceless = true; static const bool _S_instanceless = true;
typedef __simple_alloc<_Tp, __alloc> _Alloc_type; typedef __simple_alloc<_Tp, __alloc> _Alloc_type;
typedef allocator<_Tp> allocator_type; typedef allocator<_Tp> allocator_type;
}; };
//@} //@}
//@{ //@{
/// Versions for the predefined "SGI" style allocators. /// Versions for the predefined "SGI" style allocators.
template <class _Tp, int __inst> template<typename _Tp, int __inst>
struct _Alloc_traits<_Tp, __malloc_alloc_template<__inst> > struct _Alloc_traits<_Tp, __malloc_alloc_template<__inst> >
{ {
static const bool _S_instanceless = true; static const bool _S_instanceless = true;
typedef __simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type; typedef __simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type;
typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type; typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type;
}; };
#ifndef __USE_MALLOC #ifndef __USE_MALLOC
template <class _Tp, bool __threads, int __inst> template<typename _Tp, bool __threads, int __inst>
struct _Alloc_traits<_Tp, __default_alloc_template<__threads, __inst> > struct _Alloc_traits<_Tp, __default_alloc_template<__threads, __inst> >
{ {
static const bool _S_instanceless = true; static const bool _S_instanceless = true;
typedef __simple_alloc<_Tp, __default_alloc_template<__threads, __inst> > typedef __simple_alloc<_Tp, __default_alloc_template<__threads, __inst> >
_Alloc_type; _Alloc_type;
typedef __allocator<_Tp, __default_alloc_template<__threads, __inst> > typedef __allocator<_Tp, __default_alloc_template<__threads, __inst> >
allocator_type; allocator_type;
}; };
#endif #endif
template <class _Tp, class _Alloc> template<typename _Tp, typename _Alloc>
struct _Alloc_traits<_Tp, __debug_alloc<_Alloc> > struct _Alloc_traits<_Tp, __debug_alloc<_Alloc> >
{ {
static const bool _S_instanceless = true; static const bool _S_instanceless = true;
typedef __simple_alloc<_Tp, __debug_alloc<_Alloc> > _Alloc_type; typedef __simple_alloc<_Tp, __debug_alloc<_Alloc> > _Alloc_type;
typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type; typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type;
}; };
//@} //@}
//@{ //@{
/// Versions for the __allocator adaptor used with the predefined "SGI" style allocators. /// Versions for the __allocator adaptor used with the predefined
template <class _Tp, class _Tp1, int __inst> /// "SGI" style allocators.
struct _Alloc_traits<_Tp, template<typename _Tp, typename _Tp1, int __inst>
struct _Alloc_traits<_Tp,
__allocator<_Tp1, __malloc_alloc_template<__inst> > > __allocator<_Tp1, __malloc_alloc_template<__inst> > >
{ {
static const bool _S_instanceless = true; static const bool _S_instanceless = true;
typedef __simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type; typedef __simple_alloc<_Tp, __malloc_alloc_template<__inst> > _Alloc_type;
typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type; typedef __allocator<_Tp, __malloc_alloc_template<__inst> > allocator_type;
}; };
#ifndef __USE_MALLOC #ifndef __USE_MALLOC
template <class _Tp, class _Tp1, bool __thr, int __inst> template<typename _Tp, typename _Tp1, bool __thr, int __inst>
struct _Alloc_traits<_Tp, struct _Alloc_traits<_Tp, __allocator<_Tp1, __default_alloc_template<__thr, __inst> > >
__allocator<_Tp1, {
__default_alloc_template<__thr, __inst> > >
{
static const bool _S_instanceless = true; static const bool _S_instanceless = true;
typedef __simple_alloc<_Tp, __default_alloc_template<__thr,__inst> > typedef __simple_alloc<_Tp, __default_alloc_template<__thr,__inst> >
_Alloc_type; _Alloc_type;
typedef __allocator<_Tp, __default_alloc_template<__thr,__inst> > typedef __allocator<_Tp, __default_alloc_template<__thr,__inst> >
allocator_type; allocator_type;
}; };
#endif #endif
template <class _Tp, class _Tp1, class _Alloc> template<typename _Tp, typename _Tp1, typename _Alloc>
struct _Alloc_traits<_Tp, __allocator<_Tp1, __debug_alloc<_Alloc> > > struct _Alloc_traits<_Tp, __allocator<_Tp1, __debug_alloc<_Alloc> > >
{ {
static const bool _S_instanceless = true; static const bool _S_instanceless = true;
typedef __simple_alloc<_Tp, __debug_alloc<_Alloc> > _Alloc_type; typedef __simple_alloc<_Tp, __debug_alloc<_Alloc> > _Alloc_type;
typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type; typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type;
}; };
//@} //@}
// Inhibit implicit instantiations for required instantiations, // Inhibit implicit instantiations for required instantiations,
// which are defined via explicit instantiations elsewhere. // which are defined via explicit instantiations elsewhere.
// NB: This syntax is a GNU extension. // NB: This syntax is a GNU extension.
extern template class allocator<char>; extern template class allocator<char>;
extern template class allocator<wchar_t>; extern template class allocator<wchar_t>;
#ifdef __USE_MALLOC #ifdef __USE_MALLOC
extern template class __malloc_alloc_template<0>; extern template class __malloc_alloc_template<0>;
#else #else
extern template class __default_alloc_template<true,0>; extern template class __default_alloc_template<true,0>;
#endif #endif
} // namespace std } // namespace std
#endif /* __GLIBCPP_INTERNAL_ALLOC_H */ #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment