177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* 277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1994 477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Hewlett-Packard Company 577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1996,1997 777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc. 877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1997 1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Moscow Center for SPARC Technology 1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999 1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev 1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed 1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk. 1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted 1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies. 2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted, 2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was 2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice. 2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * 2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* NOTE: This is an internal header file, included by other STL headers. 2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * You should not attempt to use it directly. 2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */ 2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_TEMPBUF_H 3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_INTERNAL_TEMPBUF_H 3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_CLIMITS 3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <climits> 3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_CSTDLIB 3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_cstdlib.h> 3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_UNINITIALIZED_H 4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_uninitialized.h> 4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE 4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpair<_Tp*, ptrdiff_t> _STLP_CALL 4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__get_temporary_buffer(ptrdiff_t __len, _Tp*); 5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline pair<_Tp*, ptrdiff_t> _STLP_CALL get_temporary_buffer(ptrdiff_t __len) { 5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __get_temporary_buffer(__len, (_Tp*) 0); 5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if ! defined(_STLP_NO_EXTENSIONS) 5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// This overload is not required by the standard; it is an extension. 6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// It is supported for backward compatibility with the HP STL, and 6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// because not all compilers support the language feature (explicit 6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// function template arguments) that is required for the standard 6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// version of get_temporary_buffer. 6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline pair<_Tp*, ptrdiff_t> _STLP_CALL 6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerget_temporary_buffer(ptrdiff_t __len, _Tp*) { 6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner return __get_temporary_buffer(__len, (_Tp*) 0); 6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif 7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp> 7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void _STLP_CALL return_temporary_buffer(_Tp* __p) { 7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// SunPro brain damage 7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner free((char*)__p); 7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner} 7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _ForwardIterator, class _Tp> 7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _Temporary_buffer { 8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate: 8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t _M_original_len; 8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t _M_len; 8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Tp* _M_buffer; 8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_allocate_buffer() { 8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_original_len = _M_len; 8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buffer = 0; 8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_Tp))) 9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_len = INT_MAX / sizeof(_Tp); 9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner while (_M_len > 0) { 9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_buffer = (_Tp*) malloc(_M_len * sizeof(_Tp)); 9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_M_buffer) 9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner break; 9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_len /= 2; 9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_initialize_buffer(const _Tp&, const __true_type&) {} 10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void _M_initialize_buffer(const _Tp& val, const __false_type&) { 10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner uninitialized_fill_n(_M_buffer, _M_len, val); 10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: 10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t size() const { return _M_len; } 10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ptrdiff_t requested_size() const { return _M_original_len; } 10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Tp* begin() { return _M_buffer; } 10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Tp* end() { return _M_buffer + _M_len; } 11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) { 11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Workaround for a __type_traits bug in the pre-7.3 compiler. 11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION < 730 11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __type_traits<_Tp>::is_POD_type _Trivial; 11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# else 11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Trivial; 11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_TRY { 11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_len = _STLP_STD::distance(__first, __last); 12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_allocate_buffer(); 12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner if (_M_len > 0) 12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _M_initialize_buffer(*__first, _Trivial()); 12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_UNWIND(free(_M_buffer); _M_buffer = 0; _M_len = 0) 12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ~_Temporary_buffer() { 12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _STLP_STD::_Destroy_Range(_M_buffer, _M_buffer + _M_len); 12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner free(_M_buffer); 13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner } 13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate: 13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner // Disable copy constructor and assignment operator. 13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner _Temporary_buffer(const _Temporary_buffer<_ForwardIterator, _Tp>&) {} 13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner void operator=(const _Temporary_buffer<_ForwardIterator, _Tp>&) {} 13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_NO_EXTENSIONS 13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Class temporary_buffer is not part of the standard. It is an extension. 14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _ForwardIterator, 14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner class _Tp 14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION 14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner = typename iterator_traits<_ForwardIterator>::value_type 14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */ 14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner > 14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _Tp> 14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ 15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) 15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner : _Temporary_buffer<_ForwardIterator, _Tp>(__first, __last) {} 15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner ~temporary_buffer() {} 15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}; 15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_NO_EXTENSIONS */ 15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE 15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_LINK_TIME_INSTANTIATION 16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# include <stl/_tempbuf.c> 16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif 16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_INTERNAL_TEMPBUF_H */ 16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner 16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables: 16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++ 16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End: 168