williamr@2
|
1 |
/*
|
williamr@2
|
2 |
*
|
williamr@2
|
3 |
* Copyright (c) 1994
|
williamr@2
|
4 |
* Hewlett-Packard Company
|
williamr@2
|
5 |
*
|
williamr@2
|
6 |
* Copyright (c) 1996,1997
|
williamr@2
|
7 |
* Silicon Graphics Computer Systems, Inc.
|
williamr@2
|
8 |
*
|
williamr@2
|
9 |
* Copyright (c) 1997
|
williamr@2
|
10 |
* Moscow Center for SPARC Technology
|
williamr@2
|
11 |
*
|
williamr@4
|
12 |
* Copyright (c) 1999
|
williamr@2
|
13 |
* Boris Fomitchev
|
williamr@2
|
14 |
*
|
williamr@2
|
15 |
* This material is provided "as is", with absolutely no warranty expressed
|
williamr@2
|
16 |
* or implied. Any use is at your own risk.
|
williamr@2
|
17 |
*
|
williamr@4
|
18 |
* Permission to use or copy this software for any purpose is hereby granted
|
williamr@2
|
19 |
* without fee, provided the above notices are retained on all copies.
|
williamr@2
|
20 |
* Permission to modify the code and to distribute modified code is granted,
|
williamr@2
|
21 |
* provided the above notices are retained, and a notice that the code was
|
williamr@2
|
22 |
* modified is included with the above copyright notice.
|
williamr@2
|
23 |
*
|
williamr@2
|
24 |
*/
|
williamr@2
|
25 |
|
williamr@2
|
26 |
/* NOTE: This is an internal header file, included by other STL headers.
|
williamr@2
|
27 |
* You should not attempt to use it directly.
|
williamr@2
|
28 |
*/
|
williamr@2
|
29 |
|
williamr@2
|
30 |
#ifndef _STLP_INTERNAL_TEMPBUF_H
|
williamr@2
|
31 |
#define _STLP_INTERNAL_TEMPBUF_H
|
williamr@2
|
32 |
|
williamr@4
|
33 |
#ifndef _STLP_CLIMITS
|
williamr@2
|
34 |
# include <climits>
|
williamr@4
|
35 |
#endif
|
williamr@4
|
36 |
|
williamr@4
|
37 |
#ifndef _STLP_INTERNAL_CSTDLIB
|
williamr@4
|
38 |
# include <stl/_cstdlib.h>
|
williamr@4
|
39 |
#endif
|
williamr@4
|
40 |
|
williamr@4
|
41 |
#ifndef _STLP_INTERNAL_UNINITIALIZED_H
|
williamr@2
|
42 |
# include <stl/_uninitialized.h>
|
williamr@4
|
43 |
#endif
|
williamr@2
|
44 |
|
williamr@2
|
45 |
_STLP_BEGIN_NAMESPACE
|
williamr@2
|
46 |
|
williamr@2
|
47 |
template <class _Tp>
|
williamr@2
|
48 |
pair<_Tp*, ptrdiff_t> _STLP_CALL
|
williamr@2
|
49 |
__get_temporary_buffer(ptrdiff_t __len, _Tp*);
|
williamr@2
|
50 |
|
williamr@2
|
51 |
#ifndef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
|
williamr@2
|
52 |
|
williamr@2
|
53 |
template <class _Tp>
|
williamr@2
|
54 |
inline pair<_Tp*, ptrdiff_t> _STLP_CALL get_temporary_buffer(ptrdiff_t __len) {
|
williamr@2
|
55 |
return __get_temporary_buffer(__len, (_Tp*) 0);
|
williamr@2
|
56 |
}
|
williamr@2
|
57 |
|
williamr@2
|
58 |
# if ! defined(_STLP_NO_EXTENSIONS)
|
williamr@2
|
59 |
// This overload is not required by the standard; it is an extension.
|
williamr@2
|
60 |
// It is supported for backward compatibility with the HP STL, and
|
williamr@2
|
61 |
// because not all compilers support the language feature (explicit
|
williamr@2
|
62 |
// function template arguments) that is required for the standard
|
williamr@2
|
63 |
// version of get_temporary_buffer.
|
williamr@2
|
64 |
template <class _Tp>
|
williamr@2
|
65 |
inline pair<_Tp*, ptrdiff_t> _STLP_CALL
|
williamr@2
|
66 |
get_temporary_buffer(ptrdiff_t __len, _Tp*) {
|
williamr@2
|
67 |
return __get_temporary_buffer(__len, (_Tp*) 0);
|
williamr@2
|
68 |
}
|
williamr@2
|
69 |
# endif
|
williamr@2
|
70 |
#endif
|
williamr@2
|
71 |
|
williamr@2
|
72 |
template <class _Tp>
|
williamr@2
|
73 |
inline void _STLP_CALL return_temporary_buffer(_Tp* __p) {
|
williamr@2
|
74 |
// SunPro brain damage
|
williamr@2
|
75 |
free((char*)__p);
|
williamr@2
|
76 |
}
|
williamr@2
|
77 |
|
williamr@2
|
78 |
template <class _ForwardIterator, class _Tp>
|
williamr@2
|
79 |
class _Temporary_buffer {
|
williamr@2
|
80 |
private:
|
williamr@2
|
81 |
ptrdiff_t _M_original_len;
|
williamr@2
|
82 |
ptrdiff_t _M_len;
|
williamr@2
|
83 |
_Tp* _M_buffer;
|
williamr@2
|
84 |
|
williamr@2
|
85 |
void _M_allocate_buffer() {
|
williamr@2
|
86 |
_M_original_len = _M_len;
|
williamr@2
|
87 |
_M_buffer = 0;
|
williamr@2
|
88 |
|
williamr@2
|
89 |
if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_Tp)))
|
williamr@2
|
90 |
_M_len = INT_MAX / sizeof(_Tp);
|
williamr@2
|
91 |
|
williamr@2
|
92 |
while (_M_len > 0) {
|
williamr@2
|
93 |
_M_buffer = (_Tp*) malloc(_M_len * sizeof(_Tp));
|
williamr@2
|
94 |
if (_M_buffer)
|
williamr@2
|
95 |
break;
|
williamr@2
|
96 |
_M_len /= 2;
|
williamr@2
|
97 |
}
|
williamr@2
|
98 |
}
|
williamr@2
|
99 |
|
williamr@2
|
100 |
void _M_initialize_buffer(const _Tp&, const __true_type&) {}
|
williamr@2
|
101 |
void _M_initialize_buffer(const _Tp& val, const __false_type&) {
|
williamr@2
|
102 |
uninitialized_fill_n(_M_buffer, _M_len, val);
|
williamr@2
|
103 |
}
|
williamr@2
|
104 |
|
williamr@2
|
105 |
public:
|
williamr@2
|
106 |
ptrdiff_t size() const { return _M_len; }
|
williamr@2
|
107 |
ptrdiff_t requested_size() const { return _M_original_len; }
|
williamr@2
|
108 |
_Tp* begin() { return _M_buffer; }
|
williamr@2
|
109 |
_Tp* end() { return _M_buffer + _M_len; }
|
williamr@2
|
110 |
|
williamr@2
|
111 |
_Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) {
|
williamr@2
|
112 |
// Workaround for a __type_traits bug in the pre-7.3 compiler.
|
williamr@2
|
113 |
# if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION < 730
|
williamr@2
|
114 |
typedef typename __type_traits<_Tp>::is_POD_type _Trivial;
|
williamr@2
|
115 |
# else
|
williamr@4
|
116 |
typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Trivial;
|
williamr@2
|
117 |
# endif
|
williamr@2
|
118 |
_STLP_TRY {
|
williamr@2
|
119 |
_M_len = distance(__first, __last);
|
williamr@2
|
120 |
_M_allocate_buffer();
|
williamr@2
|
121 |
if (_M_len > 0)
|
williamr@2
|
122 |
_M_initialize_buffer(*__first, _Trivial());
|
williamr@2
|
123 |
}
|
williamr@4
|
124 |
_STLP_UNWIND(free(_M_buffer); _M_buffer = 0; _M_len = 0)
|
williamr@2
|
125 |
}
|
williamr@4
|
126 |
|
williamr@4
|
127 |
~_Temporary_buffer() {
|
williamr@4
|
128 |
_STLP_STD::_Destroy_Range(_M_buffer, _M_buffer + _M_len);
|
williamr@2
|
129 |
free(_M_buffer);
|
williamr@2
|
130 |
}
|
williamr@2
|
131 |
|
williamr@2
|
132 |
private:
|
williamr@2
|
133 |
// Disable copy constructor and assignment operator.
|
williamr@2
|
134 |
_Temporary_buffer(const _Temporary_buffer<_ForwardIterator, _Tp>&) {}
|
williamr@2
|
135 |
void operator=(const _Temporary_buffer<_ForwardIterator, _Tp>&) {}
|
williamr@2
|
136 |
};
|
williamr@2
|
137 |
|
williamr@2
|
138 |
# ifndef _STLP_NO_EXTENSIONS
|
williamr@2
|
139 |
|
williamr@2
|
140 |
// Class temporary_buffer is not part of the standard. It is an extension.
|
williamr@2
|
141 |
|
williamr@4
|
142 |
template <class _ForwardIterator,
|
williamr@4
|
143 |
class _Tp
|
williamr@2
|
144 |
#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
|
williamr@2
|
145 |
= typename iterator_traits<_ForwardIterator>::value_type
|
williamr@2
|
146 |
#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
|
williamr@2
|
147 |
>
|
williamr@2
|
148 |
struct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _Tp>
|
williamr@2
|
149 |
{
|
williamr@2
|
150 |
temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
|
williamr@2
|
151 |
: _Temporary_buffer<_ForwardIterator, _Tp>(__first, __last) {}
|
williamr@2
|
152 |
~temporary_buffer() {}
|
williamr@2
|
153 |
};
|
williamr@2
|
154 |
|
williamr@2
|
155 |
# endif /* _STLP_NO_EXTENSIONS */
|
williamr@4
|
156 |
|
williamr@2
|
157 |
_STLP_END_NAMESPACE
|
williamr@2
|
158 |
|
williamr@2
|
159 |
# ifndef _STLP_LINK_TIME_INSTANTIATION
|
williamr@2
|
160 |
# include <stl/_tempbuf.c>
|
williamr@2
|
161 |
# endif
|
williamr@2
|
162 |
|
williamr@2
|
163 |
#endif /* _STLP_INTERNAL_TEMPBUF_H */
|
williamr@2
|
164 |
|
williamr@2
|
165 |
// Local Variables:
|
williamr@2
|
166 |
// mode:C++
|
williamr@2
|
167 |
// End:
|