JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
View.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 Valentin Eloy
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#pragma once
5
6#include <cstddef>
7#include <limits>
8#include <tuple>
9#include <utility>
10
12#include "Core/Ecs/Entity.h"
13
18
19namespace core {
20
46template <typename... Components>
47class View {
48public:
53 explicit View(ComponentPool<Components>&... pools) : _pools(&pools...) {}
54
60 template <typename Function>
61 void each(Function&& function) const {
62 const std::vector<Entity>& driver = smallestEntities();
63 for (const Entity entity : driver) {
64 if (matches(entity)) {
65 function(entity, componentOf<Components>(entity)...);
66 }
67 }
68 }
69
77 class Iterator {
78 public:
85 Iterator(const View* view, const std::vector<Entity>* driver, std::size_t index)
86 : _view(view), _driver(driver), _index(index) {
88 }
89
95 [[nodiscard]] bool operator!=(const Iterator& other) const {
96 return _index != other._index;
97 }
98
104 ++_index;
105 skipToMatch();
106 return *this;
107 }
108
113 [[nodiscard]] std::tuple<Entity, Components&...> operator*() const {
114 const Entity entity = (*_driver)[_index];
115 return std::tuple<Entity, Components&...>(entity,
116 _view->componentOf<Components>(entity)...);
117 }
118
119 private:
121 void skipToMatch() {
122 while (_index < _driver->size() && !_view->matches((*_driver)[_index])) {
123 ++_index;
124 }
125 }
126
127 const View* _view;
128 const std::vector<Entity>* _driver;
129 std::size_t _index;
130 };
131
133 [[nodiscard]] Iterator begin() const {
134 const std::vector<Entity>& driver = smallestEntities();
135 return Iterator(this, &driver, 0);
136 }
137
139 [[nodiscard]] Iterator end() const {
140 const std::vector<Entity>& driver = smallestEntities();
141 return Iterator(this, &driver, driver.size());
142 }
143
144private:
150 [[nodiscard]] bool matches(Entity entity) const {
151 return (std::get<ComponentPool<Components>*>(_pools)->has(entity) && ...);
152 }
153
160 template <typename Component>
161 [[nodiscard]] Component& componentOf(Entity entity) const {
162 return std::get<ComponentPool<Component>*>(_pools)->get(entity);
163 }
164
169 [[nodiscard]] const std::vector<Entity>& smallestEntities() const {
170 const std::vector<Entity>* smallest = nullptr;
171 std::size_t smallestSize = (std::numeric_limits<std::size_t>::max)();
172 // Retient la pool de plus faible population : elle borne le nombre
173 // d'entités à filtrer (l'intersection ne peut être plus grande).
174 const auto consider = [&](const auto* pool) {
175 if (pool->size() < smallestSize) {
176 smallestSize = pool->size();
177 smallest = &pool->entities();
178 }
179 };
180 (consider(std::get<ComponentPool<Components>*>(_pools)), ...);
181 return *smallest;
182 }
183
185 std::tuple<ComponentPool<Components>*...> _pools;
186};
187
188} // namespace core
Stockage typé des composants d'un ECS sous forme de sparse set.
Identifiant d'entité de l'ECS : handle générationnel (index + génération).
Stockage dense des composants d'un type T, indexé par entité (sparse set).
Definition ComponentPool.h:61
Itérateur avant sur les entités retenues par la vue.
Definition View.h:77
Iterator & operator++()
Avance jusqu'à l'entité valide suivante.
Definition View.h:103
Iterator(const View *view, const std::vector< Entity > *driver, std::size_t index)
Construit un itérateur positionné puis avancé sur la première entité valide.
Definition View.h:85
void skipToMatch()
Avance l'index sur la prochaine entité possédant tous les composants.
Definition View.h:121
const std::vector< Entity > * _driver
Definition View.h:128
bool operator!=(const Iterator &other) const
Compare deux itérateurs par position.
Definition View.h:95
const View * _view
Definition View.h:127
std::tuple< Entity, Components &... > operator*() const
Déréférence l'itérateur sur l'entité courante et ses composants.
Definition View.h:113
std::size_t _index
Definition View.h:129
Component & componentOf(Entity entity) const
Accède au composant d'un type donné pour une entité retenue.
Definition View.h:161
bool matches(Entity entity) const
Indique si une entité possède tous les composants requis.
Definition View.h:150
const std::vector< Entity > & smallestEntities() const
Sélectionne le tableau dense d'entités de la plus petite pool.
Definition View.h:169
Iterator end() const
Definition View.h:139
void each(Function &&function) const
Applique une fonction à chaque entité possédant tous les composants.
Definition View.h:61
Iterator begin() const
Definition View.h:133
std::tuple< ComponentPool< Components > *... > _pools
Pointeurs sur les pools jointes, un par type de Components.
Definition View.h:185
View(ComponentPool< Components > &... pools)
Construit une vue joignant les pools des composants demandés.
Definition View.h:53
Espace de noms du moteur et de la logique de jeu.
Definition Bootstrap.h:9
Handle générationnel identifiant une entité de l'ECS.
Definition Entity.h:24