When forcing to feed into value_types it has to be an
ETL_OR_STD::pair<const K, V>, but when you want to use CTAD on the pairs the
const is missing and the assert triggers.
ETL_ASSERT_OR_RETURN_VALUE tried to return ETL_NULLPTR from functions
returning references, which cannot be initialized from nullptr. Use
plain ETL_ASSERT instead, matching the other operator*() overloads.
Add regression test for dereferencing const and temporary expected.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
* Fixed make_array rejecting const-qualified lvalues of the element type
make_array forwarded each argument as T (the element type) rather than
as its own deduced type. etl::forward<T> accepts only a non-const T& or
a T&&, and a T&& cannot bind to a reference-related const lvalue, so
any call passing a const-qualified lvalue of type T failed to compile:
static const char c = 42;
etl::make_array<char>(c, c); // error: would lose const qualifier
Arguments of *other* types slipped through via temporary
materialisation, which is why the existing conversion and move tests
never caught it.
Forward each argument as its own deduced type and convert explicitly
with static_cast<T>. The explicit conversion is required rather than
plain forwarding: function parameters are not constant expressions, so
narrowing initialisers such as make_array<char>(0, 1) - which the old
code accepted and the tests cover - would otherwise be rejected by the
braced initialiser list.
Adds regression tests for const/non-const lvalues of the element type
and for constexpr evaluation. Verified with clang 22 (C++14/17/20) and
GCC 14 (C++11/20); existing conversion and move-only patterns still
compile.
* Fixed make_deque rejecting const-qualified lvalues of the element type
make_deque had the same defect fixed for make_array in the previous
commit: it forwarded each argument as T (the element type) rather than
as its own deduced type. etl::forward<T> accepts only a non-const T& or
a T&&, and a T&& cannot bind to a reference-related const lvalue, so
any call passing a const-qualified lvalue of type T failed to compile:
static const char c = 42;
etl::make_deque<char>(c, c); // error: would lose const qualifier
An audit of all other make_xxx container factories found no further
instances - they forward each argument as its own deduced pack type,
which is the correct idiom.
Forward each argument as its own deduced type and convert explicitly
with static_cast<T>. The explicit conversion keeps narrowing
initialisers such as make_deque<char>(0, 1) - which the old code
accepted and test_make_deque covers - working, which plain forwarding
into the braced initialiser list would reject.
Adds a regression test for const/non-const lvalues of the element type.
No constexpr test, unlike make_array: etl::deque is not a literal type,
so make_deque cannot be evaluated at compile time. Verified with
clang 22 (C++14/17/20); the new test fails to compile before the fix
and passes after, and all 101 deque tests pass.
* Added narrowing-conversion regression tests for make_array and make_deque
Review feedback on the make_deque fix: the const-lvalue regression test
only passes arguments that already have the element type, so nothing
exercises the static_cast<T> conversion that keeps narrowing
initialisers working. If the implementation regressed to plain
forwarding into the braced initialiser list, narrowing calls such as
make_deque<char>(0, 1) would fail to compile.
make_array already covered narrowing from int literals via
test_make_array, but neither container covered conversion from
const-qualified lvalues of a different type (const int narrowed to
char), which combines both dimensions of the fix.
Adds a matching test to each container covering int literals plus
const/non-const int lvalues, all narrowed to char. Verified with
clang 22 (C++17): 102 deque and 53 array tests pass.
* Added const-lvalue regression tests for the remaining make_xxx factories
Review feedback on the make_array/make_deque fixes asked whether the
same defect - rejecting const-qualified lvalue arguments by forwarding
each argument as the element type rather than as its own deduced type -
exists in the other make_xxx container factories. The audit found that
it does not: the other factories forward each argument as its own
deduced pack type. These tests pin that down explicitly for every
remaining factory, mirroring the make_array and make_deque regression
tests:
- make_vector, make_forward_list, make_indirect_vector (element type
deduced via common_type): const/non-const char lvalues, element type
checked.
- make_set, make_multiset, make_flat_set, make_flat_multiset,
make_unordered_set, make_unordered_multiset: const/non-const lvalues
of the key type.
- make_map, make_multimap, make_flat_map, make_flat_multimap,
make_unordered_map, make_unordered_multimap: const/non-const lvalues
of the pair type.
make_reference_flat_* are excluded: they cannot currently be
instantiated at all (no initializer_list constructor exists in the
reference containers), which is reported separately.
Verified with clang 22 (C++17): all 15 test suites pass (996 tests).
* Added make_forward_list parity tests matching the make_list fixes
Checked whether the make_list defect - taking its argument pack by
value, costing an extra move per lvalue argument - also applies to
make_forward_list. It does not: make_forward_list already takes its
pack by forwarding reference, as make_vector does. No header change is
needed.
Adds the two tests that accompanied the make_list fix so that
forward_list has the same coverage and the same regression detector:
- test_make_forward_list_common_type_from_mixed_types, confirming the
element type deduction through common_type.
- test_make_forward_list_argument_copy_and_move_counts, an
instrumented type counting copy/move constructions. This is the test
that fails if the pack ever regresses to by-value (one extra move
per lvalue argument). The exact move counts are C++17-only, as
before C++17 the non-guaranteed return elision may add a move per
element.
Verified with clang 22 (C++17): all 67 forward_list tests pass.
---------
Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
Add unsigned char/const unsigned char span overloads to byte_stream_reader
to match byte_stream_writer, resolving overload ambiguity (#1533). Add
tests covering span construction for both classes.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
* Add span deduction guide for types with data() and size().
This enables span construct with type deduction from containers which support
.data() and .size(), primarily vector.
---------
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
The two-type etl::common_type specialization recursed with
decay<T2> twice when either argument was not already decayed,
so etl::common_type_t<long&, int&> yielded int instead of long.
Recurse with decay<T1> and decay<T2>, matching the cppreference
sample implementation, and add regression tests comparing
against std::common_type for reference-type arguments.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
make_list was the only make_xxx container factory taking its argument
pack by value rather than by forwarding reference, costing an extra
move per lvalue argument: each lvalue was copy-constructed into the
parameter and then moved into the initializer_list backing array,
where the forwarding-reference signature copies it there directly.
Rvalue prvalue arguments count the same either way in practice, as
copy elision constructs them directly into the by-value parameter.
Change the pack to T&&..., matching make_vector, make_forward_list and
make_indirect_vector. The deduced reference types decay through
common_type, so the element type deduction is unchanged.
Adds tests for const/non-const lvalues of the element type (guarding
against the forward<T> defect fixed for make_array and make_deque),
mixed-type common_type deduction, and an instrumented type counting
copy/move constructions, which fails with the by-value signature (one
extra move per lvalue argument) and passes with the fix.
Also corrects the make_list documentation, which described a
make_array-style signature with an explicit element type parameter
that never matched the implementation.
Verified with clang 22 (C++17): all 93 list tests pass; C++14/20
syntax checks pass.
Note: mixed-type lvalue arguments are affected by a separate
pre-existing defect in etl::common_type (its two-type specialization
recurses with decay<T2> twice instead of decay<T1>, decay<T2>), which
already affects the other common_type-based factories and is being
fixed separately.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
* Fix missing operator[] for iota_iterator and repeat_iterator
The iterators of etl::ranges::iota_view and etl::ranges::repeat_view are
random access iterators but they did not define any operator[]. This did
not cause any issues when using mutable views since the implementation
of operator[] provided by view_interface for random access views was
hidden by another implementation using etl::advance. However, this was
not the case for 'operator[] const', which resulted in a build error
when using constant views.
This commit ensures that the operator[] implementation for random access
views is no longer hidden by another implementation in view_interface,
and adds operator[] to both iterators.
* Fix sign conversion error on operator[] for some views
The operator[] definitions provided by view_interface were accepting
size_t arguments. This was causing a compile-time warning
(Wsign-conversion) for the random access views using an iterator with a
signed difference type. This has been observed on etl::ranges::iota_view
and etl::ranges::repeat_view.
No test is added since the tests provided by the previous commit already
produce the warning, causing a build error.
---------
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
variant::do_destroy() now always resets type_id to variant_npos after
destroying the active alternative. emplace()/operator= set the new
discriminator only after successful construction, so if the constructor
throws the variant is left valueless (index() == variant_npos) instead of
reporting the stale old index.
Add regression test test_emplace_throwing_is_valueless_by_exception
covering both the trivially-destructible (union) and non-trivially-
destructible (buffer) storage suites.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
* Fix histogram test
Use different Start index so skipped start_index copy would not get
unnoticed in the test.
* Fix several test_vector_* for valid data
Instead of comparing the moved-from data which is invalid, compare with
the valid initial_data.
* Fix test_vector to check for the correct iterator position after erase
This was done before, but a recent change dropped it.
* Fix bit_stream: Guard nbits > 0 to prevent division by zero
* Cleanup
---------
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
etl::variant was copy-constructible and copy-assignable even when an
alternative was not copyable, and copying a non-copyable active
alternative silently copied only the index, leaving the variant in an
invalid state.
Move the copy/move construct and assign logic into variant_base and add
a variant_copy_move_control mixin that conditionally deletes the copy and
move special members based on whether every alternative is copy/move
constructible. The variant's special members are now defaulted, so they
are deleted unless all alternatives support the operation.
Fixes: #1512
Further, same-type-assignment optimization: Previously, assignment
was destroy-and-reconstruct. Now, copy/move-assign are enabled if
the types allow for it.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
commit c5dc331004b4d9611ab996935bedada203676c71
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date: Sat Jul 11 12:32:20 2026 +0100
Updated release notes
commit 4bf6ed6ce8d79857658d763e368ee56617542b2c
Author: vcoselev <145198867+vcoselev@users.noreply.github.com>
Date: Sat Jul 11 12:05:39 2026 +0100
Fix for 1405: etl::exchange doesn't work with unique_ptr (#1477)
* Separate bit order and endianness in bit_stream.h (#1495)
* Factor out ranges tests from test_algorithm.cpp to test_algorithm_ranges.cpp (#1497)
* Fix exchange to use forwarding reference (U&&) and move
- etl::exchange was using the copy constructor. Changed for etl::move.
- The assignment to the new object is now done with forward.
- Added a test with unique_ptr.
---------
Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
commit 2ed9019df04d470530c41c1f27d35adc30b9a32d
Author: Moritz Pflanzer <moritz@pflanzer.eu>
Date: Fri Jul 10 11:42:32 2026 +0200
Update operator[] docs for map class (#1499)
* Separate bit order and endianness in bit_stream.h (#1495)
* Update operator[] docs for map class
No const variant is implemented for the operator[].
---------
Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
commit 423e18d96dc645f1c733cb0d8ae6b675b9eb7e83
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Fri Jul 10 11:14:08 2026 +0200
Factor out ranges tests from test_algorithm.cpp to test_algorithm_ranges.cpp (#1497)
commit 338bfdbb1f4df3c5c08a68a9038f13b8dae1c28b
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date: Fri Jul 10 10:12:04 2026 +0100
Add coverage report to docs (#1498)
* Updated release notes
* Added link to coverage report
---------
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
commit 269025424f4c6f61cebac090f4df82985fb3b239
Merge: c004cc9d faa4c15b
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date: Thu Jul 9 14:18:32 2026 +0100
Merge branch 'development' of https://github.com/ETLCPP/etl into development
commit c004cc9d508efcf398630758a47aae95b37a7eb8
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date: Thu Jul 9 10:06:17 2026 +0100
Updated release notes
commit faa4c15b49c8ad15475c83ae23e00f5a46f803ca
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date: Thu Jul 9 10:06:17 2026 +0100
Updated release notes
commit 1523e63e35a15cfd1fa72d230a3c79efa7b9c3e0
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Wed Jul 8 20:48:33 2026 +0200
Support non-assignable alternatives in variant (#1496)
commit 878a0ba5a28f6b0dcae9f472a6a6a1f107de0a74
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date: Wed Jul 8 11:07:01 2026 +0100
Updated version and release notes
commit 5287fe4b3b9f58330881d2a62abf6ce8e1159b8d
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date: Wed Jul 8 09:06:50 2026 +0100
Allow etl::vector to store pointers to functions and member functions (#1492)
* Refactored vector.h
Deleted ivectorpointer.h
* Minor changes
* Fixed code incompatible with C++03
* Clang-format changes
* Removed redundant double-qualified name
* Fixed is_is_object_pointer_v to is_object_pointer_v
* Added new test files to meson.build
* Added overflow checks to vector_ext copy and move constructors and assignments
Added assert throw tests.
* Added diagnostic pushes to eliminate GCC warning false positives
* Changed the GCC C++23 Github action to use GCC14
* Applied clang-format
* Added guard to pop_heap
* Added guard to adjust_heap
* Attempt to fix GCC diagnostic
* Attempt to fix GCC diagnostic
Re-enable ranges algorithm tests
* Attempt to fix GCC diagnostic
Re-enable ranges algorithm tests
* clang-format
* Attempt to fix GCC diagnostic
Re-enable ranges algorithm tests
* Attempt to fix GCC diagnostic
Re-enable ranges algorithm tests
* Attempt to fix GCC diagnostic
Re-enable ranges algorithm tests
* Missing newline at end of file
* Attempt to fix GCC diagnostic
Re-enable ranges algorithm tests
* Attempt to fix GCC diagnostic
Re-enable ranges algorithm tests
* Attempt to fix GCC diagnostic
Re-enable ranges algorithm tests
* Attempt to fix GCC diagnostic
Re-enable ranges algorithm tests
* Attempt to fix GCC diagnostic
* clang-format
* Changed gcc --version to gcc-14 --version
---------
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
commit 40dddd7f9601985ae7350e60a404af9028bc9fe9
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Tue Jul 7 23:41:17 2026 +0200
Add optional etl_profile label_flag for Bazel profile injection (#1491)
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
commit 84fca4cd62f72c382c062376ca934803116a20d5
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Tue Jul 7 21:45:47 2026 +0200
Add missing memory functions, according the standard (#1490)
Adding:
- etl::align
- etl::assume_aligned
- etl::is_sufficiently_aligned
- etl::launder
- etl::pointer_traits
- etl::start_lifetime_as
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
commit dca6653b3759b2cdc79307fec7425589feea478d
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Tue Jul 7 21:00:09 2026 +0200
Add missing interfaces to etl::chrono (#1489)
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
commit c52b2ac7b1f675e6b1d34052239423b7f3634033
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Tue Jul 7 18:06:05 2026 +0200
Fix etl::mem_cast cross-size copy constructor and assignment (#1488)
The templated cross-size copy constructor and assignment operator were
broken in two ways:
- They accessed other.buffer / rhs.buffer, which is private in a
different mem_cast instantiation, so the cross-size overloads failed
to compile whenever they were actually instantiated.
- They copied Size_ (the destination size) bytes from a source buffer
that is only Other_Size bytes large, reading past the end of the
source when the destination was larger.
Use the public data() accessor and copy Other_Size bytes. The existing
static_assert(Size >= Other_Size) guarantees the destination is big
enough.
Add test_mem_cast_copy_and_assign_from_smaller regression test.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
commit 165674cb23dda1fd4f7e5a1182f49554a796bfe8
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Tue Jul 7 16:41:50 2026 +0200
Fix etl::pearson::reset() not resetting the first-byte flag (#1487)
reset() cleared the hash array but left the `first` flag false, so a
calculator reused after reset() took the XOR update path on its next
add() instead of the initialisation path. This produced an incorrect
hash for any pearson object that was reset and reused.
Reset `first` to true in reset() so a reset calculator behaves like a
freshly constructed one.
Add test_pearson_reset regression test.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
commit 032ec4cc80f1c0f1baa0383bdbc5f9239b68f268
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Tue Jul 7 13:40:04 2026 +0200
Fix etl::bitset single-element from_string shift on empty string (#1486)
The single-element from_string overloads (char, wchar_t, char16_t,
char32_t) computed element_type(1) << (string_length - 1U) before the
copy loop. For an empty string, or when active_bits is 0, string_length
is 0, so the shift count underflows to SIZE_MAX. Shifting by more than
the element width is undefined behaviour, which also breaks constexpr
evaluation.
Guard the mask with a zero-length check so the shift is only performed
when string_length > 0. The multi-element from_string overloads were
already safe.
Add test_construct_from_empty_string regression test.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
commit 98cb365d4c28e7b72f8547b734a03a4068acd3f5
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Tue Jul 7 12:32:56 2026 +0200
Fix etl::histogram copy/move not preserving start_index (#1485)
The run-time-offset specialization of etl::histogram stores a start_index
member used to map keys to bins (accumulator[key - start_index]). Its copy
constructor, move constructor, copy assignment, and move assignment copied
only the accumulator and left start_index uninitialized, so a copied or
moved histogram indexed the wrong bin in operator[]/add(), causing
out-of-bounds access (undefined behavior).
All four special member functions now also copy start_index. The
compile-time-offset specialization is unaffected, as its start index is a
template constant rather than a data member.
Add regression tests covering copy/move construction and assignment.
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
commit 5cd2f28cd54e4019f7be126bcf7394a6a8318eb9
Author: Drew Rife <darife@jlg.com>
Date: Tue Jul 7 03:14:48 2026 -0400
Refactor variant::emplace to perfect forward args instead of copy/move construct (#1494)
* refactor: emplace logic to use do_emplace for in-place construction with forwarded arguments #1493
* Add test for variant_variadic
---------
Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
commit a47c0aae81b886259918961d5fcee20faa06fdd0
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date: Mon Jul 6 17:32:26 2026 +0200
Fix etl::message_timer firing following timers early on unregister (#1484)
active_list.remove(id, has_expired) adjusts the next timer's delta only
when has_expired is false. When unregistering an active, non-expired timer,
unregister_timer() incorrectly passed true, skipping that adjustment, so
every timer after the removed one in the active list fired early by the
removed timer's delta.
Pass false instead, matching the etl::callback_timer family. tick() still
passes true, since the timer has genuinely expired there. The bug affected
all four variants: message_timer, message_timer_interrupt,
message_timer_atomic and message_timer_locked. Existing tests missed it
because they only ever unregistered the tail timer, where the delta
adjustment is a no-op.
Add a regression test that unregisters a non-tail active timer and checks
the following timer still fires at its original absolute time.
* Drop problematic `T& emplace(const optional_impl& other)`
- Ror both fundamental and non-fundamental specializations.
- This also fixes incorrect `return storage.u.value;` in the fundamental specializations.
- Simplify `emplace` overloads (drop SFINAE).
- Update test cases to:
- verify returned reference
- verify `nothrow`
- Add `emplace(std::initializer_list, ...)` overload for non-fundamental types.
* Fix clang-format
* Revert to idiomatic C++ `initializer_list` by-value.
* feat: Add constexpr support for delegate construction and assignment in C++14 and C++20
* docs: add more docstring coverage #1473
* docs: note constexpr availability for function-pointer overloads
Update docs/callbacks/delegate.md to reflect the new ETL_CONSTEXPR14
annotations on delegate(function_ptr) and create(function_ptr), and add
a paragraph to the Constexpr section explaining which function-pointer
APIs are usable in constant expressions at C++14 vs C++20.
#1473
---------
Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
* Fix etl::get to preserve reference members for tuple rvalues
The rvalue-qualified overloads of etl::get (both the index-based and
type-based forms) unconditionally applied etl::move to the stored
element. For a tuple holding a reference member (e.g. etl::tuple<int&>),
this cast the referenced object to an rvalue instead of returning the
stored lvalue reference, diverging from std::get and failing to compile
when the result was bound to a non-const lvalue reference.
Forward the element with static_cast<element_type&&> instead, so that
reference members collapse to an lvalue reference while value members are
still moved. This is required to support tuples of references such as
those produced by the zip, enumerate and adjacent views.
* Make ranges views return non-const references to make them mutable
* Support type-changing transform_view
* Fix join_with_iterator reference type to match operator*
join_with_iterator declared reference = inner_trait::reference (e.g. int&)
while operator* returns value_type by value. For prvalue-yielding inner
ranges (e.g. repeat_view from a type-changing transform) the declared
reference was inconsistent with the actual dereference. Derive value_type
from the inner iterator's dereference and set reference = value_type,
preserving by-value semantics.
Add regression test for transform|join_with with prvalue inner ranges.
* Make join_with conform to [range.join.with.iterator] using inner/pattern common reference
* Clang-format
* Fix owning_view const begin()/end() by making _r mutable so chunk_view compiles over rvalue ranges
Some ETL random tests write to files but don't CHECK() anything.
Since they are left at the file system and were only used during
development, they can be removed now.
* Added two versions of etl::stable_partition
One is O(N) time , O(N) space
The other is O(Nlog(N)) time
* Added partition_move
* Updates to tests and documentation
* Review changes
* std::size -> sizeof
* etl::size -> ETL_OR_STL::size
* Changed index array typer to std::array
---------
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
* Only enable the assign and insert member functions for class ivector<T*> & class ivector<const T*> when the value_type the iterator references is a pointer to T.
* Imporoved enable_if for assign and insert.
* clang-format
* std::void_t -> etl::void_t
* Made enable_if condition into a common class struct
---------
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
* New metafunctions for type_list
* clang-format changes
* Corrections from review
* Removed commented out code
---------
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
* Fix iterator access algorithm.h
Move from operator[] access to operator+ and operator- to prevent
limited compatibility. This worked before for vector because of
iterators being ptrdiff_t (signed), but not for unsigned access
like size_t as in etl::queue.
* Make ipriority_queue non-sized base class
Fixes issue #1457
---------
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
* Bold project documentation link in README
* Add constexpr to trivial Atomics
According to https://en.cppreference.com/cpp/atomic/atomic/atomic the constructors of atomics should be constexpr. This change marks (at least for the trivial types) the constructor as constexpr.
---------
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
* Added 'scientific' flag to basic_format_spec to allow forcing of scientific format for all floating point values.
* Forces floating point numbers that are larger than than the internal integral workspace types to be formatted in scientific format.
Also allows scientific format to be forced for all floating point output.
NAN and INF outputs now follow case settings, as does the new scientific exponent letter. 'e' or 'E'.
* treefmt changes
* Quick fixes
* Removed <format>
* Added tests for NAN and INF
Fixed result for -INF
* Added tests for upper and lower case scintific format.
* Changed incorrect stream header from <strstream> to <sstream>
* Update test_to_string.cpp
* Update test_to_u16string.cpp
* Update test_to_u32string.cpp
* Update test_to_u8string.cpp
* Update test_to_wstring.cpp
* clang-format updates
* clang-format updates
* Re-coded the precision calculation in add_floating_point_scientific to match add_floating_point_non_scientific
* Rename step 1
* Fix: rename docs/Messaging to docs/messaging
* Rename step 1
* Fix: rename docs/Messaging to docs/messaging
* Rename step 1
* Fix: rename docs/Messaging to docs/messaging
* Changed incorrect stream header from <strstream> to <sstream>
* Update test_to_string.cpp
* clang-format updates
# Conflicts:
# test/test_to_string.cpp
* Remove old docs folder
* clang-format updates
# Conflicts:
# test/test_to_string.cpp
* Re-commit missing file
---------
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
* Add ranges
* Initial Hugo setup
* Work in progress
* Added selection for local or remote site
* Updated to 'light' theme
* Changed to using Hextra Hugo theme
* Changed to using Hextra Hugo theme
* Changed to Hextra Hugo theme
* Change to Hextra Hugo theme
* Updated Hugo setup.
* Updated Hugo setup.
# Conflicts:
# docs/releases/_index.md
* Work in progress
* Added new fonts
Added new documentation
* Latest documentation updates
* Latest documentation updates
# Conflicts:
# docs/containers/array.md
# docs/containers/array_view.md
# docs/containers/array_wrapper.md
# docs/containers/bip_buffer_spsc_atomic.md
# docs/containers/bitset.md
# docs/containers/indirect_vector.md
# docs/containers/vector.md
# docs/getting-started/compilers.md
* Added bloom_filter markdown doc
* Added more documentation
Updated CSS for light and dark modes
* Fixed some menus
Added mode documentation files
* Updated CSS rules
Added badges to home page
Added uniqur_ptr + pool tutorial
* Fixed formatting on the home page markdown
Modified light amd dark code formatting
* Updated unique_ptr-with-pool
* Added container and shared message tutorials
* Updates to documentation
* Added const_multimap
* Updated source-formatting.md
* Added initial raw text files form Web site editor
* Innore coverage build directory
* Exported raw text documentation files from the web site editor
* Hugo updates
* Added Hugo intalation and markdown descriptions
* More addition to the documentation
* Added closure.md and updates to delegate.md
* Added format.md
* Added documentation for etl::delegate_observable, etl::function, Base64 codec
* Added io_port documentation
* Added basic_format_spec
* Added documentation for string_stream and string utilities.
* Added more documentation
Updated the documentation CSS
* Added documentation for clocks, day, duration
* Added more documentation for chrono classes
Updated callouts
* More chrono documentation
* Completed chrono documentation
* Maths functions documentation
* Completed maths documentation
* Completed maths documentation
* Completed maths documentation
* Completed maths documentation
* Added multiple documentation files
* Added iterator.md
* Added debug_count.md and versions.md
* Added debug_count.md and versions.md
* Added more documentation
* More documentation
* Added some design pattern documentation
Modified some of the layout files
Modified the About documentation
* Converted more documentation pages
Modified the site CSS
* Added more documentation
Moced some documentation files to new directories
* Added more documentation
Tweaks to CSS
* Added callback_timer_deferred_locked documentation
* Added callback_timer_locked documentation
* More documentation updates
* More documentation updates
* More documentation updates
* New documentation files.
Harmonised file name format
* New documentation files.
* Multiple document updates
* Multiple document updates
* Final conversion of web pages
* Updates before PR
* Updates before PR
* Updates before PR
# Conflicts:
# docs/blog/_index.md
* Final pre PR updates
* Updates to message framework documentation
* Renamed directory
* Fix spelling
* Added author and date to blog files
Moved documentation files merged from development
* Fixed 'Description' typo
* Fix typos
# Conflicts:
# docs/IO/io_port.md
# docs/containers/sets/const-multiset.md
# docs/containers/sets/const-set.md
# docs/maths/correlation.md
# docs/maths/gamma.md
* Renamed two files to lower case
* Minor renaming
* Added author and date
* Updated callout on bresenham_line.md
Added support for showing the ETL version on the documentation first page, by copying the version.txt file as a hugo asset.
Updated the Python 'update_release.py' to copy 'version.txt'
* Replace space in filename with hyphen.
Added more information to hugo-commands.md
* Replace space in filename with hyphen.
Added more information to hugo-commands.md
# Conflicts:
# docs/getting-started/view-the-docs-locally/hugo-commands.md
* Added a link to pseudo_moving_average.md
* Updated title pages for groups
* Fixed missing 404 for non-existent pages
* Fixed coordinate variable names in the 'Calculating the intersection' example
---------
Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.co.uk>
* Fix copy and move in signal.h
* Delete copy and move in callback_service.h
The implicitly provided copy and move copied internal pointers
which are invalid after copying.
* Delete copy and move in delegate_service.h
The implicitly provided copy and move copied internal pointers
which are invalid after copying.
* Add more constexpr to ctors
* Adjust operator!=() in fixed_iterator.h
Instead of taking an iterator by reference, take it by value as
done in the other operators and overloads.
* Initialize move_iterator() current member
Prevent indeterminate values
* Fix fixed_iterator::operator* return type
fixed_iterator::operator* returned value_type by value, so writes like *it = ...
modified a temporary rather than the underlying location. This broke the
iterator’s intended use (e.g., writing to a fixed register/memory location).
Now returning iterator_traits<TIterator>::reference instead (const and
non-const overloads).
* Fixed move_iterator::operator+= and operator-= return type
move_iterator::operator+= / operator-= returned by value, but RandomAccessIterator
requirements (and std::move_iterator) expect these to return move_iterator&.
Returning by value also added an unnecessary copy and could break generic code
expecting reference semantics.
* Print test names at test time (#1343)
* Fix operator| conflict with std::ranges (#1395)
* Added etl::intrusive_avl_tree class.
* PR review minor fixes.
* Fix `std::move` -> `etl::move`
* Apply AI spell checking
* Try to fix C++03 build.
---------
Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
format.h:
- Fix float zero-padding ({:010f}): output sign first, then zero-fill,
then the unsigned formatted value, matching std::format behavior.
- Fix nested replacement fields ({:{}d}): consume the value's auto-index
in parse_format_spec before parsing nested width/precision fields, so
auto-indexing order matches the C++ standard.
- Fix {:#o} with value 0: produce "0" instead of "00" by skipping the
octal prefix when the value is zero.
- Fix format_floating_default overflow for extreme doubles (DBL_MIN,
DBL_MAX): fall back to scientific notation for values >= 1e18 or
tiny positives < 1e-6, delegating to format_floating_e.
- Fix format_floating_e precision loss: replace iterative multiply-by-10
normalization loop with O(1) log10/pow/floor computation.
- Add resolve_nested_replacements helper to extract width/precision
from format args at formatting time.
test_format.cpp:
- Add tests for float zero-padding, nested replacement width, octal
alternate form with zero, float sign/width/alignment, negative floats,
scientific notation for large/small values, default-to-scientific
switch, positive zero, brace escaping, and integer limits.
format.h + platform.h:
- log10l fix for different toolchain support:
Define ETL_FORMAT_NO_LONG_DOUBLE_MATH in the profile if libm doesn't
provide log10l. This is identified by linker error missing this symbol.
It was identified with the llvm/clang cross toolchain for ARM.
* Print test names at test time (#1343)
* Fix operator| conflict with std::ranges (#1395)
* Add test/run-clang-tidy.sh
Also, add .clang-tidy configuration file.
In test/syntax_check/CMakeLists.txt, make ETL headers non-system headers.
Added .github/workflow/clang-tidy.yaml. Does not break the build for now
on clang-tidy findings/warnings.
Fix syntax issues
Those issues were uncovered by making ETL headers
non-system headers in test/syntax_checks/CMakeLists.txt
* Fix macro syntax
---------
Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
* Apply the rule of zero for `etl::optional` type.
Correct move behavior of `TestDataM` - it should preserve `valid` value.
Implemented overloads of `etl::make_optional` free function.
Extend optional moveable tests
- fundamental vs non-fundamental
- move construct/assign from valueless
- Verify nothrow of `etl::swap` for `etl::optional`.
* coderabbitai review fixes.
---------
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>