JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
core::ComponentPool< T > Class Template Reference

Stockage dense des composants d'un type T, indexé par entité (sparse set). More...

#include <ComponentPool.h>

Inheritance diagram for core::ComponentPool< T >:
core::IComponentPool

Public Member Functions

void add (Entity entity, const T &component)
 Attache un composant à une entité.
void remove (Entity entity)
 Retire le composant d'une entité (swap-and-pop).
bool removeIfPresent (Entity entity) override
 Retire le composant d'une entité s'il existe (sans précondition).
bool has (Entity entity) const
 Indique si une entité possède un composant de ce type.
T & get (Entity entity)
 Accède au composant d'une entité (lecture-écriture).
const T & get (Entity entity) const
 Accède au composant d'une entité (lecture seule).
std::size_t size () const
bool empty () const
const std::vector< Entity > & entities () const
 Entités possédant un composant, dans l'ordre du tableau dense.
const std::vector< T > & components () const
 Composants stockés, dans l'ordre du tableau dense.
Public Member Functions inherited from core::IComponentPool
virtual ~IComponentPool ()=default

Static Public Attributes

static constexpr std::size_t INVALID_POSITION = ~std::size_t{0}
 Position dense réservée signifiant « aucun composant pour cette entité ».

Private Member Functions

void ensureSparseSize (Entity::Index index)
 Agrandit le tableau creux pour qu'il couvre un index d'entité donné.

Private Attributes

std::vector< T > _components
 Tableau dense des composants (contigu, cache-friendly).
std::vector< Entity_entities
 Entités propriétaires, parallèle à _components.
std::vector< std::size_t > _sparse
 Position dense de chaque entité, indexé par Entity::index (INVALID_POSITION si absente).

Detailed Description

template<typename T>
class core::ComponentPool< T >

Stockage dense des composants d'un type T, indexé par entité (sparse set).

Combine deux structures pour concilier itération rapide et accès direct :

  • un tableau dense de composants, contigu en mémoire (itération cache-friendly par les systèmes) et son tableau parallèle des entités propriétaires ;
  • un tableau creux indexé par core::Entity::index, associant chaque entité à la position de son composant dans le tableau dense (accès en temps constant).

La suppression se fait par swap-and-pop : le composant retiré est échangé avec le dernier avant d'être retranché, ce qui maintient la densité sans décaler tout le tableau.

Warning
Les références renvoyées par get() sont invalidées par tout add() (réallocation possible) ou remove() (déplacement du dernier élément). Ne pas conserver une référence à un composant au-delà de telles opérations sur la même pool.
Template Parameters
TType de composant stocké. Doit être une donnée pure (EX-ARCH-011).

Member Function Documentation

◆ add()

template<typename T>
void core::ComponentPool< T >::add ( Entity entity,
const T & component )
inline

Attache un composant à une entité.

Parameters
entityEntité destinataire ; ne doit pas déjà posséder ce composant.
componentValeur du composant à copier dans le tableau dense.
Precondition
L'entité ne possède pas encore de composant de ce type (has() == false).

◆ components()

template<typename T>
const std::vector< T > & core::ComponentPool< T >::components ( ) const
inlinenodiscard

Composants stockés, dans l'ordre du tableau dense.

Returns
Une référence constante sur le tableau dense des composants.

◆ empty()

template<typename T>
bool core::ComponentPool< T >::empty ( ) const
inlinenodiscard
Returns
true si la pool ne contient aucun composant.

◆ ensureSparseSize()

template<typename T>
void core::ComponentPool< T >::ensureSparseSize ( Entity::Index index)
inlineprivate

Agrandit le tableau creux pour qu'il couvre un index d'entité donné.

Parameters
indexIndex d'entité à rendre adressable dans le tableau creux.

◆ entities()

template<typename T>
const std::vector< Entity > & core::ComponentPool< T >::entities ( ) const
inlinenodiscard

Entités possédant un composant, dans l'ordre du tableau dense.

Returns
Une référence constante sur le tableau dense des entités.

◆ get() [1/2]

template<typename T>
T & core::ComponentPool< T >::get ( Entity entity)
inlinenodiscard

Accède au composant d'une entité (lecture-écriture).

Parameters
entityEntité porteuse du composant.
Returns
Une référence sur le composant stocké.
Precondition
L'entité possède ce composant (has() == true).

◆ get() [2/2]

template<typename T>
const T & core::ComponentPool< T >::get ( Entity entity) const
inlinenodiscard

Accède au composant d'une entité (lecture seule).

Parameters
entityEntité porteuse du composant.
Returns
Une référence constante sur le composant stocké.
Precondition
L'entité possède ce composant (has() == true).

◆ has()

template<typename T>
bool core::ComponentPool< T >::has ( Entity entity) const
inlinenodiscard

Indique si une entité possède un composant de ce type.

Parameters
entityEntité testée.
Returns
true si un composant est associé à cette entité (génération incluse).

◆ remove()

template<typename T>
void core::ComponentPool< T >::remove ( Entity entity)
inline

Retire le composant d'une entité (swap-and-pop).

Parameters
entityEntité dont le composant est retiré.
Precondition
L'entité possède ce composant (has() == true).

◆ removeIfPresent()

template<typename T>
bool core::ComponentPool< T >::removeIfPresent ( Entity entity)
inlineoverridevirtual

Retire le composant d'une entité s'il existe (sans précondition).

Parameters
entityEntité éventuellement porteuse du composant.
Returns
true si un composant a été retiré, false s'il n'y en avait pas.

Implements core::IComponentPool.

◆ size()

template<typename T>
std::size_t core::ComponentPool< T >::size ( ) const
inlinenodiscard
Returns
Nombre de composants actuellement stockés.

Member Data Documentation

◆ _components

template<typename T>
std::vector<T> core::ComponentPool< T >::_components
private

Tableau dense des composants (contigu, cache-friendly).

◆ _entities

template<typename T>
std::vector<Entity> core::ComponentPool< T >::_entities
private

Entités propriétaires, parallèle à _components.

◆ _sparse

template<typename T>
std::vector<std::size_t> core::ComponentPool< T >::_sparse
private

Position dense de chaque entité, indexé par Entity::index (INVALID_POSITION si absente).

◆ INVALID_POSITION

template<typename T>
std::size_t core::ComponentPool< T >::INVALID_POSITION = ~std::size_t{0}
staticconstexpr

Position dense réservée signifiant « aucun composant pour cette entité ».


The documentation for this class was generated from the following file:
  • /home/runner/work/JustAnotherDnDGame/JustAnotherDnDGame/Source/Core/Ecs/ComponentPool.h