aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/coolarray.hpp113
-rw-r--r--include/entities.hpp2
-rw-r--r--include/world.hpp3
3 files changed, 117 insertions, 1 deletions
diff --git a/include/coolarray.hpp b/include/coolarray.hpp
new file mode 100644
index 0000000..3e167b7
--- /dev/null
+++ b/include/coolarray.hpp
@@ -0,0 +1,113 @@
+#ifndef COOLARRAY_H_
+#define COOLARRAY_H_
+
+#include <memory>
+#include <initializer_list>
+
+template<class T>
+class CoolArray {
+private:
+ T *buffer;
+ size_t _size, _capacity;
+public:
+ CoolArray(void) {
+ buffer = nullptr;
+ _size = 0;
+ _capacity = 0;
+ }
+
+ CoolArray(size_t n, const T& value) {
+ buffer = new T[n];
+ _size = n;
+ _capacity = n;
+ std::fill(buffer, buffer + _size, value);
+ }
+
+ ~CoolArray(void) {
+ delete[] buffer;
+ }
+
+ T& operator[](size_t idx) {
+ return buffer[idx];
+ }
+
+ void operator=(std::initializer_list<T> a) {
+ if (buffer != nullptr)
+ delete[] buffer;
+
+ _size = a.size();
+ buffer = new T[_size];
+ _capacity = _size;
+ std::copy(a.begin(), a.end(), buffer);
+ }
+
+ template<class Func>
+ void remove_if(Func f) {
+ for (size_t i = 0; i < _size; ++i) {
+ if (f(buffer[i]))
+ std::move(buffer + i + 1, buffer + _size--, buffer + i);
+ }
+ }
+
+ void reserve(size_t n) {
+ if (buffer != nullptr) {
+ T *newbuf = new T[n];
+ std::copy(buffer, buffer + (_size < n ? _size : n), newbuf);
+ _capacity = n;
+ delete[] buffer;
+ buffer = newbuf;
+ } else {
+ buffer = new T[n];
+ _capacity = n;
+ }
+ }
+
+ void resize(size_t n) {
+ reserve(n);
+ _size = n;
+ }
+
+ void clear(void) {
+ delete[] buffer;
+ _size = 0;
+ _capacity = 0;
+ }
+
+ size_t size(void) const {
+ return _size;
+ }
+
+ size_t capacity(void) const {
+ return _capacity;
+ }
+
+ T& front(void) {
+ return buffer[0];
+ }
+
+ T& back(void) {
+ return buffer[_size - 1];
+ }
+
+ T* begin(void) {
+ return buffer;
+ }
+
+ T* end(void) {
+ return buffer + _size;
+ }
+
+ void push_back(const T& x) {
+ if (_size >= _capacity)
+ reserve(_capacity + 5);
+
+ buffer[_size++] = x;
+ }
+
+ void pop_back(void) {
+ --_size;
+ }
+};
+
+
+#endif // COOLARRAY_H_
diff --git a/include/entities.hpp b/include/entities.hpp
index 61ecc43..e406397 100644
--- a/include/entities.hpp
+++ b/include/entities.hpp
@@ -419,6 +419,8 @@ public:
Structures *stu;
+ Particles(void){}
+
// creates a particle with the desired characteristics
Particles(float x, float y, float w, float h, float vx, float vy, Color c, float d);
diff --git a/include/world.hpp b/include/world.hpp
index 2494120..26811ae 100644
--- a/include/world.hpp
+++ b/include/world.hpp
@@ -9,6 +9,7 @@
// local game includes
#include <common.hpp>
#include <entities.hpp>
+#include <coolarray.hpp>
/**
* The background type enum.
@@ -256,7 +257,7 @@ protected:
*
* @see addParticle()
*/
- std::list<Particles> particles;
+ CoolArray<Particles> particles;
/**
* A vector of all structures in the world.