Skip to content

Releases: skypjack/entt

EnTT v3.13.2

10 Apr 06:57
Compare
Choose a tag to compare

Changelog

  • Fix an issue on the range-insert in the sigh_mixin class
  • Add full support to empty types in the snapshot classes
  • Suppress an annoying warning by clang in the snapshot classes

Any other business

The documentation is up-to-date and the library is battle-tested with 100% coverage as usual.

EnTT v3.13.1

02 Feb 09:15
Compare
Choose a tag to compare

Changelog

  • Refine the check in the constructor of the snapshot loader class
  • Avoid swapping observed types from groups
  • Don't install include/BUILD.bazel anymore

Any other business

The documentation is up-to-date and the library is battle-tested with 100% coverage as usual.

EnTT v3.13.0

16 Jan 15:04
Compare
Choose a tag to compare

Changelog

  • config:

    • Provide coverage for user defined ENTT_ID_TYPE in the std namespace
  • container:

    • Added reverse iterators to dense_set
    • Added iterator_concept to dense map iterators
  • core:

    • Introduce any_policy
    • Add basic_any<...>::policy() member function
    • Improved is_equality_comparable[_v] to fully support optional types
    • Type-based nth_argument
    • Reduce compilation cost of type_list_unique
  • entity:

    • Reintroduced support for storage listeners in snapshot
    • Make basic_registry<...>::valid fully backward compatible
    • Specialization for single type views with exclusion lists
    • Introduced deletion_policy::swap_only mode directly managed at sparse set level
    • Added basic_sparse_set<...>::free_list to set/get the head of the free list if allowed
    • Introduced basic_sparse_set<...>::swap_only pop protected function
    • Updated entity storage to make it use swap-only deletion policy directly
    • Drop view specialization for single type with exclusion list
    • Returns scoped iterators from basic_sparse_set<...> (only useful with swap-only deletion policy)
    • Entity storage use scoped iterators with its iterable objects
    • View each function use scoped iterators from sparse sets
    • View iterators (begin/end) are scoped if needed (ie entity storage view or the like)
    • basic_storage<void>::get_allocator() works fine too
    • Storage based to_entity function to get entities from components
    • Iterator-based sort_as for sparse sets
    • Iterator-based sort_as for groups
    • basic_registry<...>::try_get doesn't create storage anymore
    • value_type for storage entity is void
    • sigh_mixin support to custom registry types
    • Added iterator_concept to view iterators
    • Added iterator_concept to groups iterators
    • Added iterator_concept to registry iterators
    • Added iterator_concept to handle iterators
    • Added iterator_concept to storage iterators
    • Full support to reserved bits on entity identifiers (ie for disabling components)
    • Shared implementation for all types of views
    • Explicit iterable and const_iterable types exposed by the registry class
    • Index based view iterators (internal change)
    • Removed basic_view::operator[] for size types to avoid forcing non-integral entity types
  • graph:

    • Added iterator_concept to adjacency matrix iterators
  • meta:

    • Introduce meta_any_policy
    • Add meta_any::policy() member function
    • Meta container support to ::reserve
    • Make basic meta container traits publicly available (with revised aPI)
    • Add meta_type::can_cast member function
    • Add meta_type::can_convert member function
    • Meta container ::rebind accepts a value rather than an any object
    • Meta container iterator support to ::rebind
    • meta_sequence_container::resize support to non default constructible types
    • basic_meta_sequence_container_traits::fixed_size available to final users
    • Correctly initialize all members of meta container wrappers
    • Added iterator_concept to meta iterators
    • Improved meta containers performance
  • process:

    • basic_scheduler<...> was fully redesigned for the better
    • In-line .then support for basic_scheduler<...>
    • Allocator-aware basic_scheduler<...>
  • resource:

    • Added iterator_concept to cache iterators

Build system

  • Make the debug build suitable for SizeBench
  • Enable more warnings on the CI
  • bzlmod support with tests

Any other business

  • Removed all previously deprecated methods
  • Updated IWYU entt.imp file
  • Make the library more C++20-friendly
  • Added a test/example on how to use reserved bits on entity identifiers
  • Clang tidy config (and cleanup, still a work-in-progress though)

Natvis support

All natvis files have been updated where necessary.

Breaking changes

  • core:

    • nth_argument accepts a type rather than a function, use decltype as needed
  • entity:

    • basic_sparse_set<...>::swap_at is now private
    • basic_storage<...>::in_use is deprecated, use basic_sparse_set<...>::free_list instead
    • Entity storage no longer has a type_traits type member
    • Sorting functions of basic_sparse_set<...> don't invoke compact automatically anymore
    • Registry based to_entity function is deprecated, use the storage based version instead
    • basic_sparse_set<...>::sort_as is deprecated, use iterator-based overload of the same function instead
    • basic_group<...>::sort_as is deprecated, use iterator-based overload of the same function instead
    • Storage entity ::pack function is deprecated, use iterator-based sort_as instead
    • basic_view::operator[] no longer available for size types to avoid forcing non-integral entity types
    • basic_sparse_set<...>::at is deprecated as ambiguous, use operator[] instead
  • meta:

    • Meta container ::rebind accepts a value rather than an any object
    • Meta container iterators no longer accept underlying iterators on construction, use rebind instead
    • basic_meta_sequence_container_traits::fixed_size required for explicit specializations

Any other business

The 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.

EnTT v3.12.2

23 Jun 08:44
Compare
Choose a tag to compare

Changelog

  • Avoid warnings due to deprecated functions in the snapshot classes
  • Make basic_registry<...>::valid fully backward compatible

Any other business

The documentation is up-to-date and the library is battle-tested with 100% coverage as usual.

EnTT v3.12.1

20 Jun 09:33
Compare
Choose a tag to compare

Changelog

  • Reintroduce support to storage listeners for snapshot classes
  • Add some tests to avoid future regressions on the snapshot classes
  • Update the single include file to the last version as it ought to be

Any other business

The documentation is up-to-date and the library is battle-tested with 100% coverage as usual.

EnTT v3.12.0

15 Jun 09:49
Compare
Choose a tag to compare

Changelog

  • config:

    • ENTT_FAIL(msg) as an alias of ENTT_ASSERT(false, msg)
  • core:

    • is_equality_comparable also detects C-style arrays
    • Added value_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:

    • All group types are copyable and movable
    • View filter storage classes are now available (see ::storage)
    • Group filter storage classes are now available (see ::storage)
    • Propagate the allocator to the registry context
    • sigh_helper utility to simplify connecting multiple listeners to a registry
    • Public basic_sparse_set<...>::traits_type type member
    • Public basic_storage<...>::traits_type type member
    • Public basic_registry<...>::traits_type type member
    • component_traits treat void properly as any other component type
    • Split entt_traits and basic_entt_traits to simplify specializing the former
    • Make entity_mask and version_mask available through entt_traits
    • Add entt_traits::base_type for the final user (not used internally)
    • Make basic_registry work properly with void component type
    • Handles discard their entities on destruction
    • Improved removing/erasing elements when a sigh_mixin is attached to a storage
    • Added internal, opaque data function to sparse set iterators
    • Additional internal virtual clear_all function available in the basic_sparse_set<...> class
    • Improved performance of sparse set remove, erase and clear functions
    • Improved performance of registry remove, erase, clear and destroy functions
    • deletion_policy is now publicly available via entity/fwd.hpp
    • Added basic_sparse_set<...>::contiguous function
    • extended_storage_iterator::base makes the underlying iterator available
    • extended_view_iterator::base makes the underlying iterator available
    • extended_group_iterator::base makes the underlying iterator available
    • Added a specialization of basic_storage when the value type is also the entity type (entity storage)
    • Entities have their own storage in a registry and it's accessible as storage<entity_type>()
    • Sigh mixin also supports entity storage types (to send signals on entity creation/destruction/update)
    • Exclude-only like views are also supported because of the entity storage
    • added basic_entt_traits::next returns the next valid version of an identifier
    • Refined transparent aggregate support for storage types
    • Deprecated the following functions in the registry class:
      • basic_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 use
    • basic_storage<...>::insert returns an iterator to the range of inserted elements
    • Storage based groups fully support multiple storage of the same type now
    • Huge internal rework to reduce the dependencies between the registry and the group classes/handlers
    • All group types have a .handle() function to return a reference to the leading storage
    • basic_registry<...>::group is no longer [[nodiscard]]
    • Configurable mask type for basic_observer
    • Allocator support for 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)
    • Make basic_registry<...>::storage_for_type<...> available to the final user
    • basic_view<..>::operator bool returns true only for fully initialized views
    • Uninitialized views behave correctly in all circumstances, returning the expected result on each call
    • Views support swapping their storage or setting them lazily
    • View packs fully support empty views finally
    • basic_registry<...> doesn't instantiate temporary static storage on const function anymore
    • on_construct/on_update/on_destroy of basic_registry<...> also support named pools
    • Added a reverse each function (reach, worst name ever) to all storage classes
    • basic_registry<...>::erase_if to conditionally erase elements from their storage
    • Deprecated the following functions in the snapshot classes:
      • entities() (use get<Entity>() instead)
      • component<...>(...) (use get<T>(...) instead)
      • shrink, no longer required
    • General purpose ::get<T>(...) function for snapshot classes that works with storage types
    • Runtime pools support for snapshot classes (see ::get<T>(...) for further details)
    • Drop multi-type archive function requirement for snapshot classes
  • graph:

    • Allocator type propagates to the graph type returned by flow::graph() calls
  • locator:

    • Support for opaque structures
  • meta:

    • It's now possible to update the value of a meta property at any time (non-const meta_any ref)
    • Full support to meta member functions for primitive types
    • operator==/!= for meta_handle
    • operator==/!= for meta_data
    • operator==/!= for meta_prop
    • operator==/!= for meta_func
  • process:

    • Introduced basic_scheduler with default delta type for common cases
    • Turn scheduler into an alias for basic_scheduler<std::uint32_t>
  • signal:

    • Added delegate::target to get a pointer to the stored callable function
    • Refined transparent aggregate support for the dispatcher class
    • delegate also supports functions that skip first elements (on second attempt only)
    • Allow disconnecting listeners during iterations over the sigh class

Build system

  • Bump IWYU version to 0.19
  • Bump CMake version to 3.15.7
  • Enable documentation diagnostic for Clang
  • Increase CI warning level to /W1 on Windows
  • Add GCC11 to the list of compilers directly checked by the CI

Any other business

  • Suppress a few warnings due to unused variables in corner cases
  • More [[nodiscard]] where it makes sense (i.e. any_cast or meta_type::from_void)
  • Better allocator support with additional runtime checks for corner cases

Natvis support

All natvis files have been updated where necessary.

Breaking changes

  • entity:

    • ignore_as_empty_v doesn't exist anymore, use component_traits<...>::page_size instead
    • entt_traits::reserved is no longer available, combine entity_mask and version_mask instead
    • basic_sparse_set<...>::swap_at is now a protected function, override swap_or_move as needed instead
    • basic_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
    • Nested groups are no longer supported (the pain is not worth the gain)
    • basic_view<...>::storage<...>() returns a (possibly null) pointer rather than a reference
    • basic_view<...>::handle() returns a (possibly null) pointer rather than a reference
    • basic_group<...>::storage<...>() returns a (possibly null) pointer rather than a reference
    • basic_view<...>::refresh() is a self-contained, non-const function that changes the view in-place
    • basic_view<...>::use<T>() is a self-contained, non-const function that changes the view in-place
  • process:

    • scheduler no longer requires a template parameter, use basic_scheduler if std::uint32_t isn't a good enough delta type
  • signal:

    • disconnect by reference is no longer available on the sink class, use the overload that accepts a pointer instead
    • sink<...>::before is no longer supported, no alternative provided

Any other business

The 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.

EnTT v3.11.1

02 Dec 08:35
Compare
Choose a tag to compare

Changelog

  • Suppress a bunch of warnings due to unused variables or the like in corner cases
  • Avoid requiring to include storage.hpp when forward declaring a view

Any other business

The documentation is up-to-date and the library is battle-tested with 100% coverage as usual.

EnTT v3.11.0

09 Nov 11:24
Compare
Choose a tag to compare

Changelog

  • config:

    • Decouple ENTT_NOEXCEPT and exceptions handling
    • Added ENTT_CONSTEXPR (to get around some nasty issues with major compilers)
    • Added ENTT_ASSERT_CONSTEXPR (to help further with extreme customizations)
  • container:

    • Dense map max_size, count and equal_range functions
    • Dense set max_size, count and equal_range functions
  • core:

    • A new forward_apply utility
    • type_list_index[_v] utility for type lists
    • type_list_transform[_t] utility for type lists
    • nth_argument utility to easily extract the n-th argument of a function
    • iota_iterator (waiting for C++20)
    • Added operator* to input_iterator_poointer
    • Turn operator!= for any into an in-class function
    • Avoid using std::aligned_storage_t with any (deprecated since C++23)
    • Utility is_tuple[_v]
  • entity

    • Correctly handle overflow of version and max number of entities
    • Turned get_t and exclude_t into plain aliases for type_list
    • Updated API for basic_registry<...>::group/group_if_exists
    • basic_sparse_set<...>::get is now [[nodiscard]]
    • ignore_as_empty_v<void> is always true
    • Support storage<void> as a typeless storage only
    • Added allocator support to sigh_storage_mixin
    • Views support now both const and non-const excluded types
    • Groups support now both const and non-const excluded types
    • Tuple-based constructor for views
    • Added utilities storage_type_t and storage_for[_t]
    • Runtime views support all types of sparse sets now (allocator oriented design)
    • Observers support all types of registries now (allocator oriented design)
    • Snapshots and loaders support all types of registries now (allocator oriented design)
    • as_group and as_view are transparent to the registry type (allocator oriented design)
    • Handles support all types of registries now (allocator oriented design)
    • invoke and to_entity helpers support all types of registries now (allocator oriented design)
    • Organizers support all types of registries now (allocator oriented design)
    • Storage-based model for groups and views (👈 this is huge 🥳 )
    • Replaced basic_handle<...>::visit with ::storage to return an iterable object rather than accepting lambdas
    • The organizer class uses the new flow builder under the hood
    • Added const/non-const registry support to runtime views
    • Runtime views are now allocator aware containers
    • Observers derive directly from storage classes rather than using them internally
    • Relaxed most of the entity validity checks in a registry
    • Added registry context get function, deprecated at
    • Added registry context emplace_as function, deprecated emplace_hint
    • Added registry context insert_or_assign function
    • Merged virtual functions swap_and_pop and in_place_pop, storage classes only have to implement pop now
    • Full support to non-movable types, component types have no more constraints (👈 this is huge 🥳)
    • Partial allocator support for the basic_registry<...> class (registry allocators also propagate to their pools)
    • Registry swap and get_allocator functions
    • Guaranteed order of destruction of the parts of a registry (context variables, components, ...)
    • Allocator support for storage_type[_t] and storage_for[_t]
    • Added basic_view<...>::refresh to reinitialize the leading pool of a view
  • graph (👈 new module):

    • adjacency_matrix class with support for directed and undirected graphs
    • Runtime organizer class (flow) to create execution graphs from tasks and resource requirements
    • Basic dot functions to convert an execution graph (and a graph in general) to the dot format
  • locator:

    • Support exporting and setting services across boundaries using opaque handles (see functions handle and reset)
  • meta:

    • Container traits don't really support plain arrays anymore (if they ever did)
    • Fixed an issue with insert/erase of meta sequence containers
    • Re-added meta_type::remove_pointer
    • Added meta_type::is_integral and meta_type::is_signed
    • meta_associative_container::erase returns the number of elements removed
    • meta_range is now an alias template of iterable_adaptor
    • void *-to-meta_any utility function for meta_types
    • Improve automatic detection of meta sequence containers
    • std::list and std::deque are also supported as meta sequence containers
    • Turn operator!= for meta_any into an in-class function
    • All meta node (i.e. meta_data_node, meta_func_node and so on) are no longer static
    • It's now possible to attach multiple properties to a meta object at different times
    • meta_construct also accepts lambdas
    • Support to const/non-const overloads for the same meta function
    • Context support (👈 this is huge 🥳), see the official documentation for further details
    • Favor top-level conversion functions over bases lookup
  • poly:

    • Avoid using std::aligned_storage_t with poly (deprecated since C++23)
  • process:

    • Added an fwd.hpp file for the submodule
  • resource:

    • Added more comparison operators for resource handles
    • Added type members handle_type and element_type
    • Added member function handle to access the underlying handle
  • signal:

    • Full review of the emitter class
    • dispatcher uses now an std::allocator<void> by default
    • sigh uses now an std::allocator<void> by default
    • Added allocator support to basic_emitter

Any other business:

  • A good amount of functions and types were reviewed to make them constexpr
  • A good amount of functions and types are now (conditionally) noexcept no matter what
  • Added some utilities test to make all them work also in release mode (see ENTT_DEBUG_TEST and the others)
  • Workflow iwyu (I'll keep an eye on it and refine things a bit at a time)
  • Removed the aob target from cmake

Natvis support

All natvis files have been updated where necessary.
There exists a new natvis file named graph.natvis for the newly added submodule.

Breaking changes

  • config:

    • ENTT_NOEXCEPT[_IF] no longer exists
  • core:

    • identifier was renamed to ident
    • ident::identifer_type was renamed to ident::value_type
    • family::family_type was renamed to family::value_type
  • entity:

    • Drop the entity/utility.hpp file, use fwd.hpp instead
    • Updated API for basic_registry<...>::group/group_if_exists
    • basic_registry<...>::storage<T> doesn't accept const types anymore
    • storage_traits was renamed to storage_type
    • storage_type::storage_type was renamed to storage_type::type
    • Entity and component type were flipped in the definition of the basic_storage class template
    • Entity and component type were flipped in the definition of the storage_type utility
    • basic_handle<...>::visit was removed, use ::storage instead (iterable model)
    • basic_registry<...>::storage(id) returns a (possibly null) pointer rather than an utterly annoying iterator
  • meta:

    • Container traits don't really support plain arrays anymore (if they ever did)
    • Removed meta_type::base(id) because pointless
    • Meta data and meta functions no longer return the associated id from the API
    • Meta range iterators return now an id and meta object pair (i.e. for meta data or functions from a meta type)
    • Only the single property API is now available for attaching properties to meta objects (no more meta_factory<...>::props)
    • make_meta is no longer available (it doesn't fit with context support), use meta_any constructors directly instead
  • resource:

    • Removed resource::use_count, use handle().use_count() instead
  • signal:

    • Full review of the emitter class

Any other business

The 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.

EnTT v3.10.3

02 Aug 07:25
Compare
Choose a tag to compare

Changelog

  • entity:
    • Fix an issue that makes storage cross range-erase break when using built-in iterators.

Any other business

The documentation is up-to-date and the library is battle-tested with 100% coverage as usual.

EnTT v3.10.2

01 Aug 08:42
Compare
Choose a tag to compare

Changelog

  • entity:
    • Fix an issue that makes sparse set cross range-erase break when using built-in iterators.

Any other business

The documentation is up-to-date and the library is battle-tested with 100% coverage as usual.