19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc. 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk. 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies. 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted, 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice. 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_PTHREAD_ALLOC_H 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_PTHREAD_ALLOC_H 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Pthread-specific node allocator. 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This is similar to the default allocator, except that free-list 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * information is kept separately for each thread, avoiding locking. 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This should be reasonably fast even in the presence of threads. 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * The down side is that storage may not be well-utilized. 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * It is not an error to allocate memory in thread A and deallocate 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * it in thread B. But this effectively transfers ownership of the memory, 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * so that it can only be reallocated by thread B. Thus this can effectively 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * result in a storage leak if it's done on a regular basis. 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * It can also result in frequent sharing of 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * cache lines among processors, with potentially serious performance 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * consequences. 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_PTHREADS) 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# error POSIX specific allocator implementation. Your system do not seems to \ 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockhave this interface so please comment the _STLP_USE_PERTHREAD_ALLOC macro \ 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockor report to the STLport forum. 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_USE_NO_IOSTREAMS) 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# error You cannot use per thread allocator implementation without building \ 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve BlockSTLport libraries. 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ALLOC_H 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# include <stl/_alloc.h> 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Pthread_alloc_per_thread_state; 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Pthread-specific allocator. 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _STLP_CLASS_DECLSPEC _Pthread_alloc { 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: // but only for internal use: 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Pthread_alloc_per_thread_state __state_type; 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef char value_type; 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Return a recycled or new per thread state. 739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static __state_type * _STLP_CALL _S_get_per_thread_state(); 749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* n must be > 0 */ 769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void * _STLP_CALL allocate(size_t& __n); 779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* p may not be 0 */ 799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _STLP_CALL deallocate(void *__p, size_t __n); 809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // boris : versions for per_thread_allocator 829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* n must be > 0 */ 839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void * _STLP_CALL allocate(size_t& __n, __state_type* __a); 849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* p may not be 0 */ 869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void _STLP_CALL deallocate(void *__p, size_t __n, __state_type* __a); 879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block static void * _STLP_CALL reallocate(void *__p, size_t __old_sz, size_t& __new_sz); 899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef _STLP_PRIV _Pthread_alloc __pthread_alloc; 949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktypedef __pthread_alloc pthread_alloc; 959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass pthread_allocator : public __stlport_class<pthread_allocator<_Tp> > { 989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef pthread_alloc _S_Alloc; // The underlying allocator. 999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 1009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef size_t size_type; 1019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef ptrdiff_t difference_type; 1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Tp* pointer; 1039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef const _Tp* const_pointer; 1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Tp& reference; 1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef const _Tp& const_reference; 1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Tp value_type; 1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_MEMBER_TEMPLATE_CLASSES 1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _NewType> struct rebind { 1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef pthread_allocator<_NewType> other; 1119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block }; 1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pthread_allocator() _STLP_NOTHROW {} 1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pthread_allocator(const pthread_allocator<_Tp>& a) _STLP_NOTHROW {} 1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) /* && defined (_STLP_FUNCTION_PARTIAL_ORDER) */ 1189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _OtherType> pthread_allocator(const pthread_allocator<_OtherType>&) 1199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_NOTHROW {} 1209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~pthread_allocator() _STLP_NOTHROW {} 1239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pointer address(reference __x) const { return &__x; } 1259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_pointer address(const_reference __x) const { return &__x; } 1269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // __n is permitted to be 0. The C++ standard says nothing about what 1289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // the return value is when __n == 0. 1299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* allocate(size_type __n, const void* = 0) { 1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n > max_size()) { 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n != 0) { 1349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __buf_size = __n * sizeof(value_type); 1359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* __ret = __REINTERPRET_CAST(value_type*, _S_Alloc::allocate(__buf_size)); 1369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC) 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size); 1389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __ret; 1409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 1429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return 0; 1439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void deallocate(pointer __p, size_type __n) { 1469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT( (__p == 0) == (__n == 0) ) 1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__p != 0) { 1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC) 1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block memset((char*)__p, _STLP_SHRED_BYTE, __n * sizeof(value_type)); 1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_Alloc::deallocate(__p, __n * sizeof(value_type)); 1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type max_size() const _STLP_NOTHROW 1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return size_t(-1) / sizeof(_Tp); } 1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 158e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); } 1599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void destroy(pointer _p) { _p->~_Tp(); } 1609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_NO_EXTENSIONS) 1629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* STLport extension giving rounded size of an allocated memory buffer 1639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This method do not have to be part of a user defined allocator implementation 1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * and won't even be called if such a function was granted. 1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: 1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* allocate(size_type __n, size_type& __allocated_n) { 1699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n > max_size()) { 170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n != 0) { 1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __buf_size = __n * sizeof(value_type); 1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* __ret = __REINTERPRET_CAST(value_type*, _S_Alloc::allocate(__buf_size)); 1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC) 176e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size); 1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __allocated_n = __buf_size / sizeof(value_type); 1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __ret; 1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return 0; 1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 184e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) 185e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void _M_swap_workaround(pthread_allocator<_Tp>& __x) {} 186e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL 1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _STLP_CLASS_DECLSPEC pthread_allocator<void> { 1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef size_t size_type; 1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef ptrdiff_t difference_type; 1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef void* pointer; 1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef const void* const_pointer; 1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef void value_type; 1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_MEMBER_TEMPLATE_CLASSES 1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _NewType> struct rebind { 1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef pthread_allocator<_NewType> other; 2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block }; 2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1, class _T2> 2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator==(const pthread_allocator<_T1>&, 2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const pthread_allocator<_T2>& a2) 2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return true; } 2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER 2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1, class _T2> 2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator!=(const pthread_allocator<_T1>&, 2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const pthread_allocator<_T2>&) 2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return false; } 2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Atype> 2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Alloc_traits<_Tp, pthread_allocator<_Atype> > 2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ typedef pthread_allocator<_Tp> allocator_type; }; 2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE) 2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp1, class _Tp2> 2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline pthread_allocator<_Tp2>& 2299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__stl_alloc_rebind(pthread_allocator<_Tp1>& __x, const _Tp2*) 2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return (pthread_allocator<_Tp2>&)__x; } 2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp1, class _Tp2> 2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline pthread_allocator<_Tp2> 2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__stl_alloc_create(pthread_allocator<_Tp1>&, const _Tp2*) 2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return pthread_allocator<_Tp2>(); } 2369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 2409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 2429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __pthread_alloc_type_traits { 2439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _IsSTLportClass<pthread_allocator<_Tp> >::_Ret _STLportAlloc; 2449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //The default allocator implementation which is recognize thanks to the 2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //__stlport_class inheritance is a stateless object so: 2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLportAlloc has_trivial_default_constructor; 2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLportAlloc has_trivial_copy_constructor; 2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLportAlloc has_trivial_assignment_operator; 2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLportAlloc has_trivial_destructor; 2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLportAlloc is_POD_type; 2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<pthread_allocator<_Tp> > : _STLP_PRIV __pthread_alloc_type_traits<_Tp> {}; 2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL 2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<pthread_allocator<char> > : _STLP_PRIV __pthread_alloc_type_traits<char> {}; 2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (_STLP_HAS_WCHAR_T) 2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL 2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<pthread_allocator<wchar_t> > : _STLP_PRIV __pthread_alloc_type_traits<wchar_t> {}; 2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (_STLP_USE_PTR_SPECIALIZATIONS) 2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL 2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<pthread_allocator<void*> > : _STLP_PRIV __pthread_alloc_type_traits<void*> {}; 2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// per_thread_allocator<> : this allocator always return memory to the same thread 2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// it was allocated from. 2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// 2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass per_thread_allocator { 2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef pthread_alloc _S_Alloc; // The underlying allocator. 2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef pthread_alloc::__state_type __state_type; 2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef size_t size_type; 2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef ptrdiff_t difference_type; 2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Tp* pointer; 2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef const _Tp* const_pointer; 2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Tp& reference; 2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef const _Tp& const_reference; 2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _Tp value_type; 2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_MEMBER_TEMPLATE_CLASSES 2909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _NewType> struct rebind { 2919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef per_thread_allocator<_NewType> other; 2929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block }; 2939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 2949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 2959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block per_thread_allocator() _STLP_NOTHROW { 2969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _M_state = _S_Alloc::_S_get_per_thread_state(); 2979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 2989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block per_thread_allocator(const per_thread_allocator<_Tp>& __a) _STLP_NOTHROW : _M_state(__a._M_state){} 2999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_MEMBER_TEMPLATES) /* && defined (_STLP_FUNCTION_PARTIAL_ORDER) */ 3019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _OtherType> per_thread_allocator(const per_thread_allocator<_OtherType>& __a) 3029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_NOTHROW : _M_state(__a._M_state) {} 3039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 3049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block ~per_thread_allocator() _STLP_NOTHROW {} 3069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block pointer address(reference __x) const { return &__x; } 3089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const_pointer address(const_reference __x) const { return &__x; } 3099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // __n is permitted to be 0. The C++ standard says nothing about what 3119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // the return value is when __n == 0. 3129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* allocate(size_type __n, const void* = 0) { 3139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n > max_size()) { 314e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 3159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n != 0) { 3179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __buf_size = __n * sizeof(value_type); 3189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* __ret = __REINTERPRET_CAST(_Tp*, _S_Alloc::allocate(__buf_size, _M_state)); 3199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC) 320e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size); 3219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 3229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __ret; 3239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 3259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return 0; 3269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void deallocate(pointer __p, size_type __n) { 3299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _STLP_ASSERT( (__p == 0) == (__n == 0) ) 3309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__p != 0) { 3319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC) 3329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block memset((char*)__p, _STLP_SHRED_BYTE, __n * sizeof(value_type)); 3339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 3349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _S_Alloc::deallocate(__p, __n * sizeof(value_type), _M_state); 3359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type max_size() const _STLP_NOTHROW 3399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block { return size_t(-1) / sizeof(_Tp); } 3409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 341e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); } 3429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void destroy(pointer _p) { _p->~_Tp(); } 3439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // state is being kept here 3459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __state_type* _M_state; 3469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_NO_EXTENSIONS) 3489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block /* STLport extension giving rounded size of an allocated memory buffer 3499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This method do not have to be part of a user defined allocator implementation 3509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * and won't even be called if such a function was granted. 3519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */ 3529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockprotected: 3539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 3549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* allocate(size_type __n, size_type& __allocated_n) { 3559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n > max_size()) { 356e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _STLP_THROW_BAD_ALLOC; 3579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block if (__n != 0) { 3599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block size_type __buf_size = __n * sizeof(value_type); 3609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block _Tp* __ret = __REINTERPRET_CAST(value_type*, _S_Alloc::allocate(__buf_size, _M_state)); 3619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC) 362e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size); 3639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 3649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block __allocated_n = __buf_size / sizeof(value_type); 3659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return __ret; 3669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block else 3689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return 0; 3699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 3709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 3719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL 3739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass _STLP_CLASS_DECLSPEC per_thread_allocator<void> { 3749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockpublic: 3759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef size_t size_type; 3769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef ptrdiff_t difference_type; 3779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef void* pointer; 3789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef const void* const_pointer; 3799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef void value_type; 3809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_MEMBER_TEMPLATE_CLASSES 3819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block template <class _NewType> struct rebind { 3829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef per_thread_allocator<_NewType> other; 3839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block }; 3849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 3859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 3869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1, class _T2> 3889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator==(const per_thread_allocator<_T1>& __a1, 3899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const per_thread_allocator<_T2>& __a2) 3909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __a1._M_state == __a2._M_state; } 3919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER 3939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1, class _T2> 3949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline bool operator!=(const per_thread_allocator<_T1>& __a1, 3959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const per_thread_allocator<_T2>& __a2) 3969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return __a1._M_state != __a2._M_state; } 3979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 3989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 3999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 4019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp, class _Atype> 4039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct _Alloc_traits<_Tp, per_thread_allocator<_Atype> > 4049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ typedef per_thread_allocator<_Tp> allocator_type; }; 4059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 4079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE) 4099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp1, class _Tp2> 4119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline per_thread_allocator<_Tp2>& 4129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__stl_alloc_rebind(per_thread_allocator<_Tp1>& __x, const _Tp2*) 4139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return (per_thread_allocator<_Tp2>&)__x; } 4149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp1, class _Tp2> 4169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline per_thread_allocator<_Tp2> 4179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__stl_alloc_create(per_thread_allocator<_Tp1>&, const _Tp2*) 4189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ return per_thread_allocator<_Tp2>(); } 4199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE */ 4219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_PRIV_NAMESPACE 4239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 4259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __perthread_alloc_type_traits { 4269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef typename _IsSTLportClass<per_thread_allocator<_Tp> >::_Ret _STLportAlloc; 4279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //The default allocator implementation which is recognize thanks to the 4289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block //__stlport_class inheritance is a stateless object so: 4299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef __false_type has_trivial_default_constructor; 4309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLportAlloc has_trivial_copy_constructor; 4319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLportAlloc has_trivial_assignment_operator; 4329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef _STLportAlloc has_trivial_destructor; 4339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block typedef __false_type is_POD_type; 4349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}; 4359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_MOVE_TO_STD_NAMESPACE 4379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) 4399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp> 4409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<per_thread_allocator<_Tp> > : _STLP_PRIV __perthread_alloc_type_traits<_Tp> {}; 4419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else 4429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL 4439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<per_thread_allocator<char> > : _STLP_PRIV __perthread_alloc_type_traits<char> {}; 4449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (_STLP_HAS_WCHAR_T) 4459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL 4469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<per_thread_allocator<wchar_t> > : _STLP_PRIV __perthread_alloc_type_traits<wchar_t> {}; 4479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 4489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# if defined (_STLP_USE_PTR_SPECIALIZATIONS) 4499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_TEMPLATE_NULL 4509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockstruct __type_traits<per_thread_allocator<void*> > : _STLP_PRIV __perthread_alloc_type_traits<void*> {}; 4519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block# endif 4529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif 4539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE 4569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_PTHREAD_ALLOC */ 4589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 4599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables: 4609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++ 4619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End: 462