Commit 2c35c7be by Phil Edwards

stl_alloc.h: Reformat as per C++STYLE.

2002-06-24  Phil Edwards  <pme@gcc.gnu.org>

	* include/bits/stl_alloc.h:  Reformat as per C++STYLE.

From-SVN: r54949
parent 6f68de5b
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.
2002-06-24 Phil Edwards <pme@gcc.gnu.org>
* config/cpu/*/bits/*: Move header files up a level. Remove bits. * config/cpu/*/bits/*: Move header files up a level. Remove bits.
* config/os/*/bits/*: Likewise. * config/os/*/bits/*: Likewise.
* configure.in: Update. * configure.in: Update.
......
...@@ -87,17 +87,18 @@ ...@@ -87,17 +87,18 @@
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); }
...@@ -105,10 +106,10 @@ namespace std ...@@ -105,10 +106,10 @@ namespace std
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
...@@ -117,16 +118,16 @@ namespace std ...@@ -117,16 +118,16 @@ namespace std
* 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)
{ {
...@@ -153,15 +154,16 @@ namespace std ...@@ -153,15 +154,16 @@ namespace std
__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>::_S_oom_malloc(size_t __n) __malloc_alloc_template<__inst>::
_S_oom_malloc(size_t __n)
{ {
void (* __my_malloc_handler)(); void (* __my_malloc_handler)();
void* __result; void* __result;
...@@ -178,9 +180,10 @@ namespace std ...@@ -178,9 +180,10 @@ namespace std
} }
} }
template <int __inst> template <int __inst>
void* void*
__malloc_alloc_template<__inst>::_S_oom_realloc(void* __p, size_t __n) __malloc_alloc_template<__inst>::
_S_oom_realloc(void* __p, size_t __n)
{ {
void (* __my_malloc_handler)(); void (* __my_malloc_handler)();
void* __result; void* __result;
...@@ -206,7 +209,7 @@ namespace std ...@@ -206,7 +209,7 @@ namespace std
#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.
...@@ -215,26 +218,30 @@ namespace std ...@@ -215,26 +218,30 @@ namespace std
* 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<class _Tp, class _Alloc>
class __simple_alloc class __simple_alloc
{ {
public: public:
static _Tp* allocate(size_t __n) static _Tp*
allocate(size_t __n)
{ return 0 == __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); } { return 0 == __n ? 0 : (_Tp*) _Alloc::allocate(__n * sizeof (_Tp)); }
static _Tp* allocate() static _Tp*
allocate()
{ return (_Tp*) _Alloc::allocate(sizeof (_Tp)); } { return (_Tp*) _Alloc::allocate(sizeof (_Tp)); }
static void deallocate(_Tp* __p, size_t __n) static void
deallocate(_Tp* __p, size_t __n)
{ if (0 != __n) _Alloc::deallocate(__p, __n * sizeof (_Tp)); } { if (0 != __n) _Alloc::deallocate(__p, __n * sizeof (_Tp)); }
static void deallocate(_Tp* __p) static void
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
...@@ -247,31 +254,33 @@ namespace std ...@@ -247,31 +254,33 @@ namespace std
* 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 <class _Alloc>
class __debug_alloc class __debug_alloc
{ {
private: private:
enum {_S_extra = 8}; // Size of space used to store size. Note that this enum {_S_extra = 8}; // Size of space used to store size. Note that this
// must be large enough to preserve alignment. // must be large enough to preserve alignment.
public: public:
static void*
static void* allocate(size_t __n) allocate(size_t __n)
{ {
char* __result = (char*)_Alloc::allocate(__n + (int) _S_extra); char* __result = (char*)_Alloc::allocate(__n + (int) _S_extra);
*(size_t*)__result = __n; *(size_t*)__result = __n;
return __result + (int) _S_extra; return __result + (int) _S_extra;
} }
static void deallocate(void* __p, size_t __n) static void
deallocate(void* __p, size_t __n)
{ {
char* __real_p = (char*)__p - (int) _S_extra; char* __real_p = (char*)__p - (int) _S_extra;
assert(*(size_t*)__real_p == __n); assert(*(size_t*)__real_p == __n);
_Alloc::deallocate(__real_p, __n + (int) _S_extra); _Alloc::deallocate(__real_p, __n + (int) _S_extra);
} }
static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz) static void*
reallocate(void* __p, size_t __old_sz, size_t __new_sz)
{ {
char* __real_p = (char*)__p - (int) _S_extra; char* __real_p = (char*)__p - (int) _S_extra;
assert(*(size_t*)__real_p == __old_sz); assert(*(size_t*)__real_p == __old_sz);
...@@ -281,7 +290,7 @@ namespace std ...@@ -281,7 +290,7 @@ namespace std
*(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
...@@ -323,8 +332,8 @@ typedef __mem_interface __single_client_alloc; ...@@ -323,8 +332,8 @@ typedef __mem_interface __single_client_alloc;
*/ */
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};
...@@ -364,15 +373,14 @@ template<bool __threads, int __inst> ...@@ -364,15 +373,14 @@ template<bool __threads, int __inst>
// It would be nice to use _STL_auto_lock here. But we need a // It would be nice to use _STL_auto_lock here. But we need a
// test whether threads are in use. // test whether threads are in use.
class _Lock struct _Lock
{ {
public:
_Lock() { if (__threads) _S_node_allocator_lock._M_acquire_lock(); } _Lock() { if (__threads) _S_node_allocator_lock._M_acquire_lock(); }
~_Lock() { if (__threads) _S_node_allocator_lock._M_release_lock(); } ~_Lock() { if (__threads) _S_node_allocator_lock._M_release_lock(); }
} __attribute__ ((__unused__)); } __attribute__ ((__unused__));
friend class _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)
...@@ -383,11 +391,9 @@ template<bool __threads, int __inst> ...@@ -383,11 +391,9 @@ template<bool __threads, int __inst>
__ret = __mem_interface::allocate(__n); __ret = __mem_interface::allocate(__n);
else else
{ {
_Obj* volatile* __my_free_list = _S_free_list _Obj* volatile* __my_free_list = _S_free_list + _S_freelist_index(__n);
+ _S_freelist_index(__n); // 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;
_Obj* __restrict__ __result = *__my_free_list; _Obj* __restrict__ __result = *__my_free_list;
if (__result == 0) if (__result == 0)
...@@ -409,8 +415,7 @@ template<bool __threads, int __inst> ...@@ -409,8 +415,7 @@ template<bool __threads, int __inst>
__mem_interface::deallocate(__p, __n); __mem_interface::deallocate(__p, __n);
else else
{ {
_Obj* volatile* __my_free_list _Obj* volatile* __my_free_list = _S_free_list + _S_freelist_index(__n);
= _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 ensures that
...@@ -423,29 +428,29 @@ template<bool __threads, int __inst> ...@@ -423,29 +428,29 @@ template<bool __threads, int __inst>
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>::_S_chunk_alloc(size_t __size, __default_alloc_template<__threads, __inst>::
int& __nobjs) _S_chunk_alloc(size_t __size, int& __nobjs)
{ {
char* __result; char* __result;
size_t __total_bytes = __size * __nobjs; size_t __total_bytes = __size * __nobjs;
...@@ -514,12 +519,13 @@ template<bool __threads, int __inst> ...@@ -514,12 +519,13 @@ 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>::_S_refill(size_t __n) __default_alloc_template<__threads, __inst>::
_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);
...@@ -529,19 +535,24 @@ template<bool __threads, int __inst> ...@@ -529,19 +535,24 @@ template<bool __threads, int __inst>
_Obj* __next_obj; _Obj* __next_obj;
int __i; int __i;
if (1 == __nobjs) return(__chunk); if (1 == __nobjs)
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++)
{
__current_obj = __next_obj; __current_obj = __next_obj;
__next_obj = (_Obj*)((char*)__next_obj + __n); __next_obj = (_Obj*)((char*)__next_obj + __n);
if (__nobjs - 1 == __i) { if (__nobjs - 1 == __i)
{
__current_obj -> _M_free_list_link = 0; __current_obj -> _M_free_list_link = 0;
break; break;
} else { }
else
{
__current_obj -> _M_free_list_link = __next_obj; __current_obj -> _M_free_list_link = __next_obj;
} }
} }
...@@ -549,19 +560,18 @@ template<bool __threads, int __inst> ...@@ -549,19 +560,18 @@ template<bool __threads, int __inst>
} }
template<bool threads, int inst> template<bool threads, int inst>
void* void*
__default_alloc_template<threads, inst>::reallocate(void* __p, __default_alloc_template<threads, inst>::
size_t __old_sz, reallocate(void* __p, size_t __old_sz, size_t __new_sz)
size_t __new_sz)
{ {
void* __result; void* __result;
size_t __copy_sz; size_t __copy_sz;
if (__old_sz > (size_t) _MAX_BYTES && __new_sz > (size_t) _MAX_BYTES) { if (__old_sz > (size_t) _MAX_BYTES && __new_sz > (size_t) _MAX_BYTES)
return(realloc(__p, __new_sz)); return(realloc(__p, __new_sz));
} if (_S_round_up(__old_sz) == _S_round_up(__new_sz))
if (_S_round_up(__old_sz) == _S_round_up(__new_sz)) return(__p); return(__p);
__result = allocate(__new_sz); __result = allocate(__new_sz);
__copy_sz = __new_sz > __old_sz? __old_sz : __new_sz; __copy_sz = __new_sz > __old_sz? __old_sz : __new_sz;
memcpy(__result, __p, __copy_sz); memcpy(__result, __p, __copy_sz);
...@@ -569,26 +579,26 @@ template<bool __threads, int __inst> ...@@ -569,26 +579,26 @@ 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> template<bool __threads, int __inst>
char* __default_alloc_template<__threads, __inst>::_S_start_free = 0; 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_end_free = 0;
template<bool __threads, int __inst> template<bool __threads, int __inst>
size_t __default_alloc_template<__threads, __inst>::_S_heap_size = 0; size_t __default_alloc_template<__threads,__inst>::_S_heap_size = 0;
template<bool __threads, int __inst> template<bool __threads, int __inst>
typename __default_alloc_template<__threads, __inst>::_Obj* volatile typename __default_alloc_template<__threads,__inst>::_Obj* volatile
__default_alloc_template<__threads, __inst>::_S_free_list[_NFREELISTS]; __default_alloc_template<__threads,__inst>::_S_free_list[_NFREELISTS];
typedef __default_alloc_template<true, 0> __alloc; typedef __default_alloc_template<true,0> __alloc;
typedef __default_alloc_template<false, 0> __single_client_alloc; typedef __default_alloc_template<false,0> __single_client_alloc;
#endif /* ! __USE_MALLOC */ #endif /* ! __USE_MALLOC */
...@@ -637,24 +647,28 @@ public: ...@@ -637,24 +647,28 @@ public:
// __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* allocate(size_type __n, const void* = 0) { _Tp*
allocate(size_type __n, const void* = 0)
{
return __n != 0 ? static_cast<_Tp*>(_Alloc::allocate(__n * sizeof(_Tp))) return __n != 0 ? static_cast<_Tp*>(_Alloc::allocate(__n * sizeof(_Tp)))
: 0; : 0;
} }
// __p is not permitted to be a null pointer. // __p is not permitted to be a null pointer.
void deallocate(pointer __p, size_type __n) void
deallocate(pointer __p, size_type __n)
{ _Alloc::deallocate(__p, __n * sizeof(_Tp)); } { _Alloc::deallocate(__p, __n * sizeof(_Tp)); }
size_type max_size() const throw() size_type
{ 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 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;
...@@ -669,16 +683,14 @@ public: ...@@ -669,16 +683,14 @@ public:
template <class _T1, class _T2> template <class _T1, class _T2>
inline bool operator==(const allocator<_T1>&, const allocator<_T2>&) inline bool
{ operator==(const allocator<_T1>&, const allocator<_T2>&)
return true; { return true; }
}
template <class _T1, class _T2> template <class _T1, class _T2>
inline bool operator!=(const allocator<_T1>&, const allocator<_T2>&) inline bool
{ operator!=(const allocator<_T1>&, const allocator<_T2>&)
return false; { return false; }
}
/** /**
...@@ -693,7 +705,7 @@ inline bool operator!=(const allocator<_T1>&, const allocator<_T2>&) ...@@ -693,7 +705,7 @@ inline bool operator!=(const allocator<_T1>&, const allocator<_T2>&)
* (See @link Allocators allocators info @endlink for more.) * (See @link Allocators allocators info @endlink for more.)
*/ */
template <class _Tp, class _Alloc> template <class _Tp, class _Alloc>
struct __allocator struct __allocator
{ {
_Alloc __underlying_alloc; _Alloc __underlying_alloc;
...@@ -721,25 +733,29 @@ struct __allocator ...@@ -721,25 +733,29 @@ struct __allocator
const_pointer address(const_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* allocate(size_type __n, const void* = 0) { _Tp*
allocate(size_type __n, const void* = 0)
{
return __n != 0 return __n != 0
? static_cast<_Tp*>(__underlying_alloc.allocate(__n * sizeof(_Tp))) ? static_cast<_Tp*>(__underlying_alloc.allocate(__n * sizeof(_Tp)))
: 0; : 0;
} }
// __p is not permitted to be a null pointer. // __p is not permitted to be a null pointer.
void deallocate(pointer __p, size_type __n) void
deallocate(pointer __p, size_type __n)
{ __underlying_alloc.deallocate(__p, __n * sizeof(_Tp)); } { __underlying_alloc.deallocate(__p, __n * sizeof(_Tp)); }
size_type max_size() const throw() size_type
{ 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 construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
void destroy(pointer __p) { __p->~_Tp(); } void destroy(pointer __p) { __p->~_Tp(); }
}; };
template <class _Alloc> template <class _Alloc>
class __allocator<void, _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;
...@@ -752,18 +768,16 @@ class __allocator<void, _Alloc> { ...@@ -752,18 +768,16 @@ class __allocator<void, _Alloc> {
}; };
template <class _Tp, class _Alloc> template <class _Tp, class _Alloc>
inline bool operator==(const __allocator<_Tp, _Alloc>& __a1, inline bool
const __allocator<_Tp, _Alloc>& __a2) operator==(const __allocator<_Tp,_Alloc>& __a1,
{ 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 <class _Tp, class _Alloc>
inline bool operator!=(const __allocator<_Tp, _Alloc>& __a1, inline bool
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;
}
//@{ //@{
...@@ -772,30 +786,28 @@ inline bool operator!=(const __allocator<_Tp, _Alloc>& __a1, ...@@ -772,30 +786,28 @@ inline bool operator!=(const __allocator<_Tp, _Alloc>& __a1,
* correctly. As required, all allocators compare equal. * correctly. As required, all allocators compare equal.
*/ */
template <int inst> template <int inst>
inline bool operator==(const __malloc_alloc_template<inst>&, inline bool
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 operator!=(const __malloc_alloc_template<__inst>&, inline bool
operator!=(const __malloc_alloc_template<__inst>&,
const __malloc_alloc_template<__inst>&) const __malloc_alloc_template<__inst>&)
{ { return false; }
return false;
}
template <class _Alloc> template <class _Alloc>
inline bool operator==(const __debug_alloc<_Alloc>&, inline bool
const __debug_alloc<_Alloc>&) { operator==(const __debug_alloc<_Alloc>&,
return true; const __debug_alloc<_Alloc>&)
} { return true; }
template <class _Alloc> template <class _Alloc>
inline bool operator!=(const __debug_alloc<_Alloc>&, inline bool
const __debug_alloc<_Alloc>&) { operator!=(const __debug_alloc<_Alloc>&,
return false; const __debug_alloc<_Alloc>&)
} { return false; }
//@} //@}
...@@ -922,20 +934,16 @@ struct _Alloc_traits<_Tp, __allocator<_Tp1, __debug_alloc<_Alloc> > > ...@@ -922,20 +934,16 @@ struct _Alloc_traits<_Tp, __allocator<_Tp1, __debug_alloc<_Alloc> > >
}; };
//@} //@}
// 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 /* __GLIBCPP_INTERNAL_ALLOC_H */
// Local Variables:
// mode:C++
// End:
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