staticVector.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #pragma once
  2. //////////////////////////////////////////
  3. //staticVector.h
  4. //Luta Vlad(c) 2022
  5. //https://github.com/meemknight/PikaEngine
  6. //////////////////////////////////////////
  7. #include <logs/assert.h>
  8. namespace pika
  9. {
  10. template<class T, size_t N>
  11. struct StaticVector
  12. {
  13. typedef T *iterator;
  14. typedef const T *constIterator;
  15. iterator begin() { return &((T *)beg_)[0]; }
  16. constIterator begin() const { return &((T *)beg_)[0]; }
  17. iterator end() { return &((T *)beg_)[size_]; }
  18. constIterator end() const { return &((T *)beg_)[size_]; }
  19. static constexpr unsigned int MAX_SIZE = N;
  20. static constexpr unsigned int capacity = N;
  21. StaticVector() {};
  22. StaticVector(std::initializer_list<T> &&l)
  23. {
  24. for (auto &i : l)
  25. {
  26. push_back(i);
  27. }
  28. };
  29. StaticVector(StaticVector &&other)
  30. {
  31. for (size_t i = 0; i < other.size_; i++)
  32. {
  33. beg_[i] = std::move(other.beg_[i]);
  34. }
  35. this->size_ = other.size_;
  36. other.size_ = 0;
  37. }
  38. StaticVector(const StaticVector &other)
  39. {
  40. for (size_t i = 0; i < other.size_; i++)
  41. {
  42. beg_[i] = other.beg_[i];
  43. }
  44. this->size_ = other.size_;
  45. }
  46. size_t size()const { return size_; }
  47. bool empty() const
  48. {
  49. return (size_ == 0);
  50. }
  51. T *data()
  52. {
  53. return beg_;
  54. }
  55. StaticVector &operator= (const StaticVector &other)
  56. {
  57. if (this == &other)
  58. {
  59. return *this;
  60. }
  61. for (size_t i = 0; i < other.size_; i++)
  62. {
  63. beg_[i] = other.beg_[i];
  64. }
  65. this->size_ = other.size_;
  66. return *this;
  67. }
  68. StaticVector &operator= (StaticVector &&other)
  69. {
  70. if (this == &other)
  71. {
  72. return *this;
  73. }
  74. for (size_t i = 0; i < other.size_; i++)
  75. {
  76. beg_[i] = std::move(other.beg_[i]);
  77. }
  78. this->size_ = other.size_;
  79. other.size_ = 0;
  80. return *this;
  81. }
  82. bool operator==(const StaticVector &other)
  83. {
  84. if (this == &other) { return true; }
  85. if (this->size_ != other.size_) { return false; }
  86. for (int i = 0; i < size_; i++)
  87. {
  88. if ( (*this)[i] != other[i])
  89. {
  90. return false;
  91. }
  92. }
  93. return true;
  94. }
  95. bool operator!=(const StaticVector &other)
  96. {
  97. return !(*this == other);
  98. }
  99. T &operator[] (size_t index)
  100. {
  101. PIKA_PERMA_ASSERT(index < size_, "buffer overflow on acces");
  102. return (beg_)[index];
  103. }
  104. T operator[] (size_t index) const
  105. {
  106. PIKA_PERMA_ASSERT(index < size_, "buffer overflow on acces");
  107. return (beg_)[index];
  108. }
  109. T &back()
  110. {
  111. return (*this)[size_ - 1];
  112. }
  113. const T &back() const
  114. {
  115. return (*this)[size_ - 1];
  116. }
  117. void clear() { size_ = 0; }
  118. void push_back(const T &el)
  119. {
  120. PIKA_PERMA_ASSERT(size_ < MAX_SIZE, "exceded max size in push back");
  121. beg_[size_] = el;
  122. size_++;
  123. }
  124. void push_back(T &&el)
  125. {
  126. PIKA_PERMA_ASSERT(size_ < MAX_SIZE, "exceded max size in push back");
  127. beg_[size_] = std::forward<T>(el);
  128. size_++;
  129. }
  130. void pop_back()
  131. {
  132. PIKA_PERMA_ASSERT(size_ > 0, "buffer underflow on pop back");
  133. size_--;
  134. }
  135. size_t size_ = 0;
  136. T beg_[N];
  137. };
  138. }