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