177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1996,1997
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc.
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1997
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Moscow Center for SPARC Technology
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk.
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies.
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted,
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice.
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* NOTE: This is an internal header file, included by other STL headers.
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *   You should not attempt to use it directly.
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ALLOC_H
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_INTERNAL_ALLOC_H
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_CSTDDEF
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_cstddef.h>
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_CSTDLIB
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_cstdlib.h>
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_CSTRING
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_cstring.h>
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ALGOBASE_H
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_algobase.h>
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_NEW_HEADER
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_new.h>
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_CONSTRUCT_H
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_construct.h>
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Malloc-based allocator.  Typically slower than default alloc below.
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Typically thread-safe and more storage efficient.
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_USE_NO_IOSTREAMS)
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef void (* __oom_handler_type)();
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _STLP_CLASS_DECLSPEC __malloc_alloc {
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // this one is needed for proper simple_alloc wrapping
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef char value_type;
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void* _STLP_CALL allocate(size_t __n)
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_USE_NO_IOSTREAMS)
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ;
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    void *__result = malloc(__n);
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__result == 0) {
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_THROW_BAD_ALLOC;
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return __result;
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void _STLP_CALL deallocate(void* __p, size_t /* __n */) { free((char*)__p); }
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_USE_NO_IOSTREAMS)
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static __oom_handler_type _STLP_CALL set_malloc_handler(__oom_handler_type __f);
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// New-based allocator.  Typically slower than default alloc below.
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Typically thread-safe and more storage efficient.
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _STLP_CLASS_DECLSPEC __new_alloc {
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // this one is needed for proper simple_alloc wrapping
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef char value_type;
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void* _STLP_CALL allocate(size_t __n) { return __stl_new(__n); }
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void _STLP_CALL deallocate(void* __p, size_t) { __stl_delete(__p); }
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Allocator adaptor to check size arguments for debugging.
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Reports errors using assert.  Checking can be disabled with
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// NDEBUG, but it's far better to just use the underlying allocator
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// instead when no checking is desired.
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// There is some evidence that this can confuse Purify.
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// This adaptor can only be applied to raw allocators
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Alloc>
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass __debug_alloc : public _Alloc {
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Alloc __allocator_type;
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef typename _Alloc::value_type value_type;
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate:
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  struct __alloc_header {
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size_t __magic: 16;
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    size_t __type_size:16;
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_UINT32_T _M_size;
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }; // that is 8 bytes for sure
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Sunpro CC has bug on enums, so extra_before/after set explicitly
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  enum { __pad = 8, __magic = 0xdeba, __deleted_magic = 0xdebd,
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner         __shred_byte = _STLP_SHRED_BYTE };
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  enum { __extra_before = 16, __extra_after = 8 };
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Size of space used to store size.  Note
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // that this must be large enough to preserve
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // alignment.
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static size_t _STLP_CALL __extra_before_chunk() {
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return (long)__extra_before / sizeof(value_type) +
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      (size_t)((long)__extra_before % sizeof(value_type) > 0);
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static size_t _STLP_CALL __extra_after_chunk() {
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return (long)__extra_after / sizeof(value_type) +
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      (size_t)((long)__extra_after % sizeof(value_type) > 0);
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __debug_alloc() {}
13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ~__debug_alloc() {}
13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void* _STLP_CALL allocate(size_t);
13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void _STLP_CALL deallocate(void *, size_t);
13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (__OS400__)
13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// dums 02/05/2007: is it really necessary ?
13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerenum { _MAX_BYTES = 256 };
14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  else
14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerenum { _MAX_BYTES = 32 * sizeof(void*) };
14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_USE_NO_IOSTREAMS)
14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Default node allocator.
14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// With a reasonable compiler, this should be roughly as fast as the
14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// original STL class-specific allocators, but with less fragmentation.
14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _STLP_CLASS_DECLSPEC __node_alloc {
14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void * _STLP_CALL _M_allocate(size_t& __n);
15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* __p may not be 0 */
15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void _STLP_CALL _M_deallocate(void *__p, size_t __n);
15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // this one is needed for proper simple_alloc wrapping
15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef char value_type;
15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* __n must be > 0      */
15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void* _STLP_CALL allocate(size_t& __n)
15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return (__n > (size_t)_MAX_BYTES) ? __stl_new(__n) : _M_allocate(__n); }
15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* __p may not be 0 */
16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void _STLP_CALL deallocate(void *__p, size_t __n)
16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { if (__n > (size_t)_MAX_BYTES) __stl_delete(__p); else _M_deallocate(__p, __n); }
16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_USE_TEMPLATE_EXPORT)
16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_EXPORT_TEMPLATE_CLASS __debug_alloc<__node_alloc>;
16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_TEMPLATE_EXPORT)
17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_EXPORT_TEMPLATE_CLASS __debug_alloc<__new_alloc>;
17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_EXPORT_TEMPLATE_CLASS __debug_alloc<__malloc_alloc>;
17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* macro to convert the allocator for initialization
17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * not using MEMBER_TEMPLATE_CLASSES as it should work given template constructor  */
17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MEMBER_TEMPLATES) || ! defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* if _STLP_NO_TEMPLATE_CONVERSIONS is set, the member template constructor is
17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * not used implicitly to convert allocator parameter, so let us do it explicitly */
18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined (_STLP_NO_TEMPLATE_CONVERSIONS)
18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    define _STLP_CONVERT_ALLOCATOR(__a, _Tp) __stl_alloc_create(__a,(_Tp*)0)
18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  else
18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#    define _STLP_CONVERT_ALLOCATOR(__a, _Tp) __a
18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* else convert, but only if partial specialization works, since else
18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Container::allocator_type won't be different */
18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_CONVERT_ALLOCATOR(__a, _Tp) __stl_alloc_create(__a,(_Tp*)0)
18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Another allocator adaptor: _Alloc_traits.  This serves two
19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// purposes.  First, make it possible to write containers that can use
19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// either SGI-style allocators or standard-conforming allocator.
19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// The fully general version.
19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp, class _Allocator>
19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Alloc_traits {
19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Allocator _Orig;
19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE)
20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef typename _Allocator::_STLP_TEMPLATE rebind<_Tp> _Rebind_type;
20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef typename _Rebind_type::other  allocator_type;
20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static allocator_type create_allocator(const _Orig& __a)
20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return allocator_type(_STLP_CONVERT_ALLOCATOR(__a, _Tp)); }
20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // this is not actually true, used only to pass this type through
20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // to dynamic overload selection in _STLP_alloc_proxy methods
20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Allocator allocator_type;
20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_PERTHREAD_ALLOC)
21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// include additional header here
21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_pthread_alloc.h>
21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __pthread_alloc __alloc_type;
21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#elif defined (_STLP_USE_NEWALLOC)
22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __new_alloc __alloc_type;
22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#elif defined (_STLP_USE_MALLOC)
22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __malloc_alloc __alloc_type;
22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __node_alloc __alloc_type;
22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_ALLOC)
22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __debug_alloc<__alloc_type> __sgi_alloc;
22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __alloc_type __sgi_alloc;
23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_ANACHRONISMS)
23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __sgi_alloc __single_client_alloc;
23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __sgi_alloc __multithreaded_alloc;
23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// This implements allocators as specified in the C++ standard.
23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Note that standard-conforming allocators use many language features
24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// that are not yet widely implemented.  In particular, they rely on
24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// member templates, partial specialization, partial ordering of function
24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// templates, the typename keyword, and the use of the template keyword
24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// to refer to a template member of a dependent type.
24577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _AllocatorAux {
24977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp*       pointer;
25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp* const_pointer;
25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp&       reference;
25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp& const_reference;
25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pointer address(reference __x) const {return &__x;}
25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const_pointer address(const_reference __x) const { return &__x; }
25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _AllocatorAux<const _Tp> {
26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp*       pointer;
26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp* const_pointer;
26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp&       reference;
26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp& const_reference;
26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const_pointer address(const_reference __x) const { return &__x; }
26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner*/
26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass allocator //: public _AllocatorAux<_Tp>
27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* A small helper struct to recognize STLport allocator implementation
27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * from any user specialization one.
27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                : public __stlport_class<allocator<_Tp> >
27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp        value_type;
27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp*       pointer;
27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp* const_pointer;
28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp&       reference;
28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp& const_reference;
28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef size_t     size_type;
28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef ptrdiff_t  difference_type;
28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  template <class _Tp1> struct rebind {
28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef allocator<_Tp1> other;
28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  };
28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  allocator() _STLP_NOTHROW {}
29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MEMBER_TEMPLATES)
29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  template <class _Tp1> allocator(const allocator<_Tp1>&) _STLP_NOTHROW {}
29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  allocator(const allocator<_Tp>&) _STLP_NOTHROW {}
29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_MOVE_SEMANTIC)
29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  allocator(__move_source<allocator<_Tp> > src) _STLP_NOTHROW {}
29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ~allocator() _STLP_NOTHROW {}
29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pointer address(reference __x) const {return &__x;}
29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const_pointer address(const_reference __x) const { return &__x; }
30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // __n is permitted to be 0.  The C++ standard says nothing about what the return value is when __n == 0.
30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n, const void* = 0) {
30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n > max_size()) {
30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_THROW_BAD_ALLOC;
30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n != 0) {
30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      size_type __buf_size = __n * sizeof(value_type);
30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _Tp* __ret = __REINTERPRET_CAST(_Tp*, __sgi_alloc::allocate(__buf_size));
30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)
30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size);
31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return __ret;
31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return 0;
31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // __p is permitted to be a null pointer, only if n==0.
31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void deallocate(pointer __p, size_type __n) {
31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_ASSERT( (__p == 0) == (__n == 0) )
31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__p != 0) {
32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)
32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memset((char*)__p, _STLP_SHRED_BYTE, __n * sizeof(value_type));
32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      __sgi_alloc::deallocate((void*)__p, __n * sizeof(value_type));
32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_ANACHRONISMS)
32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // backwards compatibility
32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void deallocate(pointer __p) const {  if (__p != 0) __sgi_alloc::deallocate((void*)__p, sizeof(value_type)); }
32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_type max_size() const _STLP_NOTHROW  { return size_t(-1) / sizeof(value_type); }
33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void construct(pointer __p, const_reference __val) { _STLP_STD::_Copy_Construct(__p, __val); }
33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void destroy(pointer __p) { _STLP_STD::_Destroy(__p); }
33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_NO_EXTENSIONS)
33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* STLport extension giving rounded size of an allocated memory buffer
33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * This method do not have to be part of a user defined allocator implementation
33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * and won't even be called if such a function was granted.
33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   */
33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:
34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* _M_allocate(size_type __n, size_type& __allocated_n) {
34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n > max_size()) {
34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_THROW_BAD_ALLOC;
34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n != 0) {
34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      size_type __buf_size = __n * sizeof(value_type);
34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _Tp* __ret = __REINTERPRET_CAST(_Tp*, __sgi_alloc::allocate(__buf_size));
34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)
35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size);
35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      __allocated_n = __buf_size / sizeof(value_type);
35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return __ret;
35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return 0;
35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void _M_swap_workaround(allocator<_Tp>& __other) {}
36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _STLP_CLASS_DECLSPEC allocator<void> {
36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef size_t      size_type;
36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef ptrdiff_t   difference_type;
36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef void*       pointer;
36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const void* const_pointer;
37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef void        value_type;
37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  template <class _Tp1> struct rebind {
37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef allocator<_Tp1> other;
37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  };
37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _T1, class _T2>
38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool _STLP_CALL operator==(const allocator<_T1>&, const allocator<_T2>&) _STLP_NOTHROW
38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return true; }
38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _T1, class _T2>
38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool _STLP_CALL operator!=(const allocator<_T1>&, const allocator<_T2>&) _STLP_NOTHROW
38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return false; }
38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_TEMPLATE_EXPORT)
38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_EXPORT_TEMPLATE_CLASS allocator<char>;
38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_HAS_WCHAR_T)
39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_EXPORT_TEMPLATE_CLASS allocator<wchar_t>;
39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
39277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_USE_PTR_SPECIALIZATIONS)
39377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_EXPORT_TEMPLATE_CLASS allocator<void*>;
39477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
39577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
39677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
39777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE
39877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
39977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
40077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __alloc_type_traits {
40177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (__BORLANDC__)
40277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef typename _IsSTLportClass<allocator<_Tp> >::_Ret _STLportAlloc;
40377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
40477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  enum { _Is = _IsSTLportClass<allocator<_Tp> >::_Is };
40577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef typename __bool2type<_Is>::_Ret _STLportAlloc;
40677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
40777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //The default allocator implementation which is recognize thanks to the
40877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //__stlport_class inheritance is a stateless object so:
40977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_default_constructor;
41077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_copy_constructor;
41177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_assignment_operator;
41277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_destructor;
41377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc is_POD_type;
41477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
41577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
41677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE
41777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
41877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
41977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
42077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<allocator<_Tp> > : _STLP_PRIV __alloc_type_traits<_Tp> {};
42177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
42277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
42377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<allocator<char> > : _STLP_PRIV __alloc_type_traits<char> {};
42477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_HAS_WCHAR_T)
42577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
42677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<allocator<wchar_t> > : _STLP_PRIV __alloc_type_traits<wchar_t> {};
42777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
42877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_USE_PTR_SPECIALIZATIONS)
42977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
43077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<allocator<void*> > : _STLP_PRIV __alloc_type_traits<void*> {};
43177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
43277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
43377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_FORCE_ALLOCATORS)
43677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  define _STLP_FORCE_ALLOCATORS(a,y)
43777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
43877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_MEMBER_TEMPLATE_CLASSES)
44077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// The version for the default allocator, for rare occasion when we have partial spec w/o member template classes
44177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp, class _Tp1>
44277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Alloc_traits<_Tp, allocator<_Tp1> > {
44377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef allocator<_Tp1> _Orig;
44477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef allocator<_Tp> allocator_type;
44577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static allocator_type create_allocator(const allocator<_Tp1 >& __a)
44677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return allocator_type(_STLP_CONVERT_ALLOCATOR(__a, _Tp)); }
44777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
44877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
44977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
45077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE) && defined (_STLP_MEMBER_TEMPLATES)
45177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp, class _Alloc>
45277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline _STLP_TYPENAME_ON_RETURN_TYPE _Alloc_traits<_Tp, _Alloc>::allocator_type  _STLP_CALL
45377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__stl_alloc_create(const _Alloc& __a, const _Tp*) {
45477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef typename _Alloc::_STLP_TEMPLATE rebind<_Tp>::other _Rebound_type;
45577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return _Rebound_type(__a);
45677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
45777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
45877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// If custom allocators are being used without member template classes support :
45977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// user (on purpose) is forced to define rebind/get operations !!!
46077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp1, class _Tp2>
46177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline allocator<_Tp2>& _STLP_CALL
46277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__stl_alloc_rebind(allocator<_Tp1>& __a, const _Tp2*) {  return (allocator<_Tp2>&)(__a); }
46377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp1, class _Tp2>
46477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline allocator<_Tp2> _STLP_CALL
46577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__stl_alloc_create(const allocator<_Tp1>&, const _Tp2*) { return allocator<_Tp2>(); }
46677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
46777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
46877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE
46977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
47077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// inheritance is being used for EBO optimization
47177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Value, class _Tp, class _MaybeReboundAlloc>
47277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _STLP_alloc_proxy : public _MaybeReboundAlloc {
47377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate:
47477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _MaybeReboundAlloc _Base;
47577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef typename _Base::size_type size_type;
47677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLP_alloc_proxy<_Value, _Tp, _MaybeReboundAlloc> _Self;
47777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
47877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Value _M_data;
47977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
48077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_alloc_proxy (const _MaybeReboundAlloc& __a, _Value __p) :
48177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _MaybeReboundAlloc(__a), _M_data(__p) {}
48277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
48377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_NO_MOVE_SEMANTIC)
48477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_alloc_proxy (__move_source<_Self> src) :
48577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _Base(_STLP_PRIV _AsMoveSource(src.get()._M_base())),
48677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_data(_STLP_PRIV _AsMoveSource(src.get()._M_data)) {}
48777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
48877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Base& _M_base()
48977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return *this; }
49077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
49177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
49277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate:
49377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* Following are helper methods to detect stateless allocators and avoid
49477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * swap in this case. For some compilers (VC6) it is a workaround for a
49577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * compiler bug in the Empty Base class Optimization feature, for others
49677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * it is a small optimization or nothing if no EBO. */
49777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void _M_swap_alloc(_Self&, const __true_type& /*_IsStateless*/)
49877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  {}
49977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
50077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void _M_swap_alloc(_Self& __x, const __false_type& /*_IsStateless*/) {
50177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _MaybeReboundAlloc &__base_this = *this;
50277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _MaybeReboundAlloc &__base_x = __x;
50377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STD::swap(__base_this, __base_x);
50477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
50577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
50677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
50777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void _M_swap_alloc(_Self& __x) {
50877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (__BORLANDC__)
50977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef typename _IsStateless<_MaybeReboundAlloc>::_Ret _StatelessAlloc;
51077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
51177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef typename __bool2type<_IsStateless<_MaybeReboundAlloc>::_Is>::_Ret _StatelessAlloc;
51277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
51377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_swap_alloc(__x, _StatelessAlloc());
51477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
51577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
51677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* We need to define the following swap implementation for allocator with state
51777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * as those allocators might have implement a special swap function to correctly
51877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * move datas from an instance to the oher, _STLP_alloc_proxy should not break
51977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * this mecanism. */
52077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void swap(_Self& __x) {
52177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_swap_alloc(__x);
52277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STD::swap(_M_data, __x._M_data);
52377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
52477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
52577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n, size_type& __allocated_n) {
52677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (__BORLANDC__)
52777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef typename _IsSTLportClass<_MaybeReboundAlloc>::_Ret _STLportAlloc;
52877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
52977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef typename __bool2type<_IsSTLportClass<_MaybeReboundAlloc>::_Is>::_Ret _STLportAlloc;
53077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
53177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    return allocate(__n, __allocated_n, _STLportAlloc());
53277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
53377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
53477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Unified interface to perform allocate()/deallocate() with limited
53577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // language support
53677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE)
53777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // else it is rebound already, and allocate() member is accessible
53877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n)
53977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return __stl_alloc_rebind(__STATIC_CAST(_Base&, *this), __STATIC_CAST(_Tp*, 0)).allocate(__n, 0); }
54077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void deallocate(_Tp* __p, size_type __n)
54177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { __stl_alloc_rebind(__STATIC_CAST(_Base&, *this), __STATIC_CAST(_Tp*, 0)).deallocate(__p, __n); }
54277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate:
54377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n, size_type& __allocated_n, const __true_type& /*STLport allocator*/)
54477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return __stl_alloc_rebind(__STATIC_CAST(_Base&, *this), __STATIC_CAST(_Tp*, 0))._M_allocate(__n, __allocated_n); }
54577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
54677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //Expose Standard allocate overload (using expression do not work for some compilers (Borland))
54777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n)
54877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return _Base::allocate(__n); }
54977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate:
55077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n, size_type& __allocated_n, const __true_type& /*STLport allocator*/)
55177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return _Base::_M_allocate(__n, __allocated_n); }
55277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
55377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
55477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n, size_type& __allocated_n, const __false_type& /*STLport allocator*/)
55577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { __allocated_n = __n; return allocate(__n); }
55677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
55777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
55877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_TEMPLATE_EXPORT)
55977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<char*, char, allocator<char> >;
56077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_HAS_WCHAR_T)
56177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<wchar_t*, wchar_t, allocator<wchar_t> >;
56277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
56377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_USE_PTR_SPECIALIZATIONS)
56477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<void**, void*, allocator<void*> >;
56577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
56677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
56777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
56877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE
56977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
57077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
57177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
57277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_alloc.c>
57377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
57477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
57577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_INTERNAL_ALLOC_H */
57677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
57777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables:
57877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++
57977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End:
58077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
581