src/types.h

changeset 498
791c831c8020
parent 494
bd005c78a089
child 500
cad8cdc42a64
equal deleted inserted replaced
497:c51941e590b6 498:791c831c8020
26 26
27 class LDObject; 27 class LDObject;
28 28
29 typedef QChar qchar; 29 typedef QChar qchar;
30 typedef QString str; 30 typedef QString str;
31 template<class T> class ConstListReverser;
32 template<class T> using c_rev = ConstListReverser<T>;
33 class StringConfig; 31 class StringConfig;
34 class IntConfig; 32 class IntConfig;
35 class FloatConfig; 33 class FloatConfig;
36 class QFile; 34 class QFile;
37 class QTextStream; 35 class QTextStream;
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
414 StringFormatArg (const void* v); 355 StringFormatArg (const void* v);
415 356
416 template<class T> StringFormatArg (const List<T>& v) 357 template<class T> StringFormatArg (const List<T>& v)
417 { m_val = "{ "; 358 { m_val = "{ ";
418 359
419 uint i = 0; 360 int i = 0;
420 361
421 for (const T & it : v) 362 for (const T& it : v)
422 { if (i++) 363 { if (i++)
423 m_val += ", "; 364 m_val += ", ";
424 365
425 StringFormatArg arg (it); 366 StringFormatArg arg (it);
426 m_val += arg.value(); 367 m_val += arg.value();

mercurial