2762 Commits

Author SHA1 Message Date
John Wellbelove
afa17c5042 Squashed commit of the following:
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.
2026-07-11 13:02:42 +01:00
Roland Reichwein
da0c764a30
Separate bit order and endianness in bit_stream.h (#1495) 2026-07-08 09:22:25 +01:00
John Wellbelove
f3028d22e4 Development release of 20.48.0 2026-06-30 11:33:30 +01:00
Sergei
96a111ecd9
Drop problematic T& emplace(const optional_impl& other) (#1478)
* 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.
2026-06-29 19:43:45 +01:00
Roland Reichwein
0663fc7078
Fix etl::unique_ptr::swap() for deleters (#1482)
* Fix etl::unique_ptr::swap() for deleters

Fixes https://github.com/ETLCPP/etl/issues/1481

* Fix etl::deque iterator swap()

Swap all members, not just the index.
2026-06-27 16:00:04 +01:00
Drew Rife
e6a7642121
Add constexpr support for delegate construction and assignment (#1476)
* 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>
2026-06-24 16:51:02 +01:00
Roland Reichwein
05010aebf8
Fix ranges (#1475)
* 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
2026-06-24 13:39:06 +01:00
Roland Reichwein
5e5012c62c
Format user defined types in format.h (#1470)
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-06-24 11:27:53 +02:00
John Wellbelove
2dabc42cbb
Add etl::stable partition (#1466)
* 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>
2026-06-20 10:27:20 +01:00
John Wellbelove
55429eddd2
Only enable the assign and insert member functions for class ivector<… (#1467)
* 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>
2026-06-20 10:26:03 +01:00
Roland Reichwein
04b7004110
Add emplace() to etl::map and further containers (#1462) 2026-06-20 10:57:06 +02:00
John Wellbelove
c6d17b3a8d
Fixes and additional metafunctions for etl::type_list (#1460)
* New metafunctions for type_list

* clang-format changes

* Corrections from review

* Removed commented out code

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
2026-06-18 10:35:20 +01:00
Roland Reichwein
c32f9cc862
Fix using libc++ (#1463)
Before, libstdc++ was used in both gcc and clang builds.

Fix includes an adjustment to consider in NO_STL case.

Now build with libc++ in separate github workflows with clang.
2026-06-17 12:31:53 +01:00
Roland Reichwein
20cab32256
Make ipriority_queue non-sized base class (#1459)
* 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>
2026-06-13 11:00:39 +02:00
Roland Reichwein
6d9ed143b2
Add etl::infinite_loop (#1458) 2026-06-12 08:04:24 +01:00
Christoph Rüthing
4f9618d8df
Make Constructors of Atomics for trivial Types constexpr (#1453)
* 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>
2026-06-08 15:23:35 +01:00
John Wellbelove
1ca5bb012f
to string() does not handle floating point number with integer part exceeding max uint64 t (#1455)
* 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>
2026-06-08 14:16:52 +01:00
Roland Reichwein
42a21a92e8
Fix copy and move in signal.h (#1454)
* 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.
2026-06-04 22:34:59 +01:00
Roland Reichwein
8a782cc7f1
Add more constexpr to constructors (#1450)
* 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.
2026-05-31 19:32:38 +01:00
Sergei
e3fad3c908
Add etl::intrusive_avl_tree class. (#1425)
* 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>
2026-05-31 09:49:55 +01:00
Roland Reichwein
af3944acdb
Fix iterator_traits: make SFINAE-friendly for iterators without nested typedefs (#1447)
The primary etl::iterator_traits template previously required all five
nested typedefs (iterator_category, value_type, difference_type,
pointer, reference) to exist, causing hard compilation errors with
iterators like std::common_iterator or ranges::common_iterator.

Changes:

1. Make primary template SFINAE-friendly: split into an empty primary
   template and a void_t-guarded partial specialization that only
   activates when all nested typedefs are present.

2. Add explicit std::common_iterator specialization (C++20/STL): a
   partial specialization that delegates to
   std::iterator_traits<std::common_iterator<I,S>>.

3. Fall through to std::iterator_traits: the empty primary template
   inherits from std::iterator_traits<TIterator> when building with
   STL and C++20, so any iterator with a std::iterator_traits
   specialization works automatically.

4. Remove iterator_traits dependency from etl::vector: assign() now
   uses decltype(*first) for the type-compatibility static assert,
   and insert() uses ptrdiff_t directly instead of querying
   iterator_traits<TIterator>::difference_type.
2026-05-26 09:11:24 +01:00
Roland Reichwein
9765cbf764
Fix format: float zero-padding, nested replacement width, octal alternate form, and extreme doubles (#1442)
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.
2026-05-26 04:19:42 +01:00
Roland Reichwein
41174ed7f6
Add missing constexpr to intrusive_links.h constructors (#1446) 2026-05-26 04:18:27 +01:00
Roland Reichwein
652034603b
Add test/run-clang-tidy.sh (#1409)
* 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>
2026-05-18 08:01:17 +01:00
Roland Reichwein
373247e5c1
Make etl::variant capable for ROM placement and optimize runtime size (#1441)
Via an variadic_union, the internal storage is adjusted to be
able to be constexpr.
2026-05-18 07:14:26 +01:00
Roland Reichwein
57d3867694
Fix the case of using STL without pthreads but with mutexes (#1433)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Fix the case of using STL without pthreads but with mutexes

On non-POSIX targets in STL mode, std::mutex is included from
mutex.h but will probably miss pthreads. Instead, other
implementations might be detected and used in mutex.h.

Therefore, adding ETL_NO_STD_MUTEX as a profile option for ETL.

Further, removing unnecessary includes from queue headers.

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-05-09 09:29:18 +01:00
Sergei
f6f145c5e5
Apply the rule of zero for etl::optional type. (#1426)
* 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>
2026-05-08 09:33:21 +01:00
Roland Reichwein
079b3345d9
Various bugfixes (#1428)
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-05-06 18:26:10 +01:00
Roland Reichwein
c9198d089c
Add format checks at compile time to format.h (#1419)
* Add format checks at compile time to format.h

* format.h: Refactor padding calculation

* format.h: Code cleanup
2026-05-06 10:16:20 +01:00
Roland Reichwein
a5d279d5e4
Fix sanitizer use (#1429)
* Fix sanitizer use

A case issue prevented adding sanitizer in the tests.

* Fix compiler warnings from actual sanitizer use
2026-05-06 10:13:02 +01:00
Roland Reichwein
e8206cca83
Remove unnecessary includes (#1434)
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-05-06 09:10:10 +01:00
Roland Reichwein
4f411c66a9
Remove dead code (#1427)
Removing private class members, code unused by ETL in "private"
namespaces, code unreachable via preprocessor guards (C++11 inside
C++03).

For code still to be kept, even though unused at first sight, add
tests.
2026-05-03 22:49:02 +02:00
Roland Reichwein
a2e274bbc5
Run C++26 workflows with docker (#1421)
Ubuntu 26.04 is not available in github workflows directly and won't be soon.
But ubuntu-26.04 is available as docker container. So use it for running
C++26 workflows which were disabled previously.
2026-04-30 12:27:12 +02:00
Roland Reichwein
943e8e6089
Add invocable and further missing concepts to concepts.h (#1412)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Add concept invocable and further missing concepts to concepts.h

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-04-28 15:35:21 +02:00
Joris Putcuyps
15ca12649e
Global namespace bitset free functions cleanup (#1411)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Keep comparison and swap free functions out of the global namespace and
let ADL do its thing.

* Apply the same global to etl namespace move on overlooked functions

---------

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>
2026-04-28 14:13:55 +02:00
Roland Reichwein
ee0d4740b3
Add begin() and end() to etl::expected (#1410)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Add begin() and end() to etl::expected

* Adding error_or() to etl::expected

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-04-28 11:43:54 +02:00
Roland Reichwein
fe7b2da10c
Fix missing tuple_size (#1407)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Fix missing tuple_size

In case of certain clang versions, a wrong combination of activated
and deactivated template forward declarations and specializations
were provided.

This led to redefinition errors and specialization errors.

Now aligning those combinations, and providing definitions from
<utility> from std in the STL using case.

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-04-28 11:03:25 +02:00
Joris Putcuyps
5ccbc6fbff
Swap can be part of the etl namespace and let ADL do its thing (#1414)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Swap can be part of the etl namespace and let ADL do its thing

---------

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>
2026-04-28 10:23:52 +02:00
Roland Reichwein
ff772d4bd1
Move operators for etl::unique_ptr to etl namespace (#1408)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Move operators for etl::unique_ptr to etl namespace

This is in accordance with the operators of std::unique_ptr. Also,
it doesn't pollute the global namespace, and also works together
with ADL, finding the operators in the etl namespace now.

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-04-28 09:57:21 +02:00
Joris Putcuyps
43e97b7f3c
Expected actually doesn't require a monostate. (#1413)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Expected actually doesn't require a monostate.

* Better naming, since uninitialised isn't an option for expected.

---------

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>
2026-04-28 09:30:23 +02:00
Roland Reichwein
fbd738db69
Replace deprecated builtin __is_trivially_relocatable if possible (#1402)
Fixes: #1400
2026-04-22 13:28:47 +02:00
Roland Reichwein
a97817010e
Make etl::variant and etl::vector methods noexcept (#1383)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Make etl::optional, etl::variant and etl::vector methods noexcept

Adding type traits supporting the respective conditional noexcept

Fix missing etl::move() in etl::optional move constructors

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-04-22 12:37:53 +02:00
Roland Reichwein
b860326b26
Fix delegate not being cleared by assigning empty braces (#1401)
* Fix delegate not being cleared by assigning empty braces

Fixes issue #1399.

The non-capturing lambda support (PR#1295) added a non-explicit
delegate(function_ptr) constructor and operator=(function_ptr). This
caused `delegate = {}` to implicitly convert `{}` to a null function
pointer and bind it via function_ptr_stub, leaving the delegate
appearing valid (stub != nullptr) but invoking through a null pointer
(undefined behavior).

Fix:
- Mark delegate(function_ptr) constructor explicit to prevent implicit
  conversion from `{}` during initialization.
- In operator=(function_ptr), clear the delegate when fp is null
  instead of binding a null pointer through function_ptr_stub.

Added tests verifying that both `delegate d = {}` and `d = {}` produce
an invalid (cleared) delegate.

* Fix Dockerfile for powerpc cross build

Debian snapshot sources were mixed with plain sid sources which
mismatched after a while. Now, aligning all sources from snapshot
server.
2026-04-21 15:27:43 +02:00
Roland Reichwein
bbf74c5334
Optimize formatting in format.h for float values (#1379)
When formatting float, fix the -0.0 case

format.h float format: Fix rounding issues on all platforms
2026-04-19 13:19:53 +02:00
Roland Reichwein
ff65c753d6
Actually use ETL_USE_BUILTIN_MEM_FUNCTIONS to decide about macro defi… (#1398)
* Print test names at test time (#1343)

* Fix operator| conflict with std::ranges (#1395)

* Actually use ETL_USE_BUILTIN_MEM_FUNCTIONS to decide about macro definitions

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-04-18 17:13:43 +02:00
Roland Reichwein
5dc682b7ff
Support for C++26 (#1375)
Includes C++26 related infrastructure macros.
Fixes compile errors when compiling under C++26.
Initially supported C++26 features:

- [[indeterminate]]
- new 2022 ISO prefixes in ratio.h
- atomic fetch_max() and fetch_min()
- is_virtual_base_of
- is_trivially_relocatable and trivially_relocate
- saturation arithmetic: add_sat, sub_sat, mul_sat, div_sat, saturate_cast
2026-04-15 15:53:29 +02:00
Roland Reichwein
866c8a315e
Extensions for testing (#1380)
* Extensions for testing

Generalize run-tests.sh

Test all C++ versions at once

Fix combination of big endian and -Wsign-conversion

Failed on s390x (as reference for big endian)

Add github workflow for s390x

Add armhf container files

Devcontainers for i386 and riscv

Add github workflows for armhf, i386 and riscv64

Add run-tests.sh for foreign architectures

Document testing in doc/testing.md

Adjustments from clang-format run

Fix .devcontainer/s390x/Dockerfile for linebreak syntax

Fix exit code of run-test.sh

Previously, "exit $?" was used, actually the return value of
FailedCompilation and FailedTest which are always 0.

Now just using 1.

In run-tests.sh at ctest, use -V for printing number of tests unconditionally

While ctest suppresses individual test list by default, it didn't even
print the number of tests anymore, as run_tests.sh does because
it suppresses it output completely.

Now, by default print number of tests, and in verbose mode, print test list
in addition.

* Support powerpc as foreign architecture

* Add SFINAE constraints to etl::begin/end and reverse iterator free functions

The unconstrained etl::begin(), etl::end(), etl::cbegin(), etl::cend(),
etl::rbegin(), etl::rend(), etl::crbegin(), and etl::crend() templates
in the no-STL code path were matching iterator types during ADL, causing
a hard error with GCC 15's std::ranges::begin. When std::ranges performed
ADL on an etl::*::iterator, it found etl::begin() as a candidate; since
the iterator type has a nested iterator typedef, the return type TContainer::iterator
was valid, but calling .begin() on the iterator failed.

Fix: add etl::void_t<decltype(...)> SFINAE guards to each template,
ensuring they only participate in overload resolution when TContainer
actually has the corresponding member function (.begin(), .end(), etc.).

* - Fix red unit tests on 32 bits big-endian platform.

* Document powerpc architecture for testing

* Use Dockerfiles in cross testing github workflows

Synchronizes environment setup for github workflows to what is
defined in the development Dockerfiles. So they don't need to
be maintained separately.

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: Sergei Shirokov <sergej.shirokov@gmail.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-04-15 10:47:52 +02:00
Roland Reichwein
17799452d2
Add missing syntax checks (#1381)
* Fix run-syntax-checks.sh to run with bash

Contains bash specific syntax, and sync with the other *.sh files
in this directory.

* Add missing header file adaptors to the directory and CMakeLists.txt

* run-syntax-checks.sh without ETL_IN_UNIT_TEST

* Fix usage of make_unsigned

* Removing crc.h from syntax checks because of redundancy

* Remove ETL_USING_CPP11 from unit tests

Unit tests are always run with at least C++11.

* Add missing copyright header in test_manchester.cpp

* Fixed usage of ETL_DEPRECATED_REASON(), wrong syntax by order

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-04-15 10:09:28 +02:00
Roland Reichwein
29d0cfec7c
Suppress false positive compiler warnings when compiling with -O3 (#1389)
* Print test names at test time (#1343)

* Suppress false positive compiler warnings when compiling with -O3

The CI checks currently only check everything with -O0. Wenn activating
higher optimization levels, more warnings kick in. Leading to errors,
depending on the configuration.

---------

Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
2026-04-14 12:38:59 +02:00
Roland Reichwein
f258fe4af8 Fix operator| conflict with std::ranges (#1395) 2026-04-14 12:00:37 +02:00