]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/include/bits/stl_uninitialized.h
1 // Raw memory manipulators -*- C++ -*-
3 // Copyright (C) 2001 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 2, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING. If not, write to the Free
18 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
21 // As a special exception, you may use this file as part of a free software
22 // library without restriction. Specifically, if other files instantiate
23 // templates or use macros or inline functions from this file, or you compile
24 // this file and link it with other files to produce an executable, this
25 // file does not by itself cause the resulting executable to be covered by
26 // the GNU General Public License. This exception does not however
27 // invalidate any other reasons why the executable file might be covered by
28 // the GNU General Public License.
33 * Hewlett-Packard Company
35 * Permission to use, copy, modify, distribute and sell this software
36 * and its documentation for any purpose is hereby granted without fee,
37 * provided that the above copyright notice appear in all copies and
38 * that both that copyright notice and this permission notice appear
39 * in supporting documentation. Hewlett-Packard Company makes no
40 * representations about the suitability of this software for any
41 * purpose. It is provided "as is" without express or implied warranty.
44 * Copyright (c) 1996,1997
45 * Silicon Graphics Computer Systems, Inc.
47 * Permission to use, copy, modify, distribute and sell this software
48 * and its documentation for any purpose is hereby granted without fee,
49 * provided that the above copyright notice appear in all copies and
50 * that both that copyright notice and this permission notice appear
51 * in supporting documentation. Silicon Graphics makes no
52 * representations about the suitability of this software for any
53 * purpose. It is provided "as is" without express or implied warranty.
56 /** @file stl_uninitialized.h
57 * This is an internal header file, included by other library headers.
58 * You should not attempt to use it directly.
61 #ifndef _CPP_BITS_STL_UNINITIALIZED_H
62 #define _CPP_BITS_STL_UNINITIALIZED_H 1
71 template<typename _InputIter
, typename _ForwardIter
>
73 __uninitialized_copy_aux(_InputIter __first
, _InputIter __last
,
74 _ForwardIter __result
,
76 { return copy(__first
, __last
, __result
); }
78 template<typename _InputIter
, typename _ForwardIter
>
80 __uninitialized_copy_aux(_InputIter __first
, _InputIter __last
,
81 _ForwardIter __result
,
84 _ForwardIter __cur
= __result
;
86 for ( ; __first
!= __last
; ++__first
, ++__cur
)
87 _Construct(&*__cur
, *__first
);
92 _Destroy(__result
, __cur
);
93 __throw_exception_again
;
98 * @brief Copies the range [first,last) into result.
99 * @param first An input iterator.
100 * @param last An input iterator.
101 * @param result An output iterator.
102 * @return result + (first - last)
104 * Like copy(), but does not require an initialized output range.
106 template<typename _InputIter
, typename _ForwardIter
>
108 uninitialized_copy(_InputIter __first
, _InputIter __last
, _ForwardIter __result
)
110 typedef typename iterator_traits
<_InputIter
>::value_type _ValueType
;
111 typedef typename __type_traits
<_ValueType
>::is_POD_type _Is_POD
;
112 return __uninitialized_copy_aux(__first
, __last
, __result
, _Is_POD());
116 uninitialized_copy(const char* __first
, const char* __last
, char* __result
)
118 memmove(__result
, __first
, __last
- __first
);
119 return __result
+ (__last
- __first
);
123 uninitialized_copy(const wchar_t* __first
, const wchar_t* __last
,
126 memmove(__result
, __first
, sizeof(wchar_t) * (__last
- __first
));
127 return __result
+ (__last
- __first
);
130 // Valid if copy construction is equivalent to assignment, and if the
131 // destructor is trivial.
132 template<typename _ForwardIter
, typename _Tp
>
134 __uninitialized_fill_aux(_ForwardIter __first
, _ForwardIter __last
,
135 const _Tp
& __x
, __true_type
)
136 { fill(__first
, __last
, __x
); }
138 template<typename _ForwardIter
, typename _Tp
>
140 __uninitialized_fill_aux(_ForwardIter __first
, _ForwardIter __last
,
141 const _Tp
& __x
, __false_type
)
143 _ForwardIter __cur
= __first
;
145 for ( ; __cur
!= __last
; ++__cur
)
146 _Construct(&*__cur
, __x
);
150 _Destroy(__first
, __cur
);
151 __throw_exception_again
;
156 * @brief Copies the value x into the range [first,last).
157 * @param first An input iterator.
158 * @param last An input iterator.
159 * @param x The source value.
162 * Like fill(), but does not require an initialized output range.
164 template<typename _ForwardIter
, typename _Tp
>
166 uninitialized_fill(_ForwardIter __first
, _ForwardIter __last
, const _Tp
& __x
)
168 typedef typename iterator_traits
<_ForwardIter
>::value_type _ValueType
;
169 typedef typename __type_traits
<_ValueType
>::is_POD_type _Is_POD
;
170 __uninitialized_fill_aux(__first
, __last
, __x
, _Is_POD());
173 // Valid if copy construction is equivalent to assignment, and if the
174 // destructor is trivial.
175 template<typename _ForwardIter
, typename _Size
, typename _Tp
>
177 __uninitialized_fill_n_aux(_ForwardIter __first
, _Size __n
,
178 const _Tp
& __x
, __true_type
)
180 return fill_n(__first
, __n
, __x
);
183 template<typename _ForwardIter
, typename _Size
, typename _Tp
>
185 __uninitialized_fill_n_aux(_ForwardIter __first
, _Size __n
,
186 const _Tp
& __x
, __false_type
)
188 _ForwardIter __cur
= __first
;
190 for ( ; __n
> 0; --__n
, ++__cur
)
191 _Construct(&*__cur
, __x
);
196 _Destroy(__first
, __cur
);
197 __throw_exception_again
;
202 * @brief Copies the value x into the range [first,first+n).
203 * @param first An input iterator.
204 * @param n The number of copies to make.
205 * @param x The source value.
208 * Like fill_n(), but does not require an initialized output range.
210 template<typename _ForwardIter
, typename _Size
, typename _Tp
>
212 uninitialized_fill_n(_ForwardIter __first
, _Size __n
, const _Tp
& __x
)
214 typedef typename iterator_traits
<_ForwardIter
>::value_type _ValueType
;
215 typedef typename __type_traits
<_ValueType
>::is_POD_type _Is_POD
;
216 return __uninitialized_fill_n_aux(__first
, __n
, __x
, _Is_POD());
219 // Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill,
220 // __uninitialized_fill_copy.
222 // __uninitialized_copy_copy
223 // Copies [first1, last1) into [result, result + (last1 - first1)), and
224 // copies [first2, last2) into
225 // [result, result + (last1 - first1) + (last2 - first2)).
227 template<typename _InputIter1
, typename _InputIter2
, typename _ForwardIter
>
229 __uninitialized_copy_copy(_InputIter1 __first1
, _InputIter1 __last1
,
230 _InputIter2 __first2
, _InputIter2 __last2
,
231 _ForwardIter __result
)
233 _ForwardIter __mid
= uninitialized_copy(__first1
, __last1
, __result
);
235 return uninitialized_copy(__first2
, __last2
, __mid
);
239 _Destroy(__result
, __mid
);
240 __throw_exception_again
;
244 // __uninitialized_fill_copy
245 // Fills [result, mid) with x, and copies [first, last) into
246 // [mid, mid + (last - first)).
247 template<typename _ForwardIter
, typename _Tp
, typename _InputIter
>
249 __uninitialized_fill_copy(_ForwardIter __result
, _ForwardIter __mid
,
251 _InputIter __first
, _InputIter __last
)
253 uninitialized_fill(__result
, __mid
, __x
);
255 return uninitialized_copy(__first
, __last
, __mid
);
259 _Destroy(__result
, __mid
);
260 __throw_exception_again
;
264 // __uninitialized_copy_fill
265 // Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
266 // fills [first2 + (last1 - first1), last2) with x.
267 template<typename _InputIter
, typename _ForwardIter
, typename _Tp
>
269 __uninitialized_copy_fill(_InputIter __first1
, _InputIter __last1
,
270 _ForwardIter __first2
, _ForwardIter __last2
,
273 _ForwardIter __mid2
= uninitialized_copy(__first1
, __last1
, __first2
);
275 uninitialized_fill(__mid2
, __last2
, __x
);
279 _Destroy(__first2
, __mid2
);
280 __throw_exception_again
;
286 #endif /* _CPP_BITS_STL_UNINITIALIZED_H */