Gaming meets modern C++ - a fast and reliable entity component system (ECS) and much more
config
:
ENTT_ID_TYPE
in the std namespacecontainer
:
dense_set
iterator_concept
to dense map iteratorscore
:
any_policy
basic_any<...>::policy()
member functionis_equality_comparable[_v]
to fully support optional typesnth_argument
type_list_unique
entity
:
basic_registry<...>::valid
fully backward compatibledeletion_policy::swap_only
mode directly managed at sparse set levelbasic_sparse_set<...>::free_list
to set/get the head of the free list if allowedbasic_sparse_set<...>::swap_only
pop protected functionbasic_sparse_set<...>
(only useful with swap-only deletion policy)each
function use scoped iterators from sparse setsbegin
/end
) are scoped if needed (ie entity storage view or the like)basic_storage<void>::get_allocator()
works fine tooto_entity
function to get entities from componentssort_as
for sparse setssort_as
for groupsbasic_registry<...>::try_get
doesn't create storage anymorevalue_type
for storage entity is void
sigh_mixin
support to custom registry typesiterator_concept
to view iteratorsiterator_concept
to groups iteratorsiterator_concept
to registry iteratorsiterator_concept
to handle iteratorsiterator_concept
to storage iteratorsiterable
and const_iterable
types exposed by the registry classbasic_view::operator[]
for size types to avoid forcing non-integral entity typesgraph
:
iterator_concept
to adjacency matrix iteratorsmeta
:
meta_any_policy
meta_any::policy()
member function::reserve
meta_type::can_cast
member functionmeta_type::can_convert
member function::rebind
accepts a value rather than an any
object::rebind
meta_sequence_container::resize
support to non default constructible typesbasic_meta_sequence_container_traits::fixed_size
available to final usersiterator_concept
to meta iteratorsprocess
:
basic_scheduler<...>
was fully redesigned for the better.then
support for basic_scheduler<...>
basic_scheduler<...>
resource
:
iterator_concept
to cache iteratorsSizeBench
bzlmod
support with testsentt.imp
fileAll natvis files have been updated where necessary.
core
:
nth_argument
accepts a type rather than a function, use decltype
as neededentity
:
basic_sparse_set<...>::swap_at
is now privatebasic_storage<...>::in_use
is deprecated, use basic_sparse_set<...>::free_list
insteadtype_traits
type memberbasic_sparse_set<...>
don't invoke compact
automatically anymoreto_entity
function is deprecated, use the storage based version insteadbasic_sparse_set<...>::sort_as
is deprecated, use iterator-based overload of the same function insteadbasic_group<...>::sort_as
is deprecated, use iterator-based overload of the same function instead::pack
function is deprecated, use iterator-based sort_as
insteadbasic_view::operator[]
no longer available for size types to avoid forcing non-integral entity typesbasic_sparse_set<...>::at
is deprecated as ambiguous, use operator[]
insteadmeta
:
::rebind
accepts a value rather than an any
objectrebind
insteadbasic_meta_sequence_container_traits::fixed_size
required for explicit specializationsThe documentation is up-to-date and the library is battle-tested with 100% coverage as usual. I started a long term process to reduce the number of instantiations and also speed up the compilation. This release contains MANY changes and great improvements in this regard. Still a work in progress though.
The documentation is up-to-date and the library is battle-tested with 100% coverage as usual.
config
:
ENTT_FAIL(msg)
as an alias of ENTT_ASSERT(false, msg)
core
:
is_equality_comparable
also detects C-style arraysvalue_list_index[_v]
, value_list_unique[_t]
, value_list_contains[_v]
and value_list_diff[_t]
std::tuple
traits specialization for entt::type_list
and entt::value_list
entity
:
::storage
)::storage
)sigh_helper
utility to simplify connecting multiple listeners to a registrybasic_sparse_set<...>::traits_type
type memberbasic_storage<...>::traits_type
type memberbasic_registry<...>::traits_type
type membercomponent_traits
treat void
properly as any other component typeentt_traits
and basic_entt_traits
to simplify specializing the formerentity_mask
and version_mask
available through entt_traits
entt_traits::base_type
for the final user (not used internally)basic_registry
work properly with void
component typesigh_mixin
is attached to a storagedata
function to sparse set iteratorsclear_all
function available in the basic_sparse_set<...>
classremove
, erase
and clear
functionsremove
, erase
, clear
and destroy
functionsdeletion_policy
is now publicly available via entity/fwd.hpp
basic_sparse_set<...>::contiguous
functionextended_storage_iterator::base
makes the underlying iterator availableextended_view_iterator::base
makes the underlying iterator availableextended_group_iterator::base
makes the underlying iterator availablebasic_storage
when the value type is also the entity type (entity storage)storage<entity_type>()
added basic_entt_traits::next
returns the next valid version of an identifierbasic_registry<...>::size()
(use .storage<E>().size()
instead)basic_registry<...>::alive()
(use .storage<E>().in_use()
instead)basic_registry<...>::reserve(cap)
(use .storage<E>().reserve(cap)
instead)basic_registry<...>::capacity()
(use .storage<E>().capacity()
instead)basic_registry<...>::empty()
(use .storage<E>().in_use()
instead)basic_registry<...>::data()
(use .storage<E>().data()
instead)basic_registry<...>::released()
(use .storage<E>().in_use()
and .storage<E>().size()
instead)basic_registry<...>::release(args...)
(use .storage<E>().erase(args)
and .storage<E>().bump(entt)
instead)basic_registry<...>::assign(args...)
(use .storage<Entity>().push(first, last)
and .storage<Entity>().in_use(len)
instead)basic_registry<...>::each(args...)
(use .storage<Entity>().each()
instead)basic_sparse_set<...>::bump
returns the version in usebasic_storage<...>::insert
returns an iterator to the range of inserted elements.handle()
function to return a reference to the leading storagebasic_registry<...>::group
is no longer [[nodiscard]]
basic_observer
basic_observer
get_t
, owned_t
and exclude_t
are (constexpr constructible) types now rather than aliases of type_list
basic_storage
uses allocator_traits::destroy
now rather than std::destroy_at
(to allow specializations if needed)basic_registry<...>::storage_for_type<...>
available to the final userbasic_view<..>::operator bool
returns true only for fully initialized viewsbasic_registry<...>
doesn't instantiate temporary static storage on const function anymoreon_construct
/on_update
/on_destroy
of basic_registry<...>
also support named poolsreach
, worst name ever) to all storage classesbasic_registry<...>::erase_if
to conditionally erase elements from their storageentities()
(use get<Entity>()
instead)component<...>(...)
(use get<T>(...)
instead)shrink
, no longer required::get<T>(...)
function for snapshot classes that works with storage types::get<T>(...)
for further details)graph
:
flow::graph()
callslocator
:
meta
:
meta_any
ref)operator==/!=
for meta_handleoperator==/!=
for meta_dataoperator==/!=
for meta_propoperator==/!=
for meta_funcprocess
:
basic_scheduler
with default delta type for common casesscheduler
into an alias for basic_scheduler<std::uint32_t>
signal
:
delegate::target
to get a pointer to the stored callable functiondelegate
also supports functions that skip first elements (on second attempt only)sigh
class/W1
on Windows[[nodiscard]]
where it makes sense (i.e. any_cast
or meta_type::from_void
)All natvis files have been updated where necessary.
entity
:
ignore_as_empty_v
doesn't exist anymore, use component_traits<...>::page_size
insteadentt_traits::reserved
is no longer available, combine entity_mask
and version_mask
insteadbasic_sparse_set<...>::swap_at
is now a protected function, override swap_or_move
as needed insteadbasic_sparse_set<...>::move_element
doesn't exist anymore, use swap_or_move
instead (with checks on to
if needed)sigh_storage_mixin
was renamed into sigh_mixin
basic_sparse_set<...>::emplace
was renamed to push
basic_sparse_set<...>::insert
was renamed to push
basic_sparse_set<...>::get
was renamed to value
basic_sparse_set<...>::sort
was renamed to sort_as
basic_group<...>::sort
(no callback overload) was renamed to sort_as
basic_registry<...>::base_type
was renamed to common_type
basic_group<...>::base_type
was renamed to common_type
runtime_view<...>::base_type
was renamed to common_type
basic_view<...>::base_type
was renamed to common_type
basic_view<...>::storage<...>()
returns a (possibly null) pointer rather than a referencebasic_view<...>::handle()
returns a (possibly null) pointer rather than a referencebasic_group<...>::storage<...>()
returns a (possibly null) pointer rather than a referencebasic_view<...>::refresh()
is a self-contained, non-const function that changes the view in-placebasic_view<...>::use<T>()
is a self-contained, non-const function that changes the view in-placeprocess
:
scheduler
no longer requires a template parameter, use basic_scheduler
if std::uint32_t
isn't a good enough delta typesignal
:
disconnect
by reference is no longer available on the sink
class, use the overload that accepts a pointer insteadsink<...>::before
is no longer supported, no alternative providedThe documentation is up-to-date and the library is battle-tested with 100% coverage as usual. I started a long term process to reduce the number of instantiations and also speed up the compilation. This release contains many changes and great improvements in this regard. Still a work in progress though.
config
:
ENTT_NOEXCEPT
and exceptions handlingENTT_CONSTEXPR
(to get around some nasty issues with major compilers)ENTT_ASSERT_CONSTEXPR
(to help further with extreme customizations)container
:
max_size
, count
and equal_range
functionsmax_size
, count
and equal_range
functionscore
:
forward_apply
utilitytype_list_index[_v]
utility for type liststype_list_transform[_t]
utility for type listsnth_argument
utility to easily extract the n-th argument of a functioniota_iterator
(waiting for C++20)operator*
to input_iterator_poointer
operator!=
for any
into an in-class functionstd::aligned_storage_t
with any
(deprecated since C++23)is_tuple[_v]
entity
get_t
and exclude_t
into plain aliases for type_list
basic_registry<...>::group/group_if_exists
basic_sparse_set<...>::get
is now [[nodiscard]]
ignore_as_empty_v<void>
is always truestorage<void>
as a typeless storage onlysigh_storage_mixin
storage_type_t
and storage_for[_t]
as_group
and as_view
are transparent to the registry type (allocator oriented design)invoke
and to_entity
helpers support all types of registries now (allocator oriented design)basic_handle<...>::visit
with ::storage
to return an iterable object rather than accepting lambdasorganizer
class uses the new flow
builder under the hoodget
function, deprecated at
emplace_as
function, deprecated emplace_hint
insert_or_assign
functionswap_and_pop
and in_place_pop
, storage classes only have to implement pop
nowbasic_registry<...>
class (registry allocators also propagate to their pools)swap
and get_allocator
functionsstorage_type[_t]
and storage_for[_t]
basic_view<...>::refresh
to reinitialize the leading pool of a viewgraph
(👈 new module):
adjacency_matrix
class with support for directed and undirected graphsflow
) to create execution graphs from tasks and resource requirementsdot
functions to convert an execution graph (and a graph in general) to the dot formatlocator
:
handle
and reset
)meta
:
insert
/erase
of meta sequence containersmeta_type::remove_pointer
meta_type::is_integral
and meta_type::is_signed
meta_associative_container::erase
returns the number of elements removedmeta_range
is now an alias template of iterable_adaptor
void *
-to-meta_any
utility function for meta_type
sstd::list
and std::deque
are also supported as meta sequence containersoperator!=
for meta_any
into an in-class functionmeta_data_node
, meta_func_node
and so on) are no longer staticmeta_construct
also accepts lambdaspoly
:
std::aligned_storage_t
with poly
(deprecated since C++23)process
:
fwd.hpp
file for the submoduleresource
:
handle_type
and element_type
handle
to access the underlying handlesignal
:
emitter
classdispatcher
uses now an std::allocator<void>
by defaultsigh
uses now an std::allocator<void>
by defaultbasic_emitter
Any other business:
constexpr
noexcept
no matter whatENTT_DEBUG_TEST
and the others)iwyu
(I'll keep an eye on it and refine things a bit at a time)All natvis files have been updated where necessary.
There exists a new natvis file named graph.natvis
for the newly added submodule.
config
:
ENTT_NOEXCEPT[_IF]
no longer existscore
:
identifier
was renamed to ident
ident::identifer_type
was renamed to ident::value_type
family::family_type
was renamed to family::value_type
entity
:
entity/utility.hpp
file, use fwd.hpp
insteadbasic_registry<...>::group/group_if_exists
basic_registry<...>::storage<T>
doesn't accept const types anymorestorage_traits
was renamed to storage_type
storage_type::storage_type
was renamed to storage_type::type
basic_storage
class templatestorage_type
utilitybasic_handle<...>::visit
was removed, use ::storage
instead (iterable model)basic_registry<...>::storage(id)
returns a (possibly null) pointer rather than an utterly annoying iteratormeta
:
meta_type::base(id)
because pointlessmeta_factory<...>::props
)make_meta
is no longer available (it doesn't fit with context support), use meta_any
constructors directly insteadresource
:
resource::use_count
, use handle().use_count()
insteadsignal
:
emitter
classThe documentation is up-to-date and the library is battle-tested with 100% coverage as usual. I started a long term process to reduce the number of instantiations and also speed up the compilation. This release contains many changes and great improvements in this regard. Still a work in progress though.