[SDK] One step further towards ReactOS source code tree restructure: the sdk folder...
[reactos.git] / reactos / sdk / include / c++ / stlport / stl / pointers / _deque.h
1 /*
2 * Copyright (c) 2004
3 * Francois Dumont
4 *
5 * This material is provided "as is", with absolutely no warranty expressed
6 * or implied. Any use is at your own risk.
7 *
8 * Permission to use or copy this software for any purpose is hereby granted
9 * without fee, provided the above notices are retained on all copies.
10 * Permission to modify the code and to distribute modified code is granted,
11 * provided the above notices are retained, and a notice that the code was
12 * modified is included with the above copyright notice.
13 *
14 */
15
16 /* NOTE: This is an internal header file, included by other STL headers.
17 * You should not attempt to use it directly.
18 */
19
20 #ifndef _STLP_SPECIALIZED_DEQUE_H
21 #define _STLP_SPECIALIZED_DEQUE_H
22
23 #ifndef _STLP_POINTERS_SPEC_TOOLS_H
24 # include <stl/pointers/_tools.h>
25 #endif
26
27 _STLP_BEGIN_NAMESPACE
28 _STLP_MOVE_TO_PRIV_NAMESPACE
29
30 /*
31 * struct helper to cast deque iterators:
32 */
33 template <class _StorageT, class _ValueT>
34 struct _DequeIteCast {
35 typedef _Deque_iterator<_ValueT, _Nonconst_traits<_ValueT> > iterator;
36 typedef _Deque_iterator<_ValueT, _Const_traits<_ValueT> > const_iterator;
37 typedef _Deque_iterator<_StorageT, _Nonconst_traits<_StorageT> > storage_iterator;
38 typedef _Deque_iterator<_StorageT, _Const_traits<_StorageT> > const_storage_iterator;
39 typedef _CastTraits<_StorageT, _ValueT> cast_traits;
40
41 static iterator to_value_type_ite (storage_iterator const& __ite) {
42 iterator tmp;
43 tmp._M_cur = cast_traits::to_value_type_ptr(__ite._M_cur);
44 tmp._M_first = cast_traits::to_value_type_ptr(__ite._M_first);
45 tmp._M_last = cast_traits::to_value_type_ptr(__ite._M_last);
46 tmp._M_node = cast_traits::to_value_type_pptr(__ite._M_node);
47 return tmp;
48 }
49 static storage_iterator to_storage_type_ite (iterator const& __ite) {
50 storage_iterator tmp;
51 tmp._M_cur = cast_traits::to_storage_type_ptr(__ite._M_cur);
52 tmp._M_first = cast_traits::to_storage_type_ptr(__ite._M_first);
53 tmp._M_last = cast_traits::to_storage_type_ptr(__ite._M_last);
54 tmp._M_node = cast_traits::to_storage_type_pptr(__ite._M_node);
55 return tmp;
56 }
57
58 static const_iterator to_value_type_cite (const_storage_iterator const& __ite) {
59 const_iterator tmp;
60 tmp._M_cur = cast_traits::to_value_type_ptr(__ite._M_cur);
61 tmp._M_first = cast_traits::to_value_type_ptr(__ite._M_first);
62 tmp._M_last = cast_traits::to_value_type_ptr(__ite._M_last);
63 tmp._M_node = cast_traits::to_value_type_pptr(__ite._M_node);
64 return tmp;
65 }
66
67 static const_storage_iterator to_storage_type_cite (const_iterator const& __ite) {
68 const_storage_iterator tmp;
69 tmp._M_cur = cast_traits::to_storage_type_ptr(__ite._M_cur);
70 tmp._M_first = cast_traits::to_storage_type_ptr(__ite._M_first);
71 tmp._M_last = cast_traits::to_storage_type_ptr(__ite._M_last);
72 tmp._M_node = cast_traits::to_storage_type_pptr(__ite._M_node);
73 return tmp;
74 }
75 };
76
77 #define DEQUE_IMPL _STLP_PTR_IMPL_NAME(deque)
78 #if defined (__BORLANDC__) || defined (__DMC__)
79 # define typename
80 #endif
81
82 #if defined (_STLP_USE_TEMPLATE_EXPORT) && !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
83 _STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<size_t, void*, allocator<void*> >;
84 _STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<void***, void**, allocator<void**> >;
85 _STLP_EXPORT template struct _STLP_CLASS_DECLSPEC _Deque_iterator<void*, _Nonconst_traits<void*> >;
86 _STLP_EXPORT_TEMPLATE_CLASS _Deque_base<void*,allocator<void*> >;
87 _STLP_EXPORT_TEMPLATE_CLASS DEQUE_IMPL<void*,allocator<void*> >;
88 #endif
89
90 #if defined (_STLP_DEBUG)
91 # define deque _STLP_NON_DBG_NAME(deque)
92 #else
93 _STLP_MOVE_TO_STD_NAMESPACE
94 #endif
95
96 template <class _Tp, _STLP_DFL_TMPL_PARAM(_Alloc, allocator<_Tp>) >
97 class deque
98 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (deque)
99 : public __stlport_class<deque<_Tp, _Alloc> >
100 #endif
101 {
102 typedef _STLP_TYPENAME _STLP_PRIV _StorageType<_Tp>::_Type _StorageType;
103 typedef typename _Alloc_traits<_StorageType, _Alloc>::allocator_type _StorageTypeAlloc;
104 typedef _STLP_PRIV DEQUE_IMPL<_StorageType, _StorageTypeAlloc> _Base;
105 typedef deque<_Tp, _Alloc> _Self;
106
107 typedef _STLP_PRIV _CastTraits<_StorageType, _Tp> cast_traits;
108 typedef _STLP_PRIV _DequeIteCast<_StorageType, _Tp> ite_cast_traits;
109
110 public:
111 typedef _Tp value_type;
112 typedef value_type* pointer;
113 typedef const value_type* const_pointer;
114 typedef value_type& reference;
115 typedef const value_type& const_reference;
116 typedef size_t size_type;
117 typedef ptrdiff_t difference_type;
118 typedef random_access_iterator_tag _Iterator_category;
119 _STLP_FORCE_ALLOCATORS(value_type, _Alloc)
120 typedef typename _Alloc_traits<value_type, _Alloc>::allocator_type allocator_type;
121 typedef _STLP_PRIV _Deque_iterator<value_type, _Nonconst_traits<value_type> > iterator;
122 typedef _STLP_PRIV _Deque_iterator<value_type, _Const_traits<value_type> > const_iterator;
123
124 _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
125
126 public: // Basic accessors
127 iterator begin() { return ite_cast_traits::to_value_type_ite(_M_impl.begin()); }
128 iterator end() { return ite_cast_traits::to_value_type_ite(_M_impl.end()); }
129 const_iterator begin() const { return ite_cast_traits::to_value_type_cite(_M_impl.begin()); }
130 const_iterator end() const { return ite_cast_traits::to_value_type_cite(_M_impl.end()); }
131
132 reverse_iterator rbegin() { return reverse_iterator(end()); }
133 reverse_iterator rend() { return reverse_iterator(begin()); }
134 const_reverse_iterator rbegin() const
135 { return const_reverse_iterator(end()); }
136 const_reverse_iterator rend() const
137 { return const_reverse_iterator(begin()); }
138
139 reference operator[](size_type __n)
140 { return cast_traits::to_value_type_ref(_M_impl[__n]); }
141 const_reference operator[](size_type __n) const
142 { return cast_traits::to_value_type_cref(_M_impl[__n]); }
143
144 reference at(size_type __n)
145 { return cast_traits::to_value_type_ref(_M_impl.at(__n)); }
146 const_reference at(size_type __n) const
147 { return cast_traits::to_value_type_cref(_M_impl.at(__n)); }
148
149 reference front() { return cast_traits::to_value_type_ref(_M_impl.front()); }
150 reference back() { return cast_traits::to_value_type_ref(_M_impl.back()); }
151 const_reference front() const { return cast_traits::to_value_type_cref(_M_impl.front()); }
152 const_reference back() const { return cast_traits::to_value_type_cref(_M_impl.back()); }
153
154 size_type size() const { return _M_impl.size(); }
155 size_type max_size() const { return _M_impl.max_size(); }
156 bool empty() const { return _M_impl.empty(); }
157 allocator_type get_allocator() const { return _STLP_CONVERT_ALLOCATOR(_M_impl.get_allocator(), value_type); }
158
159 explicit deque(const allocator_type& __a = allocator_type())
160 : _M_impl(_STLP_CONVERT_ALLOCATOR(__a, _StorageType)) {}
161
162 deque(const _Self& __x) : _M_impl(__x._M_impl) {}
163
164 #if !defined (_STLP_DONT_SUP_DFLT_PARAM)
165 explicit deque(size_type __n, const value_type& __val = _STLP_DEFAULT_CONSTRUCTED(value_type),
166 #else
167 deque(size_type __n, const value_type& __val,
168 #endif /*_STLP_DONT_SUP_DFLT_PARAM*/
169 const allocator_type& __a = allocator_type())
170 : _M_impl(__n, cast_traits::to_storage_type_cref(__val), _STLP_CONVERT_ALLOCATOR(__a, _StorageType)) {}
171 // int,long variants may be needed
172 #if defined (_STLP_DONT_SUP_DFLT_PARAM)
173 explicit deque(size_type __n) : _M_impl(__n) {}
174 #endif /*_STLP_DONT_SUP_DFLT_PARAM*/
175
176 #if defined (_STLP_MEMBER_TEMPLATES)
177 template <class _InputIterator>
178 deque(_InputIterator __first, _InputIterator __last,
179 const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
180 #if !defined (_STLP_USE_ITERATOR_WRAPPER)
181 : _M_impl(__first, __last,
182 _STLP_CONVERT_ALLOCATOR(__a, _StorageType)) {
183 #else
184 : _M_impl(_STLP_CONVERT_ALLOCATOR(__a, _StorageType)) {
185 #endif
186 #if defined (_STLP_USE_ITERATOR_WRAPPER)
187 insert(end(), __first, __last);
188 #endif
189 }
190
191 # if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
192 template <class _InputIterator>
193 deque(_InputIterator __first, _InputIterator __last)
194 # if !defined (_STLP_USE_ITERATOR_WRAPPER)
195 : _M_impl(__first, __last) {}
196 # else
197 { insert(end(), __first, __last); }
198 # endif
199 # endif
200
201 #else
202 deque(const_pointer __first, const_pointer __last,
203 const allocator_type& __a = allocator_type() )
204 : _M_impl(cast_traits::to_storage_type_cptr(__first),
205 cast_traits::to_storage_type_cptr(__last),
206 _STLP_CONVERT_ALLOCATOR(__a, _StorageType)) {}
207
208 deque(const_iterator __first, const_iterator __last,
209 const allocator_type& __a = allocator_type() )
210 : _M_impl(ite_cast_traits::to_storage_type_cite(__first),
211 ite_cast_traits::to_storage_type_cite(__last),
212 _STLP_CONVERT_ALLOCATOR(__a, _StorageType)) {}
213 #endif /* _STLP_MEMBER_TEMPLATES */
214
215 #if !defined (_STLP_NO_MOVE_SEMANTIC)
216 deque(__move_source<_Self> src)
217 : _M_impl(__move_source<_Base>(src.get()._M_impl)) {}
218 #endif
219
220 _Self& operator= (const _Self& __x) { _M_impl = __x._M_impl; return *this; }
221
222 void swap(_Self& __x) { _M_impl.swap(__x._M_impl); }
223 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
224 void _M_swap_workaround(_Self& __x) { swap(__x); }
225 #endif
226
227 void assign(size_type __n, const value_type& __val) {
228 _M_impl.assign(__n, cast_traits::to_storage_type_cref(__val));
229 }
230
231 #if defined (_STLP_MEMBER_TEMPLATES)
232 # if defined (_STLP_USE_ITERATOR_WRAPPER)
233 private:
234 template <class _Integer>
235 void _M_assign_dispatch(_Integer __n, _Integer __val,
236 const __true_type&)
237 { _M_impl.assign(__n, __val); }
238
239 template <class _InputIterator>
240 void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
241 const __false_type&) {
242 _M_impl.assign(_STLP_TYPENAME _STLP_PRIV _IteWrapper<_StorageType, _Tp, _InputIterator>::_Ite(__first),
243 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_StorageType, _Tp, _InputIterator>::_Ite(__last));
244 }
245
246 public:
247 # endif
248 template <class _InputIterator>
249 void assign(_InputIterator __first, _InputIterator __last) {
250 # if defined (_STLP_USE_ITERATOR_WRAPPER)
251 typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
252 _M_assign_dispatch(__first, __last, _Integral());
253 # else
254 _M_impl.assign(__first, __last);
255 # endif
256 }
257 #else
258 void assign(const_pointer __first, const_pointer __last)
259 { _M_impl.assign(cast_traits::to_storage_type_cptr(__first),
260 cast_traits::to_storage_type_cptr(__last)); }
261 void assign(const_iterator __first, const_iterator __last)
262 { _M_impl.assign(ite_cast_traits::to_storage_type_cite(__first),
263 ite_cast_traits::to_storage_type_cite(__last)); }
264 #endif /* _STLP_MEMBER_TEMPLATES */
265
266 #if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
267 void push_back(const value_type& __t = _STLP_DEFAULT_CONSTRUCTED(value_type))
268 #else
269 void push_back(const value_type& __t)
270 #endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
271 { _M_impl.push_back(cast_traits::to_storage_type_cref(__t)); }
272
273 #if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
274 void push_front(const value_type& __t = _STLP_DEFAULT_CONSTRUCTED(value_type))
275 #else
276 void push_front(const value_type& __t)
277 #endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
278 { _M_impl.push_front(cast_traits::to_storage_type_cref(__t)); }
279
280 # if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
281 void push_back() { _M_impl.push_back(); }
282 void push_front() { _M_impl.push_front(); }
283 # endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
284
285 void pop_back() { _M_impl.pop_back(); }
286 void pop_front() { _M_impl.pop_front(); }
287
288 #if !defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
289 iterator insert(iterator __pos, const value_type& __x = _STLP_DEFAULT_CONSTRUCTED(value_type))
290 #else
291 iterator insert(iterator __pos, const value_type& __x)
292 #endif /*!_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
293 { return ite_cast_traits::to_value_type_ite(_M_impl.insert(ite_cast_traits::to_storage_type_ite(__pos),
294 cast_traits::to_storage_type_cref(__x))); }
295
296 #if defined (_STLP_DONT_SUP_DFLT_PARAM) && !defined (_STLP_NO_ANACHRONISMS)
297 iterator insert(iterator __pos) { return insert(__pos, _STLP_DEFAULT_CONSTRUCTED(value_type)); }
298 #endif /*_STLP_DONT_SUP_DFLT_PARAM && !_STLP_NO_ANACHRONISMS*/
299
300 void insert(iterator __pos, size_type __n, const value_type& __x)
301 { _M_impl.insert(ite_cast_traits::to_storage_type_ite(__pos), __n, cast_traits::to_storage_type_cref(__x)); }
302
303 #if defined (_STLP_MEMBER_TEMPLATES)
304 # if defined (_STLP_USE_ITERATOR_WRAPPER)
305 private:
306 template <class _Integer>
307 void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
308 const __true_type&) {
309 _M_impl.insert(ite_cast_traits::to_storage_type_ite(__pos), __n, __val);
310 }
311
312 template <class _InputIterator>
313 void _M_insert_dispatch(iterator __pos,
314 _InputIterator __first, _InputIterator __last,
315 const __false_type&) {
316 _M_impl.insert(ite_cast_traits::to_storage_type_ite(__pos),
317 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_StorageType, _Tp, _InputIterator>::_Ite(__first),
318 _STLP_TYPENAME _STLP_PRIV _IteWrapper<_StorageType, _Tp, _InputIterator>::_Ite(__last));
319 }
320
321 public:
322 # endif
323
324 template <class _InputIterator>
325 void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
326 # if defined (_STLP_USE_ITERATOR_WRAPPER)
327 // Check whether it's an integral type. If so, it's not an iterator.
328 typedef typename _IsIntegral<_InputIterator>::_Ret _Integral;
329 _M_insert_dispatch(__pos, __first, __last, _Integral());
330 # else
331 _M_impl.insert(ite_cast_traits::to_storage_type_ite(__pos), __first, __last);
332 # endif
333 }
334
335 #else /* _STLP_MEMBER_TEMPLATES */
336 void insert(iterator __pos,
337 const_pointer __first, const_pointer __last) {
338 _M_impl.insert(ite_cast_traits::to_storage_type_ite(__pos),
339 cast_traits::to_storage_type_cptr(__first),
340 cast_traits::to_storage_type_cptr(__last));
341 }
342 void insert(iterator __pos,
343 const_iterator __first, const_iterator __last) {
344 _M_impl.insert(ite_cast_traits::to_storage_type_ite(__pos),
345 ite_cast_traits::to_storage_type_cite(__first),
346 ite_cast_traits::to_storage_type_cite(__last));
347 }
348
349 #endif /* _STLP_MEMBER_TEMPLATES */
350
351 #if !defined (_STLP_DONT_SUP_DFLT_PARAM)
352 void resize(size_type __new_size, const value_type& __x = _STLP_DEFAULT_CONSTRUCTED(value_type))
353 #else
354 void resize(size_type __new_size, const value_type& __x)
355 #endif /*_STLP_DONT_SUP_DFLT_PARAM*/
356 { _M_impl.resize(__new_size, cast_traits::to_storage_type_cref(__x)); }
357
358 #if defined (_STLP_DONT_SUP_DFLT_PARAM)
359 void resize(size_type __new_size) { _M_impl.resize(__new_size); }
360 #endif /*_STLP_DONT_SUP_DFLT_PARAM*/
361
362 iterator erase(iterator __pos)
363 { return ite_cast_traits::to_value_type_ite(_M_impl.erase(ite_cast_traits::to_storage_type_ite(__pos))); }
364
365 iterator erase(iterator __first, iterator __last)
366 { return ite_cast_traits::to_value_type_ite(_M_impl.erase(ite_cast_traits::to_storage_type_ite(__first),
367 ite_cast_traits::to_storage_type_ite(__last))); }
368 void clear() { _M_impl.clear(); }
369
370 private:
371 _Base _M_impl;
372 };
373
374 #if defined (deque)
375 # undef deque
376 _STLP_MOVE_TO_STD_NAMESPACE
377 #endif
378
379 #undef DEQUE_IMPL
380 #if defined (__BORLANDC__) || defined (__DMC__)
381 # undef typename
382 #endif
383
384 _STLP_END_NAMESPACE
385
386 #endif /* _STLP_SPECIALIZED_DEQUE_H */
387
388 // Local Variables:
389 // mode:C++
390 // End: