Scanframe Modular Application 0.1.0
Loading...
Searching...
No Matches
TVector.h
Go to the documentation of this file.
1#pragma once
2
3#include <cassert>
4#include <cinttypes>
5#include <iterator>
6#include <ostream>
7#include <vector>
8
9namespace sf
10{
11
12template<typename T>
13class TIterator;
14
23template<typename T>
24class TVector : public std::vector<T>
25{
26 public:
30 typedef std::vector<T> base_type;
34 typedef typename base_type::size_type size_type;
38 typedef typename base_type::value_type value_type;
47
51 static const size_t npos = static_cast<size_type>(-1);
52
56 TVector() = default;
57
61 TVector(const TVector& v);
62
66 TVector(TVector&&) noexcept = default;
67
71 TVector& operator=(const TVector& v) noexcept;
72
76 TVector& operator=(TVector&& v) noexcept;
77
81 template<typename InputIterator>
82 TVector(InputIterator first, InputIterator last);
83
88 TVector(std::initializer_list<value_type> list);
89
93 explicit TVector(const base_type& sv);
94
99 explicit TVector(size_type sz);
100
105 size_type add(const T& t);
106
112
117 TVector& append(const T& t);
118
124
129 TVector& prepend(const T& t);
130
136
142
149 bool addAt(const T& t, size_type index);
150
157 bool addAt(T&& t, size_type index);
158
165 bool detach(const T& t);
166
172 bool detachAt(size_type index);
173
178 [[nodiscard]] bool isEmpty() const;
179
183 void flush();
184
190 void flush(size_type stop, size_type start = 0);
191
196 size_type find(const T&) const;
197
202 [[nodiscard]] size_type count() const;
203
208 T& first();
209
214 const T& first() const noexcept;
215
220 T& last();
221
226 const T& last() const noexcept;
227
231 bool startsWith(T t) const;
232
236 bool endsWith(T t) const;
237
244
250 const T& get(size_type i) const;
251
257
263
271 T& operator[](size_type i);
272
280 const T& operator[](size_type i) const;
281
288 std::ostream& write(std::ostream& os, bool inc_hex) const;
289};
290
291template<typename T>
292T& TVector<T>::last()
293{
294 assert(!base_type::empty());
295 return *(base_type::end() - 1);
296}
297
298template<typename T>
299const T& TVector<T>::last() const noexcept
300{
301 assert(!base_type::empty());
302 return *(base_type::end() - 1);
303}
304
305template<typename T>
307{
308 return !base_type::empty() && first() == t;
309}
310
311template<typename T>
312bool TVector<T>::endsWith(T t) const
313{
314 return !base_type::empty() && last() == t;
315}
316
317template<typename T>
319{
320 return base_type::at(i);
321}
322
323template<typename T>
324const T& TVector<T>::get(size_type i) const
325{
326 return base_type::at(i);
327}
328
329template<typename T>
331{
332 return this;
333}
334
335template<typename T>
337{
338 return this;
339}
340
341template<typename T>
343{
344 return base_type::at(i);
345}
346
347template<typename T>
349{
350 return base_type::at(i);
351}
352
353template<typename T>
354std::ostream& TVector<T>::write(std::ostream& os, bool inc_hex) const
355{
356 os << '{';
357 for (const auto& x: *this)
358 {
359 os << std::dec << x;
360 if (inc_hex && std::is_integral_v<T>)
361 {
362 uint64_t _x{0};
363 for (int i = 0; i < sizeof(T); i++)
364 {
365 // ReSharper disable file CppCStyleCast
366 ((uint8_t*) &_x)[i] = ((uint8_t*) &x)[i];
367 }
368 os << " (" << std::hex << "0x" << _x << ')';
369 }
370 // Check if this is the last entry in the list using pointer comparison instead of value.
371 if (&(*(base_type::end() - 1)) != &x)
372 {
373 os << ", ";
374 }
375 }
376 return os << std::dec << '}';
377}
378
386template<typename T>
387std::ostream& operator<<(std::ostream& os, TVector<T> const& v)
388{
389 return v.write(os, true);
390}
391
396template<typename T>
398{
399 public:
400 typedef std::vector<T> base_t;
401
402 explicit TIterator(const base_t& v);
403
404 TIterator(const base_t& v, size_t start, size_t stop);
405
406 operator int() const;
407
408 const T& current() const;
409
410 T& current();
411
412 const T& operator++(int);
413
414 const T& operator++();
415
416 void restart();
417
418 void restart(unsigned start, unsigned stop)
419 {
420 _cur = _lower = start;
421 _upper = stop;
422 }
423
424 private:
425 base_t* _vector;
426 unsigned _cur{};
427 unsigned _lower{};
428 unsigned _upper{};
429};
430
431template<typename T>
433 : base_type(v)
434{}
435
436template<typename T>
438{
439 *static_cast<base_type*>(this) = static_cast<base_type>(v);
440 return *this;
441}
442
443template<typename T>
445{
446 *static_cast<base_type*>(this) = static_cast<base_type>(v);
447 return *this;
448}
449
450template<typename T>
451template<typename InputIterator>
452TVector<T>::TVector(InputIterator first, InputIterator last)
453 : base_type(first, last)
454{}
455
456template<typename T>
457TVector<T>::TVector(std::initializer_list<value_type> list)
458 : base_type(list)
459{}
460
461template<typename T>
463 : base_type(sv)
464{}
465
466template<typename T>
470
471template<typename T>
473{
474 // Insert item at the end.
475 base_type::push_back(t);
476 // Index it the size minus one.
477 return base_type::size() - 1;
478}
479
480template<typename T>
482{
483 // Insert item at the end.
484 base_type::push_back(t);
485 // Index it the size minus one.
486 return base_type::size() - 1;
487}
488
489template<typename T>
491{
492 // Insert item at the end.
493 base_type::push_back(t);
494 return *this;
495}
496
497template<typename T>
499{
500 // Insert item at the end.
501 base_type::push_back(std::move(t));
502 return *this;
503}
504
505template<typename T>
507{
508 base_type::insert(base_type::begin(), t);
509 return *this;
510}
511
512template<typename T>
514{
515 base_type::insert(base_type::begin(), std::move(t));
516 return *this;
517}
518
519template<typename T>
521{
522 // The insertion index is the current size.
523 auto index = base_type::size();
524 // Insert items at the end.
525 base_type::insert(base_type::end(), tv.begin(), tv.end());
526 return index;
527}
528
529template<typename T>
530bool TVector<T>::addAt(const T& t, size_type index)
531{
532 // Check if index is in range.
533 if (index > base_type::size())
534 {
535 return false;
536 }
537 if (index == base_type::size())
538 {
539 base_type::insert(base_type::end(), t);
540 }
541 else
542 {
543 base_type::insert(base_type::begin() + index, t);
544 }
545 return true;
546}
547
548template<typename T>
549bool TVector<T>::addAt(T&& t, size_type index)
550{
551 // Check if index is in range.
552 if (index > base_type::size())
553 {
554 return false;
555 }
556 if (index == base_type::size())
557 {
558 base_type::insert(base_type::end(), t);
559 }
560 else
561 {
562 base_type::insert(base_type::begin() + index, t);
563 }
564 return true;
565}
566
567template<typename T>
569{
570 // Check if index is in range.
571 if (index >= base_type::size())
572 {
573 return false;
574 }
575 base_type::erase(base_type::begin() + index, base_type::begin() + index + 1);
576 return true;
577}
578
579template<typename T>
581{
582 return base_type::empty();
583}
584
585template<typename T>
587{
588 base_type::erase(base_type::begin(), base_type::end());
589}
590
591template<typename T>
592bool TVector<T>::detach(const T& t)
593{
594 for (size_type i = 0; i < base_type::size(); ++i)
595 {
596 if (base_type::at(i) == t)
597 {
598 base_type::erase(base_type::begin() + i, base_type::begin() + i + 1);
599 return true;
600 }
601 }
602 return false;
603}
604
605template<typename T>
607{
608 base_type::erase(base_type::begin() + start, base_type::end() + ((stop >= base_type::size()) ? (base_type::size() - 1) : stop));
609}
610
611template<typename T>
612typename TVector<T>::size_type TVector<T>::find(const T& t) const
613{
614 for (size_type i = 0; i < base_type::size(); ++i)
615 {
616 if (base_type::at(i) == t)
617 {
618 return i;
619 }
620 }
621 return npos;
622}
623
624template<typename T>
626{
627 return base_type::size();
628}
629
630template<typename T>
632{
633 assert(!base_type::empty());
634 return *base_type::begin();
635}
636
637template<typename T>
638const T& TVector<T>::first() const noexcept
639{
640 static_assert(!base_type::empty());
641 return *base_type::begin();
642}
643
644template<typename T>
646{
647 _vector = const_cast<base_t*>(&v);
648 restart(0, _vector->size());
649}
650
651template<typename T>
652TIterator<T>::TIterator(const base_t& v, size_t start, size_t stop)
653{
654 _vector = &v;
655 restart(start, stop);
656}
657
658template<typename T>
660{
661 return _cur < _upper;
662}
663
664template<typename T>
665const T& TIterator<T>::current() const
666{
667 return (*_vector)[_cur];
668}
669
670template<typename T>
672{
673 return (*_vector)[_cur];
674}
675
676template<typename T>
678{
679 const T& temp = current();
680 _cur++;
681 return temp;
682}
683
684template<typename T>
686{
687 _cur++;
688 return current();
689}
690
691template<typename T>
693{
694 restart(_lower, _upper);
695}
696
697}// namespace sf
Counted vector having function names compatible with Borland C++ templates.
Definition TVector.h:398
void restart(unsigned start, unsigned stop)
Definition TVector.h:418
TIterator(const base_t &v)
Definition TVector.h:645
std::vector< T > base_t
Definition TVector.h:400
void restart()
Definition TVector.h:692
const T & operator++()
Definition TVector.h:685
const T & current() const
Definition TVector.h:665
Counted vector having additional methods and operators for ease of usage.
Definition TVector.h:25
base_type::size_type size_type
Size type of this template.
Definition TVector.h:34
T & first()
Gets the first element of the vector.
Definition TVector.h:631
TVector(TVector &&) noexcept=default
Move constructor.
TVector & operator=(const TVector &v) noexcept
Assignment operator.
Definition TVector.h:437
std::vector< T > base_type
Base type of this template .
Definition TVector.h:30
TVector & append(const T &t)
Appends an entry to the vectors items at the end of the vector.
Definition TVector.h:490
bool detachAt(size_type index)
Removes specific item from the list by index.
Definition TVector.h:568
T & get(size_type i)
Gets entry from index position.
Definition TVector.h:318
bool endsWith(T t) const
Checks if the last element is of the passed value.
Definition TVector.h:312
base_type::value_type value_type
Value type contained by this vector template.
Definition TVector.h:38
const iter_type const_iter_type
Iteration const type of the template.
Definition TVector.h:46
bool isEmpty() const
Returns true when empty false otherwise.
Definition TVector.h:580
bool addAt(const T &t, size_type index)
Adds an item at index position.
Definition TVector.h:530
static const size_t npos
Value returned by various member functions when they fail.
Definition TVector.h:51
size_type find(const T &) const
Finds an entry by instance in the vector.
Definition TVector.h:612
TVector(const TVector &v)
Copy constructor.
Definition TVector.h:432
std::ostream & write(std::ostream &os, bool inc_hex) const
Definition TVector.h:354
TVector()=default
Default constructor.
void flush()
Removes all entries from the vector.
Definition TVector.h:586
bool startsWith(T t) const
Checks if the first element is of the passed value.
Definition TVector.h:306
size_type add(const T &t)
Adds item at the end of the vector.
Definition TVector.h:472
base_type getBase()
Returns the base type to access it methods explicitly.
Definition TVector.h:330
bool detach(const T &t)
Removes specific item from the list by instance. Uses the compare operator from type T to find it.
Definition TVector.h:592
TIterator< value_type > iter_type
Iteration type of the template.
Definition TVector.h:42
T & last()
Gets the last element of the vector.
Definition TVector.h:292
size_type count() const
Returns the amount of entries in the vector.
Definition TVector.h:625
T & operator[](size_type i)
Array operator Array operator needs reimplementation using std::vector::at() which does a range check...
Definition TVector.h:342
TVector & prepend(const T &t)
Prepends an entry to the vectors items at the beginning of the vector.
Definition TVector.h:506
Definition Application.h:10
_GII_FUNC std::ostream & operator<<(std::ostream &os, const ResultData &)
Stream operator for the setup std::string.