6#include "component_manager.hpp"
15class ComponentListCompact :
public ComponentListBase {
19 using ComponentType = T;
22 using iterator_category = std::forward_iterator_tag;
23 using difference_type = std::ptrdiff_t;
24 using value_type = std::pair<unsigned, T>;
25 using pointer = std::pair<unsigned, T>*;
26 using reference = std::pair<unsigned, T>&;
28 Iterator(pointer ptr,
bool ends =
false) : m_ptr_(ptr), valid_{!ends} {}
30 reference operator*()
const {
return *m_ptr_; }
31 pointer operator->() {
return m_ptr_; }
33 Iterator& operator++() {
37 Iterator& operator--() {
41 Iterator operator++(
int) {
46 Iterator operator--(
int) {
51 friend bool operator==(
const Iterator& a,
const Iterator& b) {
52 return a.m_ptr_ == b.m_ptr_;
54 friend bool operator!=(
const Iterator& a,
const Iterator& b) {
55 return a.m_ptr_ != b.m_ptr_;
57 int pos()
const {
return m_ptr_->first; }
58 bool valid()
const {
return valid_; }
59 T& component()
const {
return m_ptr_->second; }
69 return Iterator(components_.data());
75 Iterator at(
unsigned e) {
79 std::lower_bound(components_.begin(), components_.end(), e, compare);
81 size_t pos = lb - components_.begin();
82 if (lb != components_.end() && lb->first == e)
return Iterator(&components_.at(pos));
88 if (components_.empty())
return begin();
89 Iterator it = Iterator(
90 &components_[
static_cast<unsigned>(components_.size()) - 1],
true);
99 int size() {
return static_cast<int>(components_.size()); }
102 static bool compare(std::pair<unsigned, T>& x,
unsigned e) {
107 bool addEntity(
unsigned)
override {
return false; }
109 bool moveComponent(
unsigned src,
unsigned dst)
override {
112 std::lower_bound(components_.begin(), components_.end(), dst, compare);
113 if(src_it == components_.end())
115 if (src_it->first != src)
117 res &= setComponent(dst, src_it->second);
118 res &= removeComponent(src);
124 bool setComponent(
unsigned e,
const T& c) {
126 std::lower_bound(components_.begin(), components_.end(), e, compare);
127 if (lb == components_.end()) {
128 components_.emplace_back(std::make_pair(e, c));
130 }
else if (lb->first != e) {
131 components_.insert(lb, std::make_pair(e, c));
138 bool removeComponent(
unsigned e)
override {
140 std::lower_bound(components_.begin(), components_.end(), e, compare);
141 if (lb != components_.end() && lb->first == e) {
142 components_.erase(lb);
148 T* getComp(
unsigned e) {
150 std::lower_bound(components_.begin(), components_.end(), e, compare);
151 if (lb != components_.end() && lb->first == e)
return &lb->second;
155 std::vector<std::pair<unsigned, T>> components_;
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
@ kCompact
should be used for compoenents used by few entities