215 |
213 |
216 inline ConstReverseIterator crend() const |
214 inline ConstReverseIterator crend() const |
217 { return m_vect.crend(); |
215 { return m_vect.crend(); |
218 } |
216 } |
219 |
217 |
220 void erase (ulong pos) |
218 void erase (int pos) |
221 { assert (pos < size()); |
219 { assert (pos < size()); |
222 m_vect.erase (m_vect.begin() + pos); |
220 m_vect.erase (m_vect.begin() + pos); |
223 } |
221 } |
224 |
222 |
225 T& push_back (const T& value) |
223 T& push_back (const T& value) |
254 } |
252 } |
255 |
253 |
256 List<T> reverse() const |
254 List<T> reverse() const |
257 { List<T> rev; |
255 { List<T> rev; |
258 |
256 |
259 for (const T& val : c_rev<T> (*this)) |
257 for (auto it = end() - 1; it != begin(); --it) |
260 rev << val; |
258 rev << *it; |
261 |
259 |
262 return rev; |
260 return rev; |
263 } |
261 } |
264 |
262 |
265 void clear() |
263 void clear() |
266 { m_vect.clear(); |
264 { m_vect.clear(); |
267 } |
265 } |
268 |
266 |
269 void insert (ulong pos, const T& value) |
267 void insert (int pos, const T& value) |
270 { m_vect.insert (m_vect.begin() + pos, value); |
268 { m_vect.insert (m_vect.begin() + pos, value); |
271 } |
269 } |
272 |
270 |
273 void makeUnique() |
271 void makeUnique() |
274 { // Remove duplicate entries. For this to be effective, the List must be |
272 { // Remove duplicate entries. For this to be effective, the List must be |
276 sort(); |
274 sort(); |
277 Iterator pos = std::unique (begin(), end()); |
275 Iterator pos = std::unique (begin(), end()); |
278 resize (std::distance (begin(), pos)); |
276 resize (std::distance (begin(), pos)); |
279 } |
277 } |
280 |
278 |
281 ulong size() const |
279 int size() const |
282 { return m_vect.size(); |
280 { return m_vect.size(); |
283 } |
281 } |
284 |
282 |
285 T& operator[] (ulong n) |
283 T& operator[] (int n) |
286 { assert (n < size()); |
284 { assert (n < size()); |
287 return m_vect[n]; |
285 return m_vect[n]; |
288 } |
286 } |
289 |
287 |
290 const T& operator[] (ulong n) const |
288 const T& operator[] (int n) const |
291 { assert (n < size()); |
289 { assert (n < size()); |
292 return m_vect[n]; |
290 return m_vect[n]; |
293 } |
291 } |
294 |
292 |
295 void resize (std::ptrdiff_t size) |
293 void resize (std::ptrdiff_t size) |
298 |
296 |
299 void sort() |
297 void sort() |
300 { std::sort (begin(), end()); |
298 { std::sort (begin(), end()); |
301 } |
299 } |
302 |
300 |
303 ulong find (const T& needle) |
301 int find (const T& needle) |
304 { ulong i = 0; |
302 { int i = 0; |
305 |
303 |
306 for (const T & hay : *this) |
304 for (const T & hay : *this) |
307 { if (hay == needle) |
305 { if (hay == needle) |
308 return i; |
306 return i; |
309 |
307 |
310 i++; |
308 i++; |
311 } |
309 } |
312 |
310 |
313 return -1u; |
311 return -1; |
314 } |
312 } |
315 |
313 |
316 private: |
314 private: |
317 std::deque<T> m_vect; |
315 std::deque<T> m_vect; |
318 }; |
316 }; |
319 |
|
320 // ============================================================================= |
|
321 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
|
322 // ============================================================================= |
|
323 // ListReverser (aka rev) |
|
324 // |
|
325 // Helper class used to reverse-iterate Lists in range-for-loops. |
|
326 // ============================================================================= |
|
327 template<class T> class ListReverser |
|
328 { public: |
|
329 typedef typename List<T>::ReverseIterator Iterator; |
|
330 |
|
331 ListReverser (List<T>& vect) |
|
332 { m_vect = &vect; |
|
333 } |
|
334 |
|
335 Iterator begin() |
|
336 { return m_vect->rbegin(); |
|
337 } |
|
338 |
|
339 Iterator end() |
|
340 { return m_vect->rend(); |
|
341 } |
|
342 |
|
343 private: |
|
344 List<T>* m_vect; |
|
345 }; |
|
346 |
|
347 // ============================================================================= |
|
348 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
|
349 // ============================================================================= |
|
350 // ConstListReverser (aka c_rev) |
|
351 // |
|
352 // Like ListReverser, except works on const Lists. |
|
353 // ============================================================================= |
|
354 template<class T> class ConstListReverser |
|
355 { public: |
|
356 typedef typename List<T>::ConstReverseIterator Iterator; |
|
357 |
|
358 ConstListReverser (const List<T>& vect) |
|
359 { m_vect = &vect; |
|
360 } |
|
361 |
|
362 Iterator begin() const |
|
363 { return m_vect->crbegin(); |
|
364 } |
|
365 |
|
366 Iterator end() const |
|
367 { return m_vect->crend(); |
|
368 } |
|
369 |
|
370 private: |
|
371 const List<T>* m_vect; |
|
372 }; |
|
373 |
|
374 template<class T> using rev = ListReverser<T>; |
|
375 template<class T> using c_rev = ConstListReverser<T>; |
|
376 |
317 |
377 // ============================================================================= |
318 // ============================================================================= |
378 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
319 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
379 // ============================================================================= |
320 // ============================================================================= |
380 // StringFormatArg |
321 // StringFormatArg |