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