Skip to content

Releases: electronicarts/EASTL

3.21.23

31 Aug 05:51
7fadbf0
Compare
Choose a tag to compare

Changes

  • Removed use of sumbodules to break circular dependencies, use CMake's FetchContent instead.
  • Removed generic definition of numeric_limits<>
  • Removed EASTL_CUSTOM_FLOAT_CONSTANTS_REQUIRED & associated functionality
  • Removed Internal::numeric_limits_base
  • Added isnan to EASTL when compiled with C++20
  • Added is_constant_evaluated
  • Fixed midpoint to behave correctly when passed NaNs
  • Add bounds checking assert for array<T, N>::operator[].
  • Fixed fixed_vector move constructor with an explicit allocator parameter. It now works with move-only types.
  • Add bit_and, bit_or, bit_xor, bit_not and owner_less<void> function objects.
  • Use string builtins to improve codegen for string literals operations on string_view and string.
  • span is now specialized for static extents so that it doesn't need to store the size at runtime.
  • Fixed a bug where calling emplace, emplace_hint, or try_emplace on a string_hash_map would call the underlying hash_map implementation, which caused a crash when string_hash_map would try to free memory it didn't own.
  • Consolidate implementations of CharTypeStringSearch/Find functions in char_traits.h.
  • Minor optimization to CharTypeStringRSearch to reduce iteration loop count.
  • Fix deque move assignment operator for move only and non-default constructible types.
  • Added monadic operations and_then, transform and or_else for optional.
  • Fixed value_or for r-value refs to optional.
  • Various bitset fixes and improvements:
    • Replace bitset(uint32_t) with bitset(unsigned long long) which matches the standard and means that 64 bit integers can be correctly converted to a bitset. As a result from_uint32() and from_uint64() are now unnecessary (not deprecated).
    • Add to_ulong_checked() with the same behaviour as the standard, ie. throws or asserts if the target type cannot represent all the set bits.
    • Add an extension to the standard, as_uint<T>() / as_ulong(), cast to a unsigned integral that can represent the entire bitset. If the target type cannot represent the entire bitset, then issue a compile error (overload does not exist).
    • Fix implementation for word types smaller than 32 bit. Fixed logic in find_prev(), other iteration functions and conversion to/from bitset functions that did not work for such types.
    • No longer assume sizeof(word_type) == EA_PLATFORM_WORD_SIZE. eg. from_uint64() previously would not copy the entire value into a bitset<N, uint32_t> for N > 32.
    • Now compiles for a word type of unsigned long or unsigned long long where the type is not uint64_t.
    • Add an assert that the word type is an unsigned integral, as these are the only types that are supported and tested.
  • Add get<T>(pair<T1, T2>). Make get<I>(pair<T1, T2>) constexpr.
  • Fix variant non-member functions get_if(), get(), holds_alternative() and converting constructor and assignment so that they only conditionally compile when the index or type unambiguously refers to a variant alternative.
  • any::emplace() now returns a reference.
  • lru_cache::emplace() now compiles correctly, forwarding its arguments and returns an pair of iterator and bool indiciating emplace success.
  • Made changes to avoid -Wdeprecated-copy-with-user-provided-copy, which manifests for the following reasons:
    • definition of implicit copy assignment operator for class is deprecated because it has a user-provided copy constructor
    • definition of implicit copy constructor for class is deprecated because it has a user-provided copy assignment operator
  • Fix various issues with segmented_vector:
    • Fix copy/move construction/assignment so it doesn't do a shallow copy.
    • clear() now behaves like other eastl containers in that it does not free memory when called, the container maintains it's capacity.
    • segmented_vector now supports types which are not default constructible.
    • Added some missing API functions: reserve, resize, shrink_to_fit, emplace_back.
    • Added comparison operations.
  • Add constructor overloads to map, set, hash_set, hash_map that take an initializer_list and Allocator.
  • Enable some container asserts (when EASTL_ASSERT_ENABLED is enabled), removing the requirement for EASTL_EMPTY_REFERENCE_ASSERT_ENABLED. When called with invalid arguments these functions will result in undefined behaviour.
  • Add some additional asserts to container adaptors.
  • Fix undefined behaviour in shell_sort() algorithm.
  • Add return values for deque, list, slists's member functions emplace_front(), emplace_back() and unique().
  • Add slist::unique() function.
  • Fix references to std library that should be eastl.
  • Fix compilation issues when C4626 is enabled as error on MSVC.
  • Optimize bitset's find_first(), find_next(), find_last(), find_prev() (which are extensions to the standard).
  • Fix bitset<N, eastl_uint128_t>::find_last().gg
  • Added erase_unordered and erase_unordered_if for vector and deque (fixed_vector works implicitly with the
    vector version since it is a vector with a special allocator and these functions don't affect capacity). These
    work similar to free function erase/erase_if but are more efficient if those would result in moving a lot of
    elements. They achieve this by not respecting the order of the remaining element and just moving the elements from
    the end into the now empty spots.
  • optional::emplace now correctly returns T& instead of void as specified in the standard.
  • Explicitly define special member functions for some types. This fixes new compile errors from Visual Studio 17.7.0 Preview.
  • Fix function::target not compiling due to missing template parameter when we called into the base class' member function.

Deprecations:

  • Use EA_DEPRECATED date based macros if available to guide deprecations.
  • Deprecate vector_map<Key, T>::at(index). this function was accidentally inherited from vector with incorrect semantics.
  • Deprecate make_pair_ref(), use make_pair() instead. deprecate a make_pair() overload which was only enabled on MSVC.
  • Deprecate a make_pair() overload which was only enabled on MSVC.
  • Deprecate stack::emplace_back(), use stack::emplace() instead.
  • Deprecate uninitialized_copy_ptr et al - uninitialized_copy is already perfectly suitable for pointers.
  • Deprecate unwrap_iterator, is_reverse_iterator, is_move_iterator, is_insert_iterator, generic_iterator (the last is internal and should already be unused).

PRs

New Contributors

3.21.12

09 Jun 07:30
e757b44
Compare
Choose a tag to compare

This version of EASTL contains a number of improvements, including many bug fixes found through the use of undefined behaviour sanitizer (UBSan), as well as a swathe of deprecations.

Changes:

  • Add return type / value for some deque::insert() overloads that were missing a return.
  • Make deque::insert(position, first, last) compilable for input (single pass) iterators.
  • Fix issues compiling when EASTL_SIZE_T_32BIT is set to 1.
  • Add a const to an operator to comply with P2468R2.
  • Remove explicit copy constructor/assignment from eastl::bitvector so we don't inhibit move constructor/assignment.
  • Added a test to see that we can now move eastl::bitvector.
  • Remove various unused variables from variant to remove warnings.
  • Add vector_map<Key, T>::at_key() overloads as the inherited vector<pair<const Key, T>>::at() function doesn't have the correct semantics and returns the incorrect type (pair<const Key, T>& rather than T).
  • Add hash_map natvis for key/value visualization.
  • Add is_partitioned and partition_point to algorithms.h.
  • Ensure n > 0 before calling memcmp() in char_trait's Compare() and lexicographical_compare() to avoid undefined behaviour.
  • Ensure n > 0 before calling memmove() in copy_backward() or move_backward() to avoid undefined behaviour.
  • Ensure first != last before calling memcpy() in uninitialized_relocate_start() (which is deprecated) to avoid undefined behaviour.
  • Make tuple default constructible when an element type has no member types (which tuple has an empty base optimization for).
  • Ensure n > 0 before calling memmove() in basic_string::assign(); flagged by UBSan.
  • Remove user provided implementation of copy/move assignment operators for eastl::pair so it can be trivially copied if the template parameters are trivially copyable.
  • Added printf format specifiers for use with eastl_size_t that work with both 32- and 64-bit sizes.
  • UBSAN fixes. Remove some unecessary invalid casting in rb_tree.
  • Change some tests to avoid doing nullptr arithmetic, which is undefined behaviour.
  • Change random_shuffle so it doesn't overrun the iterator when first == last.
  • Change tim_sort_buffer so it doesn't invoke undefined behaviour when called on empty vectors.
  • Change radix_sort_impl so it doesn't over-right-shifts on it's last loop when trying to write to the histogram.
  • Change shell_sort so it doesn't overrun the iterator in the loop increment expression.
  • Use aligned allocations in EASTLTestAllocator to avoid allocating missaligned memory on platfroms require larger alignment restrictions for operator new.
  • Make list_map_iterator::mpNode private and change its type to avoid various insances of undefined behaviour when downcasting the anchor node, which is has type list_map_data_base but isn't a list_map_data<T>. No replacement accessor has been provided as mpNode is an internal impelmentation detail that isn't useful for users.
  • Make rbtree_iterator::mpNode private and change its type to avoid various insances of undefined behaviour when downcasting the anchor node, which is has type rbtree_node_base but isn't a rbtree_node<T>. No replacement accessor has been provided as mpNode is an internal impelmentation detail that isn't useful for users.
  • Add natvis support for atomic<T>.
  • Make intrusive_list_iterator::mpNode private and change its type to avoid various insances of undefined behaviour when downcasting the anchor node, which is has type intrusive_list_node but isn't a T. A helper function nodePtr() has been provided, which is equivalent to accessing the old member directly.
  • Update is_pod's implementation on clang-cl to no longer use the compiler builtin __has_trivial_constructor that is deprecated in latest version of clang.
  • Change the type of ListIterator<T>::mpNode from ListNode<T>* to ListNodeBase* to avoid various instances of undefined behaviour when downcasting the anchor node which is a ListNodeBase but not a ListNode<T>.
  • Change the type of SListIterator<T>::mpNode from SListNode<T>* to SListNodeBase* to avoid various instances of undefined behaviour when downcasting the anchor node which is an SListNodeBase but not a SListNode<T>.
  • Remove EASTL_LIST_PROXY_ENABLED, there's no configuration in which it is enabled and enabling it explicitly causes compile errors that we're not interested in fixing.
  • extract_signature_from_callable compiler fix for C++14.
  • Remove uses of compiler builtins that are deprecated in latest version of clang.
  • Added hash function to eastl::fixed_string
  • fix compile error for uninitialized_copy for trivially copyable types that are not assignable.
  • Removed unqualified name lookup for invoke in apply to prevent any ambiguity with other invoke functions.
  • Fixed warning about uninitialised base class in estl::optional copy constructor
  • Added deduction guides for function.
  • Re-add string_view symmetric comparisons (relational operators).
  • Fix "#pragma warning(pop): likely mismatch, popping warning state pushed in different file" warning generated by atomic_push_compiler_optins.h header.
  • Reduce vector_set, vector_multiset, vector_map and vector_multimap's size when the Compare template parameter is an empty class.
  • Fix tuple_cat for calls with l-values and for calls with less than two arguments.
  • Remove non-standard array<T, N> behaviour: array<T, 0> no longer has size() == 1. Deprecate count enumerator.
  • rotate(), uninitialized_copy() + deque optimizations: apply memmove/memcopy optimizations using the correct type trait, is_trivially_copyable<T>.
  • Add structured binding support for array<T, N>.
  • Disable EXPECT_ASSERT for windows-clang when exceptions are disabled to fix compile break.

Deprecations:
The following deprecations will be removed approximately April 2024.

  • Aligning with the standard:
    • EASTL_DECLARE macros - assert that the type trait is true instead of overriding EASTL's definition.
      Note: compile warnings / errors generated will be on the usage of the type declared to have the trait.
      The correct fix is to remove the EASTL_DECLARE usage, not the usage of the type itself.
    • add_(un)signed - use make_(un)signed instead.
    • identity - use type_identity(_t) instead.
    • equal_to_2, not_equal_to_2, less_2 - instead use equal_to<>, not_equal_to<> and less<> respectively.
    • unary_compose, binary_compose - use a lambda instead.
    • add_reference - use add_lvalue_reference(_t) instead.
    • is_array_of_(un)known_bounds - use is_(un)bounded_array.
    • type_select - use conditional.
    • type_and, type_or, type_equal, type_not_equal, type_not - use bool_constant<(expression)> instead.
    • identity - use type_identity instead.
    • has_trivial_constructor - use is_trivially_default_constructible instead.
    • has_trivial_copy - use is_trivially_copy_constructible instead.
    • has_trivial_assign - use is_trivially_assignable, is_trivially_move_assignable or is_trivially_copy_assignable instead.
    • has_trivial_destructor - use is_trivially_destructible instead.
    • has_trivial_relocate - use is_trivially_copyable instead.
    • has_nothrow_constructor - use is_nothrow_constructible instead.
    • has_nothrow_copy - use is_nothrow_copy_constructible instead.
    • has_nothrow_assign - use is_nothrow_assignable instead.
    • uninitialized_relocate_start, uninitialized_relocate_commit, uninitialized_relocate_abort, uninitialized_relocate - pre-C++11 functions that are replaced by move semantics.
    • Deprecate uninitialized_default_fill(_n) - use uninitialized_value_construct instead.
    • Deprecate const and volatile element types for vector, fixed_vector and deque.
  • Improvements to the standard:
    • is_literal_type - use constexpr if to determine whether an expression is constant evaluated.
    • iterator - define typedefs without the use of inheritence.
    • result_of - use invoke_result instead.
    • get_temporary_buffer - unused part of the standard (citation).
    • unary_function, binary_function - no need to inherit from these types.
    • unary_negate, binary_negate - no need to inherit from these types: use not_fn or lambdas instead if necessary.
    • pointer_to_unary_function, pointer_to_binary_function - use mem_fn or a lambda instead.
    • mem_fun, mem_fun_ref - use mem_fn, mem_fn(ref()) or a lambda.
    • bind1st, bind2nd - use a lambda instead.
  • Miscellaneous:
    • hashtable::equal_function() - use key_eq() instead.
    • hashtable::kAllocFlagBuckets - use kHashtableAllocFlagBuckets instead.
    • hashtable comparison operator (non equality) - shouldn't be comparing hashtables.
    • queue::emplace_back - use emplace instead.
    • safe_ptr::has_references - use has_unique_references instead.
    • slist::splice_after - use one of the other splice or splice_after overloads.
    • Deprecate is_lvalue_assignable. Its usage seems limited, and is_copy_assignable is probably the correct trait to use.

3.18.00

20 Oct 23:42
Compare
Choose a tag to compare

Welcome to the 3.18.00 release of EASTL. Thank you to everyone who's contributed to this release.

Feature additions and standard updates:

  • Implemented eastl::bit_cast.
  • Implemented eastl::is_nothrow_invocable.
  • Implemented eastl::to_underlying.
  • Implemented LWG defect 2106: move_iterator doesn't work with iterators which don't return a reference

Bugfixes:

  • eastl::invoke fixes:

    • invoke now correctly deduces the function signature when invoking a member function or member data pointer on a reference_wrapper.
      Previously, this would fail if using arguments which were convertible to the correct type, but did not exactly match.
    • invoke now correctly forwards arguments when invoking a member data pointer.
    • invoke now correctly uses decay_t instead of remove_reference_t in a number of places.
    • invoke_result_t no longer uses decay_t on the type being invoked.
    • invoke is now constexpr.
  • eastl::variant fixes:

    • Fixed incorrect results from some relational operators when valueless_by_exception() is true.
    • Fixed incorrect index when an exception is thrown during emplace().
  • Removed assertions from some eastl::array functions in order to ensure usability in constexpr contexts.

  • eastl::make_signed and eastl::make_unsigned now work correctly for enum types and volatile-qualified types.

  • Containers which support find_as now support using it with keys of the same type as the container's key.

  • Disallowed use of smart pointer default deleter on incomplete types.

  • Fixed an issue where nodes for some data structures could be under-aligned.

  • Properly supported arrays in eastl::cbegin() and eastl::cend().

  • Fixed creation of zero-length spans and subspans.

  • eastl::is_reference now returns true for rvalue references.

  • Fixed a potential out-of-bounds memory access when sorting certain containers.

Optimizations:

  • eastl::variant optimizations:
    • Avoided unnecessary double index checks in variant relational operators.
    • Avoided unnecessary work in valueless_by_exception() when exceptions are disabled.
    • Optimized visit() for the common case of visiting a single variant.
    • Removed unnecessary copies during visit().

3.17.06

26 Jan 20:24
fad5471
Compare
Choose a tag to compare

Minor spelling and grammar corrections. (#396)
Using of qualified eastl move() and forward() functions. (#405)
Fixed warnings in function_detail.h on MSVC at warning level 4. (#400)
Fix get(variant) when variant is a rvalue (#406)
Using of qualified eastl functions. (#407)
Removed extra parentheses on eastl::move's return statement (#409)

[EASTL 3.17.06] (#412)

Thanks to all committers for this EASTL release.

3.17.03

06 Nov 05:33
41bd2e4
Compare
Choose a tag to compare

[EASTL 3.17.03] (#397)

EASTL: lru_cache iteration tests and added support for initializer_lists

eastl::atomic : fixed msvc compiler warning 4459

3.17.02

05 Nov 18:25
50fdd46
Compare
Choose a tag to compare

rbtree::emplace_hint() compilation fix for variadic arg use (#392)

  • Fix hint-versions of rbtree class variadic insertion methods: parameter pack and move semantics support.

  • Fix hashtable::insert() to satisfy new map tests.

Fixed typo in Deque comments (#394)

[EASTL 3.17.02] (#395)

eastl::atomic

  • fix all the spelling mistakes in the doc
  • Added support for non-trivially default constructible types
  • Cleaned up comments and impl
  • improved 128-bit load code gen
  • fixed type pun to support non-trivially default constructible types
  • ensure msvc instrinics do not emit prefetch instructions

EASTL: to_array implementation

EASTL: fix for rbtree input iterator ctor moving elements from the source container

3.17.01

15 Oct 18:36
94ed075
Compare
Choose a tag to compare

128-bit integral feature define fix (#393)

3.17.00

10 Oct 01:12
4235277
Compare
Choose a tag to compare
  • Ensure the alignment of a node<value_type> is the alignment of the whole node allocation, not just the user type

  • Removing old compiler special case code for EA_CPP14_CONSTEXPR

  • Adding eastl::string hash tests and removing an addition overload in the helper template that contrains usage to enum types.

  • Fixing user reported regression when attempting to use fancy pointers in a tuple

  • Resolving uint128_t hashing compiler errors from properly limiting the generic template for enums

  • eastl::pair adding C++17 structured bindings unpacking support

  • eastl::atomic implementation - See EASTL/atomic.h for documentation

  • eastl::function - Optimized function call operator
    - see Invoker() in function_detail.h for explanation of the optimization

  • Consolidate Warnings by using EA_DISABLE_WARNING macros

  • Reverting the UDL warning suppression because of push/pop mismatch issues with the EABase warning suppression macros

  • eastl::variant - Fixed variant warnings due to not sfinae overloads that are not the same type but still comparable
    - improved code gen on msvc
    - added tests

  • Removed unndeded allocator_traits headers

  • Added comments on reverse_wrapper

  • Removed sparse_matrix.h as it was removed internally quite a while ago

  • Updated files that had slight differences to internal eastl

  • Update travis CI to use g++-9 && clang++-11

  • Updated README and CONTRIBUTING to allow contributors to submit their info under the contributors section

  • cleared mpPtrArray in base destructor #389

  • Add eastl::span<*> to EASTL.natvis #386

  • Fix typo in doc #384

  • Fix reverse adaptor when using on a rvalue range #382

  • Fix GCC 9 string SSO segfault #380

  • eastl::shared_ptr<>::reset(): function not thread safe #378

  • Enable compilation without building tests #359

  • Fix tuple vector assign #374

  • fixed unique_ptr<[]>::reset() instructions order. Internal pointer must be updated before deleting object #375

3.16.07

10 Jun 23:53
1cf6182
Compare
Choose a tag to compare
  • fixing spelling mistake in eastl::basic_string

  • Fix for insertion_sort() doing a --(BiDirectionalIterator.begin()) which is an illegal operation and causes crashes on containers such as eastl::deque.

  • eastl::optional_storage - remove unneeded union and trivial type initialization since we use eastl::aligned_storage_t, remove unreferenced internal member function

  • resolving 32-bit eastl_size_t compiler error

  • EASTL_ALIGN_OF porting to C++11 alignof keyword.

  • EASTL_EMPTY_REFERENCE_ASSERT_ENABLED when enabled would not assert when taking a reference to an empty container.
    Example, eastl::vector[0] would not assert that a null reference was being taken if the vector was empty.

  • fixing shared_ptr compiler error when passing nullptr with a custom deleter lambda

  • fixed unique_ptr::reset() instructions order. Internal pointer must be updated before deleting object (#373)

  • fixed unique_ptr<[]>::reset() instructions order. Internal pointer must be updated before deleting object (#375)

  • fixed adl with exchange inside unique_ptr to be fully qualified

  • fix bitvector iterators (#358)
    use mContainer.begin() instead of &mContainer[0],
    since it causes out of bounds exception in non release build

  • Fix circular dependency in fixed_function.h (#350)

3.16.05

24 Feb 20:42
Compare
Choose a tag to compare
  • Implemented C++17 eastl::shared_ptr::weak_from_this.
  • Implemented C++20 char8_t string/string_view support improvements.
  • Fixed unguarded eastl::allocator::set_name usage in eastl::vector_multimap.
  • Added bool autoDestruct template parameter to eastl::late_constructed to determine whether to destruct the containing object
  • eastl::finally fixes for missing type_traits headers.
  • eastl::span fixes for C++17 deduction guides, and completing subspan API.
  • eastl::array fixes for C++17 deduction guides.
  • C++20 iterator fixes.
  • atomic_exchange_explicit bug fix for a missing return statement in a member function.
  • string_view::find_first_of bug fix where incorrect string count member variable was used.
  • vector::DoRealloc tag dispatch bug fix for 'should_copy_tag' and 'should_move_tag' expression.
  • eastl::u8string updated to C++20 definition 'basic_string<char8_t>'