Copperfield Engine 0.1
C++ Game Engine
Loading...
Searching...
No Matches
sparse_list.hpp
1#pragma once
2#include "component_lists.hpp"
3#include <vector>
4#include <optional>
5
12template <typename T>
13class ComponentListSparse : public ComponentListBase {
14public:
15 friend class ComponentManager;
16 ComponentListSparse() : ComponentListBase(ComponentListType::kSparse) {}
17 using ComponentType = T;
19 struct Iterator {
20 using iterator_category = std::forward_iterator_tag;
21 using difference_type = std::ptrdiff_t;
22 using value_type = std::optional<T>;
23 using pointer = std::optional<T>*; // or also value_type*
24 using reference = std::optional<T>&; // or also value_type&
25
26 Iterator(pointer ptr, unsigned pos) : m_ptr_(ptr), pos_(pos) {}
27
28 reference operator*() const { return *m_ptr_; }
29 pointer operator->() { return m_ptr_; }
30
31 Iterator& operator++() {
32 ++m_ptr_;
33 ++pos_;
34 return *this;
35 }
36 Iterator& operator--() {
37 --m_ptr_;
38 --pos_;
39 return *this;
40 }
41 Iterator operator++(int) {
42 Iterator tmp = *this;
43 ++(*this);
44 ++this->pos_;
45 return tmp;
46 }
47 Iterator operator--(int) {
48 Iterator tmp = *this;
49 --(*this);
50 --this->pos_;
51 return tmp;
52 }
53 friend bool operator==(const Iterator& a, const Iterator& b) {
54 return a.m_ptr_ == b.m_ptr_;
55 };
56 friend bool operator!=(const Iterator& a, const Iterator& b) {
57 return a.m_ptr_ != b.m_ptr_;
58 };
59
60 unsigned pos() const { return pos_; }
61 bool valid() { return m_ptr_->has_value(); }
62 T& component() const { return m_ptr_->value(); }
63
64 private:
65 pointer m_ptr_;
66 unsigned pos_;
67 };
68
69 Iterator begin() { return Iterator(components_.data(), 1); }
70 Iterator at(unsigned e) { return Iterator(&components_.at(e - 1), e); }
71 Iterator end() {
72 auto it = Iterator(&components_[components_.size() - 1],
73 static_cast<unsigned>(components_.size()));
74 ++it;
75 return it;
76 }
77
78private:
79 bool addEntity(unsigned e) override {
80 if (e >= components_.size()) {
81 components_.emplace_back(std::optional<T>());
82 return true;
83 }
84 return false;
85 }
86
87 bool moveComponent(unsigned src, unsigned dst) override {
88 if(components_.at(src - 1).has_value()) {
89 components_.at(dst - 1) = components_.at(src - 1).value();
90 removeComponent(src);
91 return true;
92 }
93 return false;
94 }
95
96 bool removeComponent(unsigned e) override {
97 if (e > 0 && e <= components_.size()) {
98 components_[e - 1].reset();
99 return true;
100 }
101 return false;
102 }
103 std::vector<std::optional<T>> components_;
104};
Handles anything related to entities and components in the engine.
Definition: component_manager.hpp:29
base class for component lists
ComponentListType
type of container to be used for storing componets
Definition: component_lists.hpp:8
@ kSparse
should be used for compnents that are used by most entities