X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=include%2Fc%2B%2B%2Fstl%2Fstl%2F_alloc_old.h;fp=include%2Fc%2B%2B%2Fstl%2Fstl%2F_alloc_old.h;h=4627243e171b5e544bc6a7819bc4165da1bfbb08;hp=0000000000000000000000000000000000000000;hb=173d8903eb9d51a4ea7d7fa3e52dc86c9bb6d4f1;hpb=b024710fe2b60cd4a42a8993b61333d6cdb56ca3 diff --git a/include/c++/stl/stl/_alloc_old.h b/include/c++/stl/stl/_alloc_old.h new file mode 100644 index 0000000..4627243 --- /dev/null +++ b/include/c++/stl/stl/_alloc_old.h @@ -0,0 +1,287 @@ +template +class __simple_alloc { + typedef _Alloc __alloc_type; +public: + typedef typename _Alloc::value_type __alloc_value_type; + typedef _Tp value_type; + static size_t _STLP_CALL __chunk(size_t __n) { + return (sizeof(__alloc_value_type)==sizeof(value_type)) ? __n : + ((__n*sizeof(value_type)+sizeof(__alloc_value_type)-1)/sizeof(__alloc_value_type)); + } + static _Tp* _STLP_CALL allocate(size_t __n) { return 0 == __n ? 0 : (_Tp*) __alloc_type::allocate(__chunk(__n)); } + static void _STLP_CALL deallocate(_Tp * __p, size_t __n) { + __alloc_type::deallocate((__alloc_value_type*)__p, __chunk(__n)); } +}; + +// Allocator adaptor to turn an SGI-style allocator (e.g. alloc, malloc_alloc) +// into a standard-conforming allocator. Note that this adaptor does +// *not* assume that all objects of the underlying alloc class are +// identical, nor does it assume that all of the underlying alloc's +// member functions are static member functions. Note, also, that +// __allocator<_Tp, alloc> is essentially the same thing as allocator<_Tp>. + +template +struct __allocator : public _Alloc { + typedef _Alloc __underlying_alloc; + + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + +# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) + template struct rebind { + typedef __allocator<_Tp1, _Alloc> other; + }; +# endif + __allocator() _STLP_NOTHROW {} + __allocator(const _Alloc& ) _STLP_NOTHROW {} + __allocator(const __allocator<_Tp, _Alloc>& __a) _STLP_NOTHROW + : _Alloc(__a) {} +# if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) + template + __allocator(const __allocator<_Tp1, _Alloc>& __a) _STLP_NOTHROW + : _Alloc(__a) {} +# endif +# ifdef _STLP_TRIVIAL_DESTRUCTOR_BUG + ~__allocator() _STLP_NOTHROW {} +# endif + pointer address(reference __x) const { return &__x; } + +# if !defined (__WATCOM_CPLUSPLUS__) + const_pointer address(const_reference __x) const { return &__x; } +# endif + + // __n is permitted to be 0. + _Tp* allocate(size_type __n, const void* = 0) { + if (__n > max_size()) + __THROW_BAD_ALLOC; + return __n != 0 + ? __STATIC_CAST(_Tp*,__underlying_alloc::allocate(__n * sizeof(_Tp))) + : 0; + } + + // __p is not permitted to be a null pointer. + void deallocate(pointer __p, size_type __n) + { if (__p) __underlying_alloc::deallocate(__p, __n * sizeof(_Tp)); } + + size_type max_size() const _STLP_NOTHROW + { return size_t(-1) / sizeof(_Tp); } + + void construct(pointer __p, const_reference __val) { _STLP_STD::_Copy_Construct(__p, __val); } + void destroy(pointer __p) { _STLP_STD::_Destroy(__p); } + + const __underlying_alloc& __get_underlying_alloc() const { return *this; } +}; + +#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION +template +class __allocator { + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef void* pointer; + typedef const void* const_pointer; + typedef void value_type; +#ifdef _STLP_MEMBER_TEMPLATE_CLASSES + template struct rebind { + typedef __allocator<_Tp1, _Alloc> other; + }; +#endif +}; +#endif + +template +inline bool _STLP_CALL operator==(const __allocator<_Tp, _Alloc>& __a1, + const __allocator<_Tp, _Alloc>& __a2) +{ + return __a1.__get_underlying_alloc() == __a2.__get_underlying_alloc(); +} + +#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE +template +inline bool _STLP_CALL operator!=(const __allocator<_Tp, _Alloc>& __a1, + const __allocator<_Tp, _Alloc>& __a2) +{ + return __a1.__get_underlying_alloc() != __a2.__get_underlying_alloc(); +} +#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */ + + +// Comparison operators for all of the predifined SGI-style allocators. +// This ensures that __allocator (for example) will +// work correctly. + +#ifndef _STLP_NON_TYPE_TMPL_PARAM_BUG +inline bool _STLP_CALL operator==(const __malloc_alloc&, const __malloc_alloc&) +{ return true; } + +# ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER +inline bool _STLP_CALL operator!=(const __malloc_alloc&, const __malloc_alloc&) +{ return false; } +# endif + +inline bool _STLP_CALL operator==(const __new_alloc&, const __new_alloc&) { return true; } + +# ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE +inline bool _STLP_CALL operator!=(const __new_alloc&, const __new_alloc&) { return false; } +# endif + +# if !defined (_STLP_USE_NO_IOSTREAMS) +inline bool _STLP_CALL operator==(const __node_alloc&, + const __node_alloc&) +{ return true; } + +# if defined( _STLP_FUNCTION_TMPL_PARTIAL_ORDER ) + +inline bool _STLP_CALL operator!=(const __node_alloc&, + const __node_alloc&) +{ return false; } +# endif +# endif + +#endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */ + +template +inline bool _STLP_CALL operator==(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&) { return true; } +# ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE +template +inline bool _STLP_CALL operator!=(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&) { return false; } +# endif + +#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) + +// Versions for the predefined SGI-style allocators. +template +struct _Alloc_traits<_Tp, __malloc_alloc> { + typedef __allocator<_Tp, __malloc_alloc> allocator_type; +}; + +# if !defined (_STLP_USE_NO_IOSTREAMS) +template +struct _Alloc_traits<_Tp, __node_alloc> { + typedef __allocator<_Tp, __node_alloc> allocator_type; +}; +# endif + +template +struct _Alloc_traits<_Tp, __debug_alloc<_Alloc> > { + typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type; +}; + +// Versions for the __allocator adaptor used with the predefined +// SGI-style allocators. + +template +struct _Alloc_traits<_Tp, __allocator<_Tp1, _Alloc > > { + typedef __allocator<_Tp, _Alloc > allocator_type; +}; + +#endif + +#if defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE) + +// Versions for the predefined SGI-style allocators. + + +# if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) + +typedef __malloc_alloc __malloc_alloc_dfl; + +template +inline __allocator<_Tp, __malloc_alloc_dfl >& _STLP_CALL +__stl_alloc_rebind(__malloc_alloc_dfl& __a, const _Tp*) { + return (__allocator<_Tp, __malloc_alloc_dfl >&)__a; +} + +# if !defined (_STLP_USE_NO_IOSTREAMS) +template +inline __allocator<_Tp, __node_alloc>& _STLP_CALL +__stl_alloc_rebind(__node_alloc& __a, const _Tp*) { + return (__allocator<_Tp, __node_alloc>&)__a; +} +# endif + +template +inline __allocator<_Tp, __malloc_alloc_dfl > _STLP_CALL +__stl_alloc_create(const __malloc_alloc_dfl&, const _Tp*) { + return __allocator<_Tp, __malloc_alloc_dfl > (); +} + +# if !defined (_STLP_USE_NO_IOSTREAMS) +template +inline __allocator<_Tp, __node_alloc> _STLP_CALL +__stl_alloc_create(const __node_alloc&, const _Tp*) { + return __allocator<_Tp, __node_alloc>(); +} + +# endif + +# else + +template +inline __allocator<_Tp, __malloc_alloc>& _STLP_CALL +__stl_alloc_rebind(__malloc_alloc& __a, const _Tp*) { + return (__allocator<_Tp, __malloc_alloc>&)__a; +} + +# if !defined (_STLP_USE_NO_IOSTREAMS) +template +inline __allocator<_Tp, __node_alloc>& _STLP_CALL +__stl_alloc_rebind(__node_alloc& __a, const _Tp*) { + return (__allocator<_Tp, __node_alloc>&)__a; +} +# endif + +template +inline __allocator<_Tp, __malloc_alloc> _STLP_CALL +__stl_alloc_create(const __malloc_alloc&, const _Tp*) { + return __allocator<_Tp, __malloc_alloc>(); +} + +# if !defined (_STLP_USE_NO_IOSTREAMS) +template +inline __allocator<_Tp, __node_alloc> _STLP_CALL +__stl_alloc_create(const __node_alloc&, const _Tp*) { + return __allocator<_Tp, __node_alloc>(); +} +# endif + +# endif + +template +inline __allocator<_Tp, __debug_alloc<_Alloc> > _STLP_CALL +__stl_alloc_create(const __debug_alloc<_Alloc>&, const _Tp*) { + return __allocator<_Tp, __debug_alloc<_Alloc> >(); +} +template +inline __allocator<_Tp, __debug_alloc<_Alloc> >& _STLP_CALL +__stl_alloc_rebind(__debug_alloc<_Alloc>& __a, const _Tp*) { + return (__allocator<_Tp, __debug_alloc<_Alloc> >&)__a; +} + +template +inline __allocator<_Tp, __new_alloc > _STLP_CALL +__stl_alloc_create(const __new_alloc&, const _Tp*) { + return __allocator<_Tp, __new_alloc >(); +} +template +inline __allocator<_Tp, __new_alloc >& _STLP_CALL +__stl_alloc_rebind(__new_alloc& __a, const _Tp*) { + return (__allocator<_Tp, __new_alloc >&)__a; +} + +template +inline __allocator<_Tp2, _Alloc>& _STLP_CALL +__stl_alloc_rebind(__allocator<_Tp1, _Alloc>& __a, const _Tp2*) { + return (__allocator<_Tp2, _Alloc>&)__a; +} + +template +inline __allocator<_Tp2, _Alloc> _STLP_CALL +__stl_alloc_create(const __allocator<_Tp1, _Alloc>&, const _Tp2*) { + return __allocator<_Tp2, _Alloc>(); +} +#endif