www.pudn.com > scanalyze-1.0.3_source_code.rar > stl_tempbuf.h, change:2003-09-15,size:3929b
/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996,1997
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
/* NOTE: This is an internal header file, included by other STL headers.
* You should not attempt to use it directly.
*/
#ifndef __SGI_STL_INTERNAL_TEMPBUF_H
#define __SGI_STL_INTERNAL_TEMPBUF_H
__STL_BEGIN_NAMESPACE
template <class _T>
pair<_T*, ptrdiff_t>
get_temporary_buffer(ptrdiff_t __len, _T*)
{
if (__len > ptrdiff_t(INT_MAX / sizeof(_T)))
__len = INT_MAX / sizeof(_T);
while (__len > 0) {
_T* __tmp = (_T*) malloc((size_t)__len * sizeof(_T));
if (__tmp != 0)
return pair<_T*, ptrdiff_t>(__tmp, __len);
__len /= 2;
}
return pair<_T*, ptrdiff_t>((_T*)0, 0);
}
template <class _T>
void return_temporary_buffer(_T* __p) {
free(__p);
}
template <class _ForwardIterator, class _T>
class _Temporary_buffer {
private:
ptrdiff_t _M_original_len;
ptrdiff_t _M_len;
_T* _M_buffer;
void _M_allocate_buffer() {
_M_original_len = _M_len;
_M_buffer = 0;
if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_T)))
_M_len = INT_MAX / sizeof(_T);
while (_M_len > 0) {
_M_buffer = (_T*) malloc(_M_len * sizeof(_T));
if (_M_buffer)
break;
_M_len /= 2;
}
}
void _M_initialize_buffer(const _T&, __true_type) {}
void _M_initialize_buffer(const _T& val, __false_type) {
uninitialized_fill_n(_M_buffer, _M_len, val);
}
public:
ptrdiff_t size() const { return _M_len; }
ptrdiff_t requested_size() const { return _M_original_len; }
_T* begin() { return _M_buffer; }
_T* end() { return _M_buffer + _M_len; }
_Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) {
__STL_TRY {
_M_len = 0;
distance(__first, __last, _M_len);
_M_allocate_buffer();
if (_M_len > 0)
_M_initialize_buffer(
*__first,
__type_traits<_T>::has_trivial_default_constructor());
}
__STL_UNWIND(free(_M_buffer); _M_buffer = 0; _M_len = 0);
}
~_Temporary_buffer() {
destroy(_M_buffer, _M_buffer + _M_len);
free(_M_buffer);
}
private:
// Disable copy constructor and assignment operator.
_Temporary_buffer(const _Temporary_buffer&) {}
void operator=(const _Temporary_buffer&) {}
};
// Class temporary_buffer is not part of the standard. It is an extension.
template <class _ForwardIterator,
class _T
#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
= typename iterator_traits<_ForwardIterator>::value_type
#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
>
struct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _T>
{
temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
: _Temporary_buffer<_ForwardIterator, _T>(__first, __last) {}
~temporary_buffer() {}
};
__STL_END_NAMESPACE
#endif /* __SGI_STL_INTERNAL_TEMPBUF_H */
// Local Variables:
// mode:C++
// End: