Skip to content

Extensions for testing - #1380

Merged
rolandreichweinbmw merged 11 commits into
ETLCPP:developmentfrom
rolandreichweinbmw:run-tests
Apr 15, 2026
Merged

rolandreichweinbmw merged 11 commits into
ETLCPP:developmentfrom
rolandreichweinbmw:run-tests

Conversation

@rolandreichweinbmw

@rolandreichweinbmw rolandreichweinbmw commented Apr 5, 2026 •

Copy link
Copy Markdown
Collaborator

This PR extends several aspects of testing:

  • Support for cross-compiling armhf, i386, powerpc, riscv64 and (extending) s390x, to run in CI checks via qemu
  • Devcontainers for the aforementioned
  • Fixes to source code to support all those architectures
  • Extending run-tests.sh to run tests for all supported C++ versions
  • Fixing exit code of run-tests.sh (always returned 0)
  • Documentation of testing and generators

@coderabbitai

coderabbitai Bot commented Apr 5, 2026 •

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds cross-architecture Dev Container Dockerfiles and VS Code devcontainer configurations for armhf, i386, riscv64 and s390x, plus per-architecture CMake toolchain files. Introduces .devcontainer/run-tests.sh for Docker+QEMU orchestration and new GitHub Actions workflows for armhf, i386, riscv64 and s390x CI. Adds documentation pages docs/generators.md and docs/testing.md. Adds include/etl/private/diagnostic_sign_conversion_push.h and wraps placement-new sites with diagnostic push/pop. Applies targeted source and test edits: explicit casts, midpoint divisor literal changes, bitset index types switched to size_t, exposes EXTRA_TESTING_FLAGS to CTest, renames a CMake test flag, and updates s390x devcontainer to create a non-root user.

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 64.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'Extensions for testing' is vague and generic, using non-descriptive language that does not clearly convey the changeset's main purpose despite the PR actually implementing cross-architecture testing infrastructure. Consider using a more descriptive title such as 'Add cross-compilation testing support for armhf, i386, and riscv64' to better reflect the primary changes.
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The PR description clearly outlines multiple testing infrastructure enhancements aligned with the changeset: cross-compilation support for armhf/i386/riscv64/s390x via QEMU, devcontainers, source code fixes, run-tests.sh improvements, and documentation.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
test/run-tests.sh (1)

251-251: ⚠️ Potential issue | 🟡 Minor

Inconsistent compiler setting for clang builtin mem functions test.

This line is labelled as clang but uses gcc/g++ for the compilers, which appears to be a copy-paste error from the gcc variant above.

Proposed fix
-clang,No STL - Builtin mem functions ,.,cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DNO_STL=ON  -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF  -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF -DETL_USE_BUILTIN_MEM_FUNCTIONS=ON ..
+clang,No STL - Builtin mem functions ,.,cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DNO_STL=ON  -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF  -DETL_OPTIMISATION=$opt -DETL_CXX_STANDARD=$cxx_standard -DETL_ENABLE_SANITIZER=$sanitize -DETL_MESSAGES_ARE_NOT_VIRTUAL=OFF -DETL_USE_BUILTIN_MEM_FUNCTIONS=ON ..
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/run-tests.sh` at line 251, The test entry labeled "clang,No STL -
Builtin mem functions" incorrectly sets CMAKE_C_COMPILER and CMAKE_CXX_COMPILER
to gcc/g++; update that test invocation to use clang/clang++ (replace
-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ with -DCMAKE_C_COMPILER=clang
-DCMAKE_CXX_COMPILER=clang++ in the command string) so the label matches the
compilers used and the clang variant actually runs with clang/clang++; ensure no
other flags are changed and keep -DETL_USE_BUILTIN_MEM_FUNCTIONS=ON intact.
🧹 Nitpick comments (8)
include/etl/private/bitset_new.h (1)

1081-1082: Good fix for sign-conversion, but compile-time overloads remain inconsistent.

Changing element_index to size_t correctly addresses sign-conversion warnings for runtime extraction. However, the compile-time template overload at line 1189 still declares Msb_Element_Index as int, which is then passed to this function expecting size_t. This creates an implicit sign conversion.

Consider also updating line 1189 for consistency:

-      const int Msb_Element_Index = (Position + Length - 1) >> etl::log2<Bits_Per_Element>::value;
+      const size_t Msb_Element_Index = (Position + Length - 1) >> etl::log2<Bits_Per_Element>::value;

Similarly, line 1172 uses int for Element_Index where size_t would be more consistent with the pattern established here.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@include/etl/private/bitset_new.h` around lines 1081 - 1082, The compile-time
template overloads are still using signed int template parameters
(Msb_Element_Index and Element_Index) while extract_from_multiple_elements now
takes size_t, causing implicit sign conversions; update the template parameter
types in the compile-time overloads (the templates that forward to
extract_from_multiple_elements and are declared with Msb_Element_Index and
Element_Index) from int to size_t so the types match, and ensure any related
constexpr helper signatures and calls use size_t consistently to eliminate the
mismatch.
.devcontainer/armhf/Dockerfile (1)

1-40: Consider adding a non-root user for improved security posture.

Static analysis flagged that the container runs as root. While this is common and acceptable for development/testing containers, adding a non-root user would align with container security best practices. This is optional for devcontainers used in CI/testing.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/armhf/Dockerfile around lines 1 - 40, Add a non-root user in
the Dockerfile by creating a new user/group (e.g., etl) and home directory
during the RUN steps, chowning the WORKDIR (/workspaces/etl) to that user,
setting ENV HOME appropriately, and then switching context with the USER
instruction before the CMD; update the existing RUN that installs packages to
also adduser/addgroup and chown the workspace so subsequent commands and the
default CMD run as the non-root user instead of root.
test/run-tests.sh (2)

202-206: Consider modernising the shell syntax.

Shellcheck flags the use of legacy backticks and missing quotes. Using $(...) is more readable and nestable.

Proposed fix
-  while read i ; do
-    CC=`echo $i | cut -d, -f1 | sed -e 's/ *$//'`
-    MSG=`echo $i | cut -d, -f2 | sed -e 's/ *$//'`
-    DIR=`echo $i | cut -d, -f3 | sed -e 's/ *$//'`
-    CMD=`echo $i | cut -d, -f4 | sed -e 's/ *$//'`
+  while read -r i ; do
+    CC=$(echo "$i" | cut -d, -f1 | sed -e 's/ *$//')
+    MSG=$(echo "$i" | cut -d, -f2 | sed -e 's/ *$//')
+    DIR=$(echo "$i" | cut -d, -f3 | sed -e 's/ *$//')
+    CMD=$(echo "$i" | cut -d, -f4 | sed -e 's/ *$//')
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/run-tests.sh` around lines 202 - 206, The loop parsing CSV fields uses
legacy backticks and lacks proper quoting; update the parsing lines in the
while-read loop (the lines that set CC, MSG, DIR, CMD) to use POSIX command
substitution $(...) and properly quote variable expansions (e.g., "$(echo "$i" |
cut -d, -f1 | sed -e 's/ *$//')" etc.), or better yet split $i with IFS and read
to avoid external echo/cut/sed; ensure the while read i; do remains compatible
by quoting expansions when using $i and when assigning CC, MSG, DIR, CMD.

214-217: Add error handling for cd commands.

If cd $DIR fails, the script continues and may execute commands in an unexpected directory.

Proposed fix
-      OLD_DIR=`pwd`
-      cd $DIR
-      mkdir -p build-make || exit 1
-      cd build-make || exit 1
+      OLD_DIR=$(pwd)
+      cd "$DIR" || exit 1
+      mkdir -p build-make || exit 1
+      cd build-make || exit 1

And at line 238:

-      cd $OLD_DIR
+      cd "$OLD_DIR" || exit 1
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/run-tests.sh` around lines 214 - 217, The script does not handle failure
of directory changes (e.g., cd $DIR and cd build-make) so subsequent commands
may run in the wrong location; update the block around OLD_DIR, DIR and
build-make to check each cd return and exit with a non-zero status (or print an
error and exit) on failure — e.g., after cd $DIR and after cd build-make ensure
you abort if the cd fails (use conditional checks or append || { echo "error";
exit 1; }) so the script never continues in the wrong directory.
.devcontainer/i386/Dockerfile (1)

10-10: Minor: Missing space before line continuation.

There's a missing space between --no-install-recommends and the line continuation backslash.

Suggested fix
-    apt-get update && apt-get install -y --no-install-recommends\
+    apt-get update && apt-get install -y --no-install-recommends \
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/i386/Dockerfile at line 10, The apt-get install line has the
backslash directly adjacent to the token "--no-install-recommends", causing a
malformed line continuation; update the Dockerfile line containing "apt-get
update && apt-get install -y --no-install-recommends\" to insert a single space
before the trailing backslash so the line continuation is separated from the
option token.
.devcontainer/riscv64/Dockerfile (1)

10-10: Minor: Missing space before line continuation.

Same formatting issue as the i386 Dockerfile - missing space between --no-install-recommends and the backslash.

Suggested fix
-    apt-get update && apt-get install -y --no-install-recommends\
+    apt-get update && apt-get install -y --no-install-recommends \
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/riscv64/Dockerfile at line 10, The Dockerfile line with
"apt-get update && apt-get install -y --no-install-recommends\\" is missing a
space before the line-continuation backslash; update the line (in the
.devcontainer riscv64 Dockerfile where that apt-get install command appears) to
ensure there is a space between "--no-install-recommends" and the trailing
backslash so the shell line-continuation is correct and matches the i386
Dockerfile style.
.github/workflows/gcc-c++23-riscv64.yml (1)

46-46: Consider quoting the command substitution.

Actionlint flags the unquoted $(getconf _NPROCESSORS_ONLN). While safe here (returns a number), quoting is defensive practice.

Proposed fix
-        cmake --build . -- -j $(getconf _NPROCESSORS_ONLN)
+        cmake --build . -- -j "$(getconf _NPROCESSORS_ONLN)"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/gcc-c++23-riscv64.yml at line 46, The build invocation
uses an unquoted command substitution in the cmake build step: "cmake --build .
-- -j $(getconf _NPROCESSORS_ONLN)"; update this to quote the substitution
(e.g., change to use "$(getconf _NPROCESSORS_ONLN)") so the shell won’t perform
word-splitting or globbing on the result and Actionlint stops flagging the
unquoted substitution.
.github/workflows/gcc-c++23-s390x.yml (1)

23-24: Remove sudo from the apt-get commands in this container job.

When running in a container, the job executes as root by default. The sudo commands on lines 23–24 are unnecessary and should be removed for clarity.

💡 Proposed fix
-        sudo apt-get update
-        sudo apt-get install -y \
+        apt-get update
+        apt-get install -y \
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/gcc-c++23-s390x.yml around lines 23 - 24, Remove the
unnecessary sudo prefixes from the apt commands in the workflow: change "sudo
apt-get update" to "apt-get update" and "sudo apt-get install -y \" to "apt-get
install -y \" (preserve indentation and the line continuation backslash), since
container jobs run as root and sudo is redundant.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.devcontainer/run-tests.sh:
- Around line 46-60: The script branch for elif [ "$2" = "inside_container" ]
handles the container case but leaves other non-empty $2 values silently
succeeding; modify .devcontainer/run-tests.sh to add a final else branch after
that elif which prints a usage/error message (e.g., "Usage: ./run-tests.sh
[mode] — valid mode: inside_container") and exits with non-zero status (exit 1),
ensuring invalid values of $2 are handled explicitly; locate the conditional
that checks "$2" = "inside_container" and append the else { echo "..."; exit 1;
} block.

In @.github/workflows/gcc-c++23-armhf.yml:
- Around line 23-24: The workflow steps use "sudo apt-get update" and "sudo
apt-get install -y \" inside container: debian:trixie where sudo is not
available; remove the "sudo" prefix from the apt-get commands (e.g., change
"sudo apt-get update" and "sudo apt-get install -y \" to "apt-get update" and
"apt-get install -y \" ) in this file and apply the same change to the other
cross-architecture workflow files (gcc-c++23-armhf.yml, gcc-c++23-i386.yml,
gcc-c++23-riscv64.yml, gcc-c++23-s390x.yml) so package installs run directly as
root in the container.

In @.github/workflows/gcc-c++23-i386.yml:
- Around line 23-24: Remove the unnecessary "sudo" prefix from the two commands
currently written as "sudo apt-get update" and "sudo apt-get install -y \"; edit
the workflow (.github/workflows/gcc-c++23-i386.yml) so those lines call "apt-get
update" and "apt-get install -y ..." directly to match the root entrypoint usage
(leave the rest of the install arguments unchanged).

In @.github/workflows/gcc-c++23-riscv64.yml:
- Around line 23-24: Remove the unnecessary sudo prefixes from the apt-get
invocations—replace "sudo apt-get update" and "sudo apt-get install -y \" with
plain "apt-get update" and "apt-get install -y \" in the workflow(s) that use
the debian:trixie container (the four architecture workflows: armhf, i386,
riscv64, s390x), ensuring no other apt-get uses still include sudo so the job
runs as root inside the container.

In `@test/CMakeLists.txt`:
- Line 387: The run-tests.sh script exports the EXTRA_TESTING_FLAGS shell
variable but never passes it into CMake; update the cmake invocations inside the
heredoc (the cmake commands that configure the test build) to add
-DEXTRA_TESTING_FLAGS="${EXTRA_TESTING_FLAGS}" so the cached CMake variable
EXTRA_TESTING_FLAGS receives the value from the environment; ensure the added -D
flag is present for both configuration commands in the heredoc so behavior
matches the GitHub workflow usage.

In `@test/run-tests.sh`:
- Around line 183-189: The script currently exports EXTRA_TESTING_FLAGS as an
environment variable which has no effect because CMake reads EXTRA_TESTING_FLAGS
as a cache variable at configure time; change the logic so that when the `"$6" =
"v"` branch sets verbose, you build a cmake configure flag (e.g. set
`verbose_cmake_flag="-DEXTRA_TESTING_FLAGS=-v"`) and pass that flag into the
cmake configure commands inside the heredoc instead of exporting the env var;
update references to use `verbose_cmake_flag` in the cmake invocation(s) so
CMake receives the `-DEXTRA_TESTING_FLAGS=-v` option at configure time.

In `@test/test_histogram.cpp`:
- Line 206: The test uses unsigned subtraction in the CHECK_EQUAL assertion
causing underflow when i < 4; change the index computation to perform signed
subtraction by casting i to int first (i.e., replace static_cast<int>(i - 4)
with static_cast<int>(i) - 4) so the comparison between output1[i] and
histogram[...] uses a proper signed index; update the CHECK_EQUAL line that
references output1, histogram, and i accordingly.

---

Outside diff comments:
In `@test/run-tests.sh`:
- Line 251: The test entry labeled "clang,No STL - Builtin mem functions"
incorrectly sets CMAKE_C_COMPILER and CMAKE_CXX_COMPILER to gcc/g++; update that
test invocation to use clang/clang++ (replace -DCMAKE_C_COMPILER=gcc
-DCMAKE_CXX_COMPILER=g++ with -DCMAKE_C_COMPILER=clang
-DCMAKE_CXX_COMPILER=clang++ in the command string) so the label matches the
compilers used and the clang variant actually runs with clang/clang++; ensure no
other flags are changed and keep -DETL_USE_BUILTIN_MEM_FUNCTIONS=ON intact.

---

Nitpick comments:
In @.devcontainer/armhf/Dockerfile:
- Around line 1-40: Add a non-root user in the Dockerfile by creating a new
user/group (e.g., etl) and home directory during the RUN steps, chowning the
WORKDIR (/workspaces/etl) to that user, setting ENV HOME appropriately, and then
switching context with the USER instruction before the CMD; update the existing
RUN that installs packages to also adduser/addgroup and chown the workspace so
subsequent commands and the default CMD run as the non-root user instead of
root.

In @.devcontainer/i386/Dockerfile:
- Line 10: The apt-get install line has the backslash directly adjacent to the
token "--no-install-recommends", causing a malformed line continuation; update
the Dockerfile line containing "apt-get update && apt-get install -y
--no-install-recommends\" to insert a single space before the trailing backslash
so the line continuation is separated from the option token.

In @.devcontainer/riscv64/Dockerfile:
- Line 10: The Dockerfile line with "apt-get update && apt-get install -y
--no-install-recommends\\" is missing a space before the line-continuation
backslash; update the line (in the .devcontainer riscv64 Dockerfile where that
apt-get install command appears) to ensure there is a space between
"--no-install-recommends" and the trailing backslash so the shell
line-continuation is correct and matches the i386 Dockerfile style.

In @.github/workflows/gcc-c++23-riscv64.yml:
- Line 46: The build invocation uses an unquoted command substitution in the
cmake build step: "cmake --build . -- -j $(getconf _NPROCESSORS_ONLN)"; update
this to quote the substitution (e.g., change to use "$(getconf
_NPROCESSORS_ONLN)") so the shell won’t perform word-splitting or globbing on
the result and Actionlint stops flagging the unquoted substitution.

In @.github/workflows/gcc-c++23-s390x.yml:
- Around line 23-24: Remove the unnecessary sudo prefixes from the apt commands
in the workflow: change "sudo apt-get update" to "apt-get update" and "sudo
apt-get install -y \" to "apt-get install -y \" (preserve indentation and the
line continuation backslash), since container jobs run as root and sudo is
redundant.

In `@include/etl/private/bitset_new.h`:
- Around line 1081-1082: The compile-time template overloads are still using
signed int template parameters (Msb_Element_Index and Element_Index) while
extract_from_multiple_elements now takes size_t, causing implicit sign
conversions; update the template parameter types in the compile-time overloads
(the templates that forward to extract_from_multiple_elements and are declared
with Msb_Element_Index and Element_Index) from int to size_t so the types match,
and ensure any related constexpr helper signatures and calls use size_t
consistently to eliminate the mismatch.

In `@test/run-tests.sh`:
- Around line 202-206: The loop parsing CSV fields uses legacy backticks and
lacks proper quoting; update the parsing lines in the while-read loop (the lines
that set CC, MSG, DIR, CMD) to use POSIX command substitution $(...) and
properly quote variable expansions (e.g., "$(echo "$i" | cut -d, -f1 | sed -e
's/ *$//')" etc.), or better yet split $i with IFS and read to avoid external
echo/cut/sed; ensure the while read i; do remains compatible by quoting
expansions when using $i and when assigning CC, MSG, DIR, CMD.
- Around line 214-217: The script does not handle failure of directory changes
(e.g., cd $DIR and cd build-make) so subsequent commands may run in the wrong
location; update the block around OLD_DIR, DIR and build-make to check each cd
return and exit with a non-zero status (or print an error and exit) on failure —
e.g., after cd $DIR and after cd build-make ensure you abort if the cd fails
(use conditional checks or append || { echo "error"; exit 1; }) so the script
never continues in the wrong directory.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 01189e0a-5938-4e90-a97f-e57668405783

📥 Commits

Reviewing files that changed from the base of the PR and between 912e22f and 8fc3e07.

📒 Files selected for processing (33)
  • .devcontainer/armhf/Dockerfile
  • .devcontainer/armhf/devcontainer.json
  • .devcontainer/armhf/toolchain-armhf.cmake
  • .devcontainer/i386/Dockerfile
  • .devcontainer/i386/devcontainer.json
  • .devcontainer/i386/toolchain-i386.cmake
  • .devcontainer/riscv64/Dockerfile
  • .devcontainer/riscv64/devcontainer.json
  • .devcontainer/riscv64/toolchain-riscv64.cmake
  • .devcontainer/run-tests.sh
  • .devcontainer/s390x/devcontainer.json
  • .github/workflows/gcc-c++23-armhf.yml
  • .github/workflows/gcc-c++23-i386.yml
  • .github/workflows/gcc-c++23-riscv64.yml
  • .github/workflows/gcc-c++23-s390x.yml
  • docs/generators.md
  • docs/testing.md
  • include/etl/algorithm.h
  • include/etl/bip_buffer_spsc_atomic.h
  • include/etl/ipool.h
  • include/etl/numeric.h
  • include/etl/private/bitset_new.h
  • include/etl/private/diagnostic_sign_conversion_push.h
  • include/etl/vector.h
  • test/CMakeLists.txt
  • test/run-tests.sh
  • test/test_bit_stream.cpp
  • test/test_bit_stream_writer_big_endian.cpp
  • test/test_bit_stream_writer_little_endian.cpp
  • test/test_byte_stream.cpp
  • test/test_format.cpp
  • test/test_histogram.cpp
  • test/test_set.cpp

Comment thread .devcontainer/run-tests.sh
Comment thread .github/workflows/gcc-c++23-armhf.yml Outdated
Comment thread .github/workflows/gcc-c++23-i386.yml Outdated
Comment thread .github/workflows/gcc-c++23-riscv64.yml Outdated
Comment thread test/CMakeLists.txt
Comment thread test/test_histogram.cpp Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (4)
include/etl/private/bitset_new.h (1)

1136-1137: Align compile-time extract_from_multiple_elements calls with size_t indices.

Lines 1189 and 1172 declare Msb_Element_Index and Element_Index as int, but the function signature at line 1081 expects size_t for the element-index parameter. This causes implicit sign-conversion when passed at lines 1194 and elsewhere. Update these declarations to use size_t to match the runtime path (line 1153) and avoid potential diagnostics.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@include/etl/private/bitset_new.h` around lines 1136 - 1137, The compile-time
callers of extract_from_multiple_elements use int-typed indices (Element_Index
and Msb_Element_Index) causing implicit signed-to-unsigned conversions; change
the declarations of Element_Index and Msb_Element_Index to size_t so they match
the extract_from_multiple_elements signature (which expects a size_t
element-index) and the runtime path that already uses size_t. Update the two
declarations that compute indexes via shifts against
etl::log2<Bits_Per_Element>::value to use size_t instead of int, ensuring all
calls to extract_from_multiple_elements pass size_t indices.
.devcontainer/armhf/Dockerfile (1)

3-3: Pin the base image by digest for reproducible CI.

Line [3] uses a floating tag (debian:trixie), which can silently change over time and destabilise cross-arch test runs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/armhf/Dockerfile at line 3, Replace the floating base image
reference "FROM debian:trixie" with a pinned digest form (e.g., "FROM
debian@sha256:...") so the build is reproducible; fetch the correct official
Debian trixie armhf image digest and update the Dockerfile line, then verify by
pulling the image and rebuilding CI to ensure the digest matches the intended
architecture.
.devcontainer/i386/Dockerfile (1)

3-3: Pin the base image digest to avoid drift.

Line [3] currently tracks a mutable tag (debian:trixie), which can make CI results non-reproducible over time.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/i386/Dockerfile at line 3, The Dockerfile currently uses a
mutable base image tag "FROM debian:trixie"; replace it with a digest-pinned
reference (the RepoDigest form like debian@sha256:<digest>) to ensure
reproducible builds: update the FROM line to the specific sha256 digest for the
desired trixie image (obtain the digest by pulling or inspecting the
debian:trixie image and using its RepoDigest) and commit that pinned reference
in place of "debian:trixie".
docs/testing.md (1)

70-72: Tighten sentence punctuation in list lead-ins for readability.

The lead-in sentences before numbered steps read slightly awkwardly; adding a small comma/flow polish would improve scanability.

Also applies to: 140-151

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/testing.md` around lines 70 - 72, The lead-in sentences are missing
commas and read awkwardly; update the phrases to improve flow—e.g., change "For
every selected C++ standard the script loops over a built-in list of
configurations (STL / No STL / Force C++03 / Non-virtual messages / …) for each
selected compiler. For every combination it:" to include commas like "For every
selected C++ standard, the script loops over a built-in list of configurations
(...) for each selected compiler. For every combination, it:" and apply the same
comma/flow fixes to the other affected block referenced ("Also applies to:
140-151") so the lead-ins before numbered steps consistently include the
necessary commas and read naturally.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.devcontainer/armhf/Dockerfile:
- Around line 39-40: Current Dockerfile leaves the container running as root
(ends with CMD ["/bin/bash"]); add a non-root runtime user by creating a
user/group (with a stable/non-zero UID/GID), set its home and shell, chown
necessary workspace/config directories to that user, and add a USER <username>
instruction before CMD so the container runs unprivileged; ensure the username
and any created home directory are referenced in those steps (e.g., in the
Dockerfile's user creation and chown lines) so runtime processes no longer run
as root.

In @.devcontainer/i386/Dockerfile:
- Around line 39-40: The Dockerfile currently ends with CMD ["/bin/bash"] and
lacks a USER instruction, so update the final image to run as a non-root user by
creating a dedicated user and group (e.g., appuser), setting a home directory,
adjusting ownership of any workspace/build directories, and adding USER appuser
before the final CMD; ensure the created user's UID/GID are non-zero and any
files the container needs at runtime are chowned to that user so the container
no longer runs as root.

In @.devcontainer/run-tests.sh:
- Around line 43-44: The docker run invocation in run-tests.sh uses a relative
bind mount "-v .:/workspaces/etl" which can break when the script is executed
from another directory; update the docker run command in run-tests.sh to use an
absolute, quoted host path (e.g. use $PWD or $(pwd -P)) for the bind mount
(replace "-v .:/workspaces/etl" with a quoted "-v \"$PWD\":/workspaces/etl") so
the container always mounts the correct project directory.

In @.github/workflows/gcc-c++23-s390x.yml:
- Around line 42-43: The CMake invocation currently sets
-DETL_FORCE_TEST_CPP03=OFF but the build expects
-DETL_FORCE_TEST_CPP03_IMPLEMENTATION; update all workflow CMake command lines
(the cmake invocation that includes -DETL_CXX_STANDARD=23) to replace
-DETL_FORCE_TEST_CPP03=OFF with -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=OFF so the
CMake cache variable referenced in test/CMakeLists.txt
(ETL_FORCE_TEST_CPP03_IMPLEMENTATION) is actually set; apply this change across
the indicated C++23 workflow files (e.g., the cmake line shown in
gcc-c++23-s390x.yml).

In `@docs/testing.md`:
- Line 75: Replace occurrences of the hyphenated term "sub-directory" with the
single-word "subdirectory" to ensure consistent technical prose; update both
instances referenced (the text containing "sub-directory" near Line 75 and the
other at Line 233) so the document uses "subdirectory" everywhere.

In `@include/etl/algorithm.h`:
- Line 561: The implementation of etl::fill uses a narrowing static_cast when
assigning to *first (the line with static_cast<typename
etl::iterator_traits<TIterator>::value_type>(value)), which is stricter than
fill_n and ranges::fill_fn and breaks valid code where *iterator = value is
allowed but constructing value_type(value) is not; change the assignment to
perform a direct assignment (*first = value) consistent with fill_n and
ranges::fill_fn (and std::fill) so the function relies on assignment semantics
rather than requiring static_cast constructibility.

In `@test/run-tests.sh`:
- Around line 183-189: The script sets verbose and verbose_cmake_flag from
argument 6 but always calls ctest with -V; change the ctest invocation to
respect the verbose setting by adding a ctest_verbose_flag (or reuse verbose)
and only include -V when verbose="On" (so use verbose/verbose_cmake_flag to
build the ctest command instead of unconditionally using -V), ensuring the
existing verbose_cmake_flag behavior is preserved.

---

Nitpick comments:
In @.devcontainer/armhf/Dockerfile:
- Line 3: Replace the floating base image reference "FROM debian:trixie" with a
pinned digest form (e.g., "FROM debian@sha256:...") so the build is
reproducible; fetch the correct official Debian trixie armhf image digest and
update the Dockerfile line, then verify by pulling the image and rebuilding CI
to ensure the digest matches the intended architecture.

In @.devcontainer/i386/Dockerfile:
- Line 3: The Dockerfile currently uses a mutable base image tag "FROM
debian:trixie"; replace it with a digest-pinned reference (the RepoDigest form
like debian@sha256:<digest>) to ensure reproducible builds: update the FROM line
to the specific sha256 digest for the desired trixie image (obtain the digest by
pulling or inspecting the debian:trixie image and using its RepoDigest) and
commit that pinned reference in place of "debian:trixie".

In `@docs/testing.md`:
- Around line 70-72: The lead-in sentences are missing commas and read
awkwardly; update the phrases to improve flow—e.g., change "For every selected
C++ standard the script loops over a built-in list of configurations (STL / No
STL / Force C++03 / Non-virtual messages / …) for each selected compiler. For
every combination it:" to include commas like "For every selected C++ standard,
the script loops over a built-in list of configurations (...) for each selected
compiler. For every combination, it:" and apply the same comma/flow fixes to the
other affected block referenced ("Also applies to: 140-151") so the lead-ins
before numbered steps consistently include the necessary commas and read
naturally.

In `@include/etl/private/bitset_new.h`:
- Around line 1136-1137: The compile-time callers of
extract_from_multiple_elements use int-typed indices (Element_Index and
Msb_Element_Index) causing implicit signed-to-unsigned conversions; change the
declarations of Element_Index and Msb_Element_Index to size_t so they match the
extract_from_multiple_elements signature (which expects a size_t element-index)
and the runtime path that already uses size_t. Update the two declarations that
compute indexes via shifts against etl::log2<Bits_Per_Element>::value to use
size_t instead of int, ensuring all calls to extract_from_multiple_elements pass
size_t indices.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 70818d0b-5aff-43fd-adfa-66d1a19cfe18

📥 Commits

Reviewing files that changed from the base of the PR and between 8fc3e07 and 7a40024.

📒 Files selected for processing (34)
  • .devcontainer/armhf/Dockerfile
  • .devcontainer/armhf/devcontainer.json
  • .devcontainer/armhf/toolchain-armhf.cmake
  • .devcontainer/i386/Dockerfile
  • .devcontainer/i386/devcontainer.json
  • .devcontainer/i386/toolchain-i386.cmake
  • .devcontainer/riscv64/Dockerfile
  • .devcontainer/riscv64/devcontainer.json
  • .devcontainer/riscv64/toolchain-riscv64.cmake
  • .devcontainer/run-tests.sh
  • .devcontainer/s390x/Dockerfile
  • .devcontainer/s390x/devcontainer.json
  • .github/workflows/gcc-c++23-armhf.yml
  • .github/workflows/gcc-c++23-i386.yml
  • .github/workflows/gcc-c++23-riscv64.yml
  • .github/workflows/gcc-c++23-s390x.yml
  • docs/generators.md
  • docs/testing.md
  • include/etl/algorithm.h
  • include/etl/bip_buffer_spsc_atomic.h
  • include/etl/ipool.h
  • include/etl/numeric.h
  • include/etl/private/bitset_new.h
  • include/etl/private/diagnostic_sign_conversion_push.h
  • include/etl/vector.h
  • test/CMakeLists.txt
  • test/run-tests.sh
  • test/test_bit_stream.cpp
  • test/test_bit_stream_writer_big_endian.cpp
  • test/test_bit_stream_writer_little_endian.cpp
  • test/test_byte_stream.cpp
  • test/test_format.cpp
  • test/test_histogram.cpp
  • test/test_set.cpp
✅ Files skipped from review due to trivial changes (17)
  • .devcontainer/s390x/devcontainer.json
  • .devcontainer/s390x/Dockerfile
  • test/test_bit_stream_writer_big_endian.cpp
  • test/test_byte_stream.cpp
  • include/etl/bip_buffer_spsc_atomic.h
  • test/test_bit_stream.cpp
  • .devcontainer/i386/devcontainer.json
  • test/test_set.cpp
  • test/test_histogram.cpp
  • include/etl/private/diagnostic_sign_conversion_push.h
  • test/test_bit_stream_writer_little_endian.cpp
  • .devcontainer/armhf/toolchain-armhf.cmake
  • .devcontainer/riscv64/devcontainer.json
  • .devcontainer/armhf/devcontainer.json
  • include/etl/vector.h
  • .devcontainer/riscv64/toolchain-riscv64.cmake
  • .devcontainer/i386/toolchain-i386.cmake
🚧 Files skipped from review as they are similar to previous changes (3)
  • test/CMakeLists.txt
  • include/etl/numeric.h
  • include/etl/ipool.h

Comment thread .devcontainer/armhf/Dockerfile
Comment thread .devcontainer/i386/Dockerfile
Comment thread .devcontainer/run-tests.sh Outdated
Comment thread .github/workflows/gcc-c++23-s390x.yml Outdated
Comment thread docs/testing.md Outdated
Comment thread include/etl/algorithm.h
Comment thread test/run-tests.sh

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
.github/workflows/clang-c++23.yml (1)

62-62: ⚠️ Potential issue | 🟠 Major

Inconsistent CMake variable name in Force C++03 jobs.

Lines 62, 91, 157, and 179 use -DETL_FORCE_TEST_CPP03=ON, but test/CMakeLists.txt defines ETL_FORCE_TEST_CPP03_IMPLEMENTATION. CMake will silently ignore the undefined variable, so the Force C++03 behaviour won't be enabled.

🐛 Proposed fix
# Lines 62, 91, 157, 179 - change all occurrences:
-        cmake ... -DETL_FORCE_TEST_CPP03=ON ...
+        cmake ... -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON ...

Also applies to: 91-91, 157-157, 179-179

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/clang-c++23.yml at line 62, The workflow uses the wrong
CMake variable name: replace every occurrence of -DETL_FORCE_TEST_CPP03=ON in
the CMake invocation(s) with -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON so the
flag defined in test/CMakeLists.txt is actually set; update the CMake command(s)
(the lines invoking cmake -D BUILD_TESTS=ON ... -DETL_FORCE_TEST_CPP03=ON ./) to
use -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON for the Force C++03 jobs.
.github/workflows/gcc-c++23.yml (1)

70-70: ⚠️ Potential issue | 🟠 Major

Inconsistent CMake variable name in Force C++03 jobs.

Lines 70 and 92 use -DETL_FORCE_TEST_CPP03=ON, but test/CMakeLists.txt defines and checks ETL_FORCE_TEST_CPP03_IMPLEMENTATION. CMake will silently ignore the undefined variable, so the Force C++03 behaviour won't actually be enabled.

🐛 Proposed fix
# Line 70
-        cmake -DBUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=ON -DETL_CXX_STANDARD=23 ./
+        cmake -DBUILD_TESTS=ON -DNO_STL=OFF -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON -DETL_CXX_STANDARD=23 ./

# Line 92
-        cmake -DBUILD_TESTS=ON -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03=ON -DETL_CXX_STANDARD=23 ./
+        cmake -DBUILD_TESTS=ON -DNO_STL=ON -DETL_USE_TYPE_TRAITS_BUILTINS=OFF -DETL_USER_DEFINED_TYPE_TRAITS=OFF -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON -DETL_CXX_STANDARD=23 ./

Also applies to: 92-92

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/gcc-c++23.yml at line 70, The CMake invocation is passing
the wrong variable name; replace the flag -DETL_FORCE_TEST_CPP03=ON with
-DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON in the cmake command invocations so the
test/CMakeLists.txt check sees the defined variable; update both cmake command
occurrences that currently pass ETL_FORCE_TEST_CPP03 to use
ETL_FORCE_TEST_CPP03_IMPLEMENTATION instead.
🧹 Nitpick comments (3)
test/run-tests.sh (2)

217-217: Add error handling for cd commands.

Shellcheck SC2164 warns that cd can fail silently. If the directory doesn't exist or is inaccessible, the script will continue in the wrong directory, potentially causing confusing failures.

♻️ Proposed fix
-      cd $DIR
+      cd "$DIR" || exit 1
...
-      cd $OLD_DIR
+      cd "$OLD_DIR" || exit 1

Also applies to: 240-240

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/run-tests.sh` at line 217, The script uses bare cd commands (e.g., cd
$DIR and other cd invocations) which can fail silently; update each cd to check
for errors and bail out or handle them (for example replace cd $DIR with cd
"$DIR" || { echo "Failed to cd to $DIR"; exit 1; } or similar), ensuring you
quote variables and apply the same pattern to the other cd occurrences mentioned
so the script stops or reports a clear error if directory change fails.

204-208: Consider modernising shell syntax.

Shellcheck flags several style issues: use $() instead of backticks (SC2006), add -r to read (SC2162), and quote variable expansions (SC2086). These are minor but improve robustness.

♻️ Proposed fix for one example
-  while read i ; do
-    CC=`echo $i | cut -d, -f1 | sed -e 's/ *$//'`
+  while read -r i ; do
+    CC=$(echo "$i" | cut -d, -f1 | sed -e 's/ *$//')
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/run-tests.sh` around lines 204 - 208, The loop that parses CSV fields
uses backticks, unquoted expansions, and plain read; update the while read to
use read -r (e.g. while read -r i) and replace all backtick usages with $(...)
(affecting the CC, MSG, DIR, CMD assignments), and quote variable expansions
(use "${i}" when passing into echo/cut/sed or, preferably, split once with
IFS=',' and read -r CC MSG DIR CMD to avoid multiple cut calls) while preserving
the trimming logic for each variable.
.github/workflows/gcc-c++23-s390x.yml (1)

46-46: Consider quoting the command substitution.

Shellcheck SC2046 warns about word splitting with $(getconf _NPROCESSORS_ONLN). While _NPROCESSORS_ONLN reliably returns a single integer, quoting is a defensive best practice.

♻️ Proposed fix
-        cmake --build . -- -j $(getconf _NPROCESSORS_ONLN)
+        cmake --build . -- -j "$(getconf _NPROCESSORS_ONLN)"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/gcc-c++23-s390x.yml at line 46, Update the cmake build
step that currently uses an unquoted command substitution (the line containing
"cmake --build . -- -j $(getconf _NPROCESSORS_ONLN)") by wrapping the command
substitution in double quotes so the result is quoted; this prevents potential
word-splitting issues flagged by ShellCheck SC2046 while keeping the same
semantics.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.devcontainer/run-tests.sh:
- Around line 57-59: Replace the direct emulator invocation (the line running
qemu-$QEMU_ARCH-static ./etl_tests) with a CTest-driven invocation so CMake’s
test integration and EXTRA_TESTING_FLAGS are respected; specifically, stop
calling etl_tests directly and run ctest (e.g., ctest --output-on-failure) from
the build/test directory so CTest picks up CMAKE_CROSSCOMPILING_EMULATOR from
the toolchain file and executes the etl_tests target through the test harness.

In `@docs/generators.md`:
- Around line 145-146: Update the docs/generators.md statement that claims
generator.yml runs scripts/generator_test.py: change it to accurately describe
the actual workflow (generator.yml) behavior by noting it executes the
repository generator (generate.bat / equivalent generate script) and then runs
git diff --exit-code to verify no uncommitted changes remain; reference the
workflow file name generator.yml, the incorrect mention
scripts/generator_test.py, the actual generate.bat invocation, and the git diff
--exit-code check so contributors understand the real verification step.

---

Outside diff comments:
In @.github/workflows/clang-c++23.yml:
- Line 62: The workflow uses the wrong CMake variable name: replace every
occurrence of -DETL_FORCE_TEST_CPP03=ON in the CMake invocation(s) with
-DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON so the flag defined in
test/CMakeLists.txt is actually set; update the CMake command(s) (the lines
invoking cmake -D BUILD_TESTS=ON ... -DETL_FORCE_TEST_CPP03=ON ./) to use
-DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON for the Force C++03 jobs.

In @.github/workflows/gcc-c++23.yml:
- Line 70: The CMake invocation is passing the wrong variable name; replace the
flag -DETL_FORCE_TEST_CPP03=ON with -DETL_FORCE_TEST_CPP03_IMPLEMENTATION=ON in
the cmake command invocations so the test/CMakeLists.txt check sees the defined
variable; update both cmake command occurrences that currently pass
ETL_FORCE_TEST_CPP03 to use ETL_FORCE_TEST_CPP03_IMPLEMENTATION instead.

---

Nitpick comments:
In @.github/workflows/gcc-c++23-s390x.yml:
- Line 46: Update the cmake build step that currently uses an unquoted command
substitution (the line containing "cmake --build . -- -j $(getconf
_NPROCESSORS_ONLN)") by wrapping the command substitution in double quotes so
the result is quoted; this prevents potential word-splitting issues flagged by
ShellCheck SC2046 while keeping the same semantics.

In `@test/run-tests.sh`:
- Line 217: The script uses bare cd commands (e.g., cd $DIR and other cd
invocations) which can fail silently; update each cd to check for errors and
bail out or handle them (for example replace cd $DIR with cd "$DIR" || { echo
"Failed to cd to $DIR"; exit 1; } or similar), ensuring you quote variables and
apply the same pattern to the other cd occurrences mentioned so the script stops
or reports a clear error if directory change fails.
- Around line 204-208: The loop that parses CSV fields uses backticks, unquoted
expansions, and plain read; update the while read to use read -r (e.g. while
read -r i) and replace all backtick usages with $(...) (affecting the CC, MSG,
DIR, CMD assignments), and quote variable expansions (use "${i}" when passing
into echo/cut/sed or, preferably, split once with IFS=',' and read -r CC MSG DIR
CMD to avoid multiple cut calls) while preserving the trimming logic for each
variable.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 74fd80fd-a3e2-43f8-adf1-70b42c3f5900

📥 Commits

Reviewing files that changed from the base of the PR and between 7a40024 and dbbfd94.

📒 Files selected for processing (36)
  • .devcontainer/armhf/Dockerfile
  • .devcontainer/armhf/devcontainer.json
  • .devcontainer/armhf/toolchain-armhf.cmake
  • .devcontainer/i386/Dockerfile
  • .devcontainer/i386/devcontainer.json
  • .devcontainer/i386/toolchain-i386.cmake
  • .devcontainer/riscv64/Dockerfile
  • .devcontainer/riscv64/devcontainer.json
  • .devcontainer/riscv64/toolchain-riscv64.cmake
  • .devcontainer/run-tests.sh
  • .devcontainer/s390x/Dockerfile
  • .devcontainer/s390x/devcontainer.json
  • .github/workflows/clang-c++23.yml
  • .github/workflows/gcc-c++23-armhf.yml
  • .github/workflows/gcc-c++23-i386.yml
  • .github/workflows/gcc-c++23-riscv64.yml
  • .github/workflows/gcc-c++23-s390x.yml
  • .github/workflows/gcc-c++23.yml
  • docs/generators.md
  • docs/testing.md
  • include/etl/algorithm.h
  • include/etl/bip_buffer_spsc_atomic.h
  • include/etl/ipool.h
  • include/etl/numeric.h
  • include/etl/private/bitset_new.h
  • include/etl/private/diagnostic_sign_conversion_push.h
  • include/etl/vector.h
  • test/CMakeLists.txt
  • test/run-tests.sh
  • test/test_bit_stream.cpp
  • test/test_bit_stream_writer_big_endian.cpp
  • test/test_bit_stream_writer_little_endian.cpp
  • test/test_byte_stream.cpp
  • test/test_format.cpp
  • test/test_histogram.cpp
  • test/test_set.cpp
✅ Files skipped from review due to trivial changes (21)
  • include/etl/ipool.h
  • .devcontainer/s390x/devcontainer.json
  • test/test_set.cpp
  • test/test_bit_stream.cpp
  • test/test_format.cpp
  • test/test_bit_stream_writer_big_endian.cpp
  • .devcontainer/armhf/toolchain-armhf.cmake
  • include/etl/bip_buffer_spsc_atomic.h
  • test/test_bit_stream_writer_little_endian.cpp
  • include/etl/private/diagnostic_sign_conversion_push.h
  • .devcontainer/i386/devcontainer.json
  • .devcontainer/armhf/devcontainer.json
  • test/test_histogram.cpp
  • .devcontainer/riscv64/devcontainer.json
  • include/etl/algorithm.h
  • .devcontainer/i386/Dockerfile
  • .devcontainer/armhf/Dockerfile
  • .devcontainer/riscv64/Dockerfile
  • .devcontainer/i386/toolchain-i386.cmake
  • .devcontainer/riscv64/toolchain-riscv64.cmake
  • test/test_byte_stream.cpp
🚧 Files skipped from review as they are similar to previous changes (3)
  • .devcontainer/s390x/Dockerfile
  • include/etl/numeric.h
  • include/etl/vector.h

Comment thread .devcontainer/run-tests.sh Outdated
Comment thread docs/generators.md

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (4)
test/run-tests.sh (1)

206-210: Consider modernising shell syntax for robustness.

Shellcheck flags several style/safety items: using legacy backticks instead of $(...) and unquoted variables that could cause word splitting with unusual directory names.

♻️ Suggested improvements
-  while read i ; do
-    CC=`echo $i | cut -d, -f1 | sed -e 's/ *$//'`
-    MSG=`echo $i | cut -d, -f2 | sed -e 's/ *$//'`
-    DIR=`echo $i | cut -d, -f3 | sed -e 's/ *$//'`
-    CMD=`echo $i | cut -d, -f4 | sed -e 's/ *$//'`
+  while read -r i ; do
+    CC=$(echo "$i" | cut -d, -f1 | sed -e 's/ *$//')
+    MSG=$(echo "$i" | cut -d, -f2 | sed -e 's/ *$//')
+    DIR=$(echo "$i" | cut -d, -f3 | sed -e 's/ *$//')
+    CMD=$(echo "$i" | cut -d, -f4 | sed -e 's/ *$//')
-      OLD_DIR=`pwd`
-      cd $DIR
+      OLD_DIR=$(pwd)
+      cd "$DIR"
-      cd $OLD_DIR
+      cd "$OLD_DIR"

Also applies to: 218-219, 240-240

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/run-tests.sh` around lines 206 - 210, In the while read loop that parses
CSV into CC, MSG, DIR, CMD, replace legacy backticks with modern command
substitution $(...) (e.g., use $(echo ...) and $(cut ...)), switch the loop to
read -r and set IFS=, to avoid word-splitting, and ensure all variable
expansions are quoted (use "$CC", "$MSG", "$DIR", "$CMD"); apply the same
changes to the other occurrences noted (the blocks handling the same parsing at
the other ranges) so trimming/whitespace handling is preserved while preventing
globbing and splitting issues.
.devcontainer/run-tests.sh (2)

21-37: QEMU_ARCH variable is unused.

The QEMU_ARCH variable is set for each architecture but never used. The script now correctly uses ctest --output-on-failure which relies on CMAKE_CROSSCOMPILING_EMULATOR from the toolchain file. Consider removing the unused variable assignments to avoid confusion.

♻️ Suggested fix
 if [ "$1" = "armhf" ] ; then
   ARCH=armhf
-  QEMU_ARCH=arm
 elif [ "$1" = "i386" ] ; then
   ARCH=i386
-  QEMU_ARCH=i386
 elif [ "$1" = "riscv64" ] ; then
   ARCH=riscv64
-  QEMU_ARCH=riscv64
 elif [ "$1" = "s390x" ] ; then
   ARCH=s390x
-  QEMU_ARCH=s390x
 else
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/run-tests.sh around lines 21 - 37, The script sets a QEMU_ARCH
variable in the architecture detection block (branches that assign QEMU_ARCH
alongside ARCH) but never uses it; remove all QEMU_ARCH assignments from the
if/elif/else branch (keep the ARCH assignments and the Unsupported architecture
handling/usage call) so the script only sets ARCH and does not define the unused
QEMU_ARCH symbol, cleaning up the variables in the architecture detection logic.

54-54: Separate declaration and assignment to avoid masking errors.

If nproc fails, the error code is masked by the export statement. This makes debugging harder if the command fails unexpectedly.

♻️ Suggested fix
-  export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)
+  CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)
+  export CMAKE_BUILD_PARALLEL_LEVEL
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/run-tests.sh at line 54, Split the combined export/assignment
so the call to nproc is executed and verified before exporting: assign the
result of `nproc` to the variable `CMAKE_BUILD_PARALLEL_LEVEL`, check for
failure (or fall back to a safe default) if `nproc` fails, then run `export
CMAKE_BUILD_PARALLEL_LEVEL`; this ensures `nproc` errors aren’t masked by the
`export` statement.
.github/workflows/gcc-c++23-riscv64.yml (1)

46-46: Consider quoting command substitution.

Shellcheck flags that $(getconf _NPROCESSORS_ONLN) should be quoted to prevent word splitting. While the output is always a number, quoting is a defensive best practice.

-        cmake --build . -- -j $(getconf _NPROCESSORS_ONLN)
+        cmake --build . -- -j "$(getconf _NPROCESSORS_ONLN)"

This applies to all four cross-architecture workflows (armhf, i386, riscv64, s390x).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/gcc-c++23-riscv64.yml at line 46, The shell command using
command substitution in the build step (the line with cmake --build . -- -j
$(getconf _NPROCESSORS_ONLN)) should quote the substitution to prevent
word-splitting; update it to use "$(getconf _NPROCESSORS_ONLN)" in that workflow
file and make the same change in the other cross-architecture workflow files
(armhf, i386, riscv64, s390x) so all occurrences of getconf _NPROCESSORS_ONLN
are quoted.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/testing.md`:
- Around line 198-207: Update the docs to accurately reflect that the test
runner uses CTest rather than invoking the binary directly: change the sentence
that says it runs `qemu-<qemu_arch>-static ./etl_tests` to state that
`.devcontainer/run-tests.sh` runs `ctest --output-on-failure`, which relies on
the toolchain file (`.devcontainer/<arch>/toolchain-<arch>.cmake`) setting
CMAKE_CROSSCOMPILING_EMULATOR so the `etl_tests` binary is executed under QEMU
transparently; reference the `.devcontainer/run-tests.sh`, `ctest
--output-on-failure`, `CMAKE_CROSSCOMPILING_EMULATOR`, and the
`toolchain-<arch>.cmake` names in the updated text.

---

Nitpick comments:
In @.devcontainer/run-tests.sh:
- Around line 21-37: The script sets a QEMU_ARCH variable in the architecture
detection block (branches that assign QEMU_ARCH alongside ARCH) but never uses
it; remove all QEMU_ARCH assignments from the if/elif/else branch (keep the ARCH
assignments and the Unsupported architecture handling/usage call) so the script
only sets ARCH and does not define the unused QEMU_ARCH symbol, cleaning up the
variables in the architecture detection logic.
- Line 54: Split the combined export/assignment so the call to nproc is executed
and verified before exporting: assign the result of `nproc` to the variable
`CMAKE_BUILD_PARALLEL_LEVEL`, check for failure (or fall back to a safe default)
if `nproc` fails, then run `export CMAKE_BUILD_PARALLEL_LEVEL`; this ensures
`nproc` errors aren’t masked by the `export` statement.

In @.github/workflows/gcc-c++23-riscv64.yml:
- Line 46: The shell command using command substitution in the build step (the
line with cmake --build . -- -j $(getconf _NPROCESSORS_ONLN)) should quote the
substitution to prevent word-splitting; update it to use "$(getconf
_NPROCESSORS_ONLN)" in that workflow file and make the same change in the other
cross-architecture workflow files (armhf, i386, riscv64, s390x) so all
occurrences of getconf _NPROCESSORS_ONLN are quoted.

In `@test/run-tests.sh`:
- Around line 206-210: In the while read loop that parses CSV into CC, MSG, DIR,
CMD, replace legacy backticks with modern command substitution $(...) (e.g., use
$(echo ...) and $(cut ...)), switch the loop to read -r and set IFS=, to avoid
word-splitting, and ensure all variable expansions are quoted (use "$CC",
"$MSG", "$DIR", "$CMD"); apply the same changes to the other occurrences noted
(the blocks handling the same parsing at the other ranges) so
trimming/whitespace handling is preserved while preventing globbing and
splitting issues.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d54dbd11-7ca0-41b6-baf6-65b47ce867ad

📥 Commits

Reviewing files that changed from the base of the PR and between dbbfd94 and 0bd865d.

📒 Files selected for processing (36)
  • .devcontainer/armhf/Dockerfile
  • .devcontainer/armhf/devcontainer.json
  • .devcontainer/armhf/toolchain-armhf.cmake
  • .devcontainer/i386/Dockerfile
  • .devcontainer/i386/devcontainer.json
  • .devcontainer/i386/toolchain-i386.cmake
  • .devcontainer/riscv64/Dockerfile
  • .devcontainer/riscv64/devcontainer.json
  • .devcontainer/riscv64/toolchain-riscv64.cmake
  • .devcontainer/run-tests.sh
  • .devcontainer/s390x/Dockerfile
  • .devcontainer/s390x/devcontainer.json
  • .github/workflows/clang-c++23.yml
  • .github/workflows/gcc-c++23-armhf.yml
  • .github/workflows/gcc-c++23-i386.yml
  • .github/workflows/gcc-c++23-riscv64.yml
  • .github/workflows/gcc-c++23-s390x.yml
  • .github/workflows/gcc-c++23.yml
  • docs/generators.md
  • docs/testing.md
  • include/etl/algorithm.h
  • include/etl/bip_buffer_spsc_atomic.h
  • include/etl/ipool.h
  • include/etl/numeric.h
  • include/etl/private/bitset_new.h
  • include/etl/private/diagnostic_sign_conversion_push.h
  • include/etl/vector.h
  • test/CMakeLists.txt
  • test/run-tests.sh
  • test/test_bit_stream.cpp
  • test/test_bit_stream_writer_big_endian.cpp
  • test/test_bit_stream_writer_little_endian.cpp
  • test/test_byte_stream.cpp
  • test/test_format.cpp
  • test/test_histogram.cpp
  • test/test_set.cpp
✅ Files skipped from review due to trivial changes (21)
  • .devcontainer/s390x/devcontainer.json
  • test/CMakeLists.txt
  • include/etl/ipool.h
  • test/test_bit_stream.cpp
  • test/test_byte_stream.cpp
  • test/test_histogram.cpp
  • test/test_format.cpp
  • .github/workflows/gcc-c++23.yml
  • include/etl/bip_buffer_spsc_atomic.h
  • include/etl/private/diagnostic_sign_conversion_push.h
  • test/test_bit_stream_writer_little_endian.cpp
  • .devcontainer/i386/devcontainer.json
  • include/etl/algorithm.h
  • .devcontainer/armhf/devcontainer.json
  • .devcontainer/riscv64/Dockerfile
  • .devcontainer/armhf/toolchain-armhf.cmake
  • .devcontainer/armhf/Dockerfile
  • include/etl/vector.h
  • .devcontainer/i386/toolchain-i386.cmake
  • test/test_bit_stream_writer_big_endian.cpp
  • .devcontainer/i386/Dockerfile
🚧 Files skipped from review as they are similar to previous changes (7)
  • .github/workflows/clang-c++23.yml
  • .devcontainer/s390x/Dockerfile
  • test/test_set.cpp
  • include/etl/private/bitset_new.h
  • include/etl/numeric.h
  • .devcontainer/riscv64/devcontainer.json
  • .devcontainer/riscv64/toolchain-riscv64.cmake

Comment thread docs/testing.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
.devcontainer/run-tests.sh (1)

50-50: Consider separating declaration and assignment.

Shellcheck SC2155 warns that combining export with command substitution can mask non-zero exit codes from nproc. While unlikely to fail in practice, separating the assignment would surface any issues.

♻️ Optional: separate declaration and assignment
-  export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)
+  CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)
+  export CMAKE_BUILD_PARALLEL_LEVEL
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.devcontainer/run-tests.sh at line 50, The export combines declaration with
command substitution (export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)), which can
mask non-zero exit codes (SC2155); change it to first declare/export the
variable name (export CMAKE_BUILD_PARALLEL_LEVEL) and then assign the result of
nproc to CMAKE_BUILD_PARALLEL_LEVEL with a separate command
(CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)), optionally checking the exit status of
nproc and handling errors before continuing.
test/run-tests.sh (1)

206-210: Consider modernising shell syntax for robustness.

The heredoc parsing uses legacy backticks and unquoted variables. While functional, Shellcheck flags these patterns (SC2006, SC2086, SC2162). This is low priority as the existing code uses these conventions, but quoting $i and using $(...) would improve robustness against filenames/values with spaces or special characters.

♻️ Optional: modernise shell syntax
-for cxx_standard in $cxx_standards ; do
-  while read i ; do
-    CC=`echo $i | cut -d, -f1 | sed -e 's/ *$//'`
-    MSG=`echo $i | cut -d, -f2 | sed -e 's/ *$//'`
-    DIR=`echo $i | cut -d, -f3 | sed -e 's/ *$//'`
-    CMD=`echo $i | cut -d, -f4 | sed -e 's/ *$//'`
+for cxx_standard in $cxx_standards ; do
+  while read -r i ; do
+    CC=$(echo "$i" | cut -d, -f1 | sed -e 's/ *$//')
+    MSG=$(echo "$i" | cut -d, -f2 | sed -e 's/ *$//')
+    DIR=$(echo "$i" | cut -d, -f3 | sed -e 's/ *$//')
+    CMD=$(echo "$i" | cut -d, -f4 | sed -e 's/ *$//')
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/run-tests.sh` around lines 206 - 210, The loop parsing a CSV line
currently uses backticks and unquoted $i to populate CC, MSG, DIR, CMD; replace
legacy backticks with $(...) and ensure the input is quoted to avoid
word-splitting (e.g. use quoted "$i"), or better: use a safe read with IFS=','
and read -r to split into variables (read -r CC MSG DIR CMD <<< "$i" or read -r
-d '' ...), updating the assignments that set CC, MSG, DIR, CMD so they use
$(...) and quoted expansions to handle spaces/special characters robustly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In @.devcontainer/run-tests.sh:
- Line 50: The export combines declaration with command substitution (export
CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)), which can mask non-zero exit codes
(SC2155); change it to first declare/export the variable name (export
CMAKE_BUILD_PARALLEL_LEVEL) and then assign the result of nproc to
CMAKE_BUILD_PARALLEL_LEVEL with a separate command
(CMAKE_BUILD_PARALLEL_LEVEL=$(nproc)), optionally checking the exit status of
nproc and handling errors before continuing.

In `@test/run-tests.sh`:
- Around line 206-210: The loop parsing a CSV line currently uses backticks and
unquoted $i to populate CC, MSG, DIR, CMD; replace legacy backticks with $(...)
and ensure the input is quoted to avoid word-splitting (e.g. use quoted "$i"),
or better: use a safe read with IFS=',' and read -r to split into variables
(read -r CC MSG DIR CMD <<< "$i" or read -r -d '' ...), updating the assignments
that set CC, MSG, DIR, CMD so they use $(...) and quoted expansions to handle
spaces/special characters robustly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 1ca2acba-8c52-4cce-b178-ad28110bc5b5

📥 Commits

Reviewing files that changed from the base of the PR and between 0bd865d and 536e24f.

📒 Files selected for processing (36)
  • .devcontainer/armhf/Dockerfile
  • .devcontainer/armhf/devcontainer.json
  • .devcontainer/armhf/toolchain-armhf.cmake
  • .devcontainer/i386/Dockerfile
  • .devcontainer/i386/devcontainer.json
  • .devcontainer/i386/toolchain-i386.cmake
  • .devcontainer/riscv64/Dockerfile
  • .devcontainer/riscv64/devcontainer.json
  • .devcontainer/riscv64/toolchain-riscv64.cmake
  • .devcontainer/run-tests.sh
  • .devcontainer/s390x/Dockerfile
  • .devcontainer/s390x/devcontainer.json
  • .github/workflows/clang-c++23.yml
  • .github/workflows/gcc-c++23-armhf.yml
  • .github/workflows/gcc-c++23-i386.yml
  • .github/workflows/gcc-c++23-riscv64.yml
  • .github/workflows/gcc-c++23-s390x.yml
  • .github/workflows/gcc-c++23.yml
  • docs/generators.md
  • docs/testing.md
  • include/etl/algorithm.h
  • include/etl/bip_buffer_spsc_atomic.h
  • include/etl/ipool.h
  • include/etl/numeric.h
  • include/etl/private/bitset_new.h
  • include/etl/private/diagnostic_sign_conversion_push.h
  • include/etl/vector.h
  • test/CMakeLists.txt
  • test/run-tests.sh
  • test/test_bit_stream.cpp
  • test/test_bit_stream_writer_big_endian.cpp
  • test/test_bit_stream_writer_little_endian.cpp
  • test/test_byte_stream.cpp
  • test/test_format.cpp
  • test/test_histogram.cpp
  • test/test_set.cpp
✅ Files skipped from review due to trivial changes (26)
  • .devcontainer/s390x/devcontainer.json
  • include/etl/bip_buffer_spsc_atomic.h
  • test/CMakeLists.txt
  • test/test_bit_stream_writer_little_endian.cpp
  • test/test_bit_stream.cpp
  • test/test_set.cpp
  • test/test_bit_stream_writer_big_endian.cpp
  • include/etl/private/diagnostic_sign_conversion_push.h
  • test/test_byte_stream.cpp
  • test/test_histogram.cpp
  • .devcontainer/armhf/toolchain-armhf.cmake
  • .github/workflows/gcc-c++23.yml
  • .devcontainer/i386/devcontainer.json
  • .devcontainer/riscv64/devcontainer.json
  • .devcontainer/armhf/devcontainer.json
  • include/etl/private/bitset_new.h
  • .github/workflows/gcc-c++23-armhf.yml
  • .devcontainer/i386/Dockerfile
  • .github/workflows/gcc-c++23-riscv64.yml
  • .devcontainer/armhf/Dockerfile
  • .github/workflows/gcc-c++23-i386.yml
  • .devcontainer/riscv64/Dockerfile
  • .github/workflows/gcc-c++23-s390x.yml
  • .devcontainer/i386/toolchain-i386.cmake
  • include/etl/algorithm.h
  • .devcontainer/riscv64/toolchain-riscv64.cmake
🚧 Files skipped from review as they are similar to previous changes (3)
  • test/test_format.cpp
  • .github/workflows/clang-c++23.yml
  • include/etl/vector.h

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.
rolandreichweinbmw and others added 3 commits April 10, 2026 11:42
…nctions

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

@christophruethingbmw christophruethingbmw left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me overall and really improves testing on non-x64 plaforms.

}
}
},
"remoteUser": "root"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As far as I can see below, you have created a non-root user in the image, is there a reason we still run it with root here (assuming the remoteUser option here specifies the user to use when connecting to the running container)?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I took over the originally contributed devcontainer.json by @tzijnge . Not sure about the consequences of changing remoteUser now in the respective environments. E.g. in github workspaces: Do they need root permissions, e.g. to install via apt?

Comment thread .github/workflows/gcc-c++23.yml
Comment thread .github/workflows/gcc-c++23-armhf.yml Outdated
Synchronizes environment setup for github workflows to what is
defined in the development Dockerfiles. So they don't need to
be maintained separately.
@rolandreichweinbmw
rolandreichweinbmw merged commit 866c8a3 into ETLCPP:development Apr 15, 2026
89 checks passed
jwellbelove pushed a commit that referenced this pull request Jun 24, 2026
commit e6a7642121b4bd34ee96e0edce26f4c071bfe495
Author: Drew Rife <darife@jlg.com>
Date:   Wed Jun 24 11:51:02 2026 -0400

    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>

commit 05010aebf8107413097f599bb931cdcbc9d3f5c9
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Jun 24 14:39:06 2026 +0200

    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

commit 1d5e9ea67f3b14238d473cc613c52f03a9475b52
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Jun 24 13:37:46 2026 +0200

    Remove file writing tests for etl::random (#1474)

    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.

commit 5e5012c62c0467e73217ed59636d716761662237
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Jun 24 11:27:53 2026 +0200

    Format user defined types in format.h (#1470)

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 8f4373e5554cdfda488b4a7048bf9661bedb8e28
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date:   Tue Jun 23 18:12:58 2026 +0100

    Documentation updates (#1469)

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>

commit d598337107fadd60ded4eb967d596e9cb362386e
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Jun 23 19:11:17 2026 +0200

    Fix code examples in documentation (#1471)

commit 4e11bc9d54a733c655beeb1f19d48c32a268c5dc
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date:   Tue Jun 23 18:04:26 2026 +0100

    SFTP the documentation to the website on push to master (#1468)

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Workflow for deploying documentation

    * Removed mention of 'SCP'

    * Added final newline

    * Removed old script

    * Test alternative 'copy docs to website' job.

    * Updated to burnett01/rsync-deployments@8.0.5 as 7.0.2 is deprecated

    * Removed test branch from the 'push' list

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>

commit 2dabc42cbb7b320d3972b38d061c4bd50f5b5b23
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date:   Sat Jun 20 10:27:20 2026 +0100

    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>

commit 55429eddd2ca155bb7016e7e2e2bf76a3ebe13b6
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date:   Sat Jun 20 10:26:03 2026 +0100

    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>

commit 04b7004110a2a916d85c69a03c22c36f0a44990d
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sat Jun 20 10:57:06 2026 +0200

    Add emplace() to etl::map and further containers (#1462)

commit 6df8842a210a57fc6cedb6e545dd463aaab460ab
Author: Timon Zijnge <47081647+tzijnge@users.noreply.github.com>
Date:   Thu Jun 18 12:29:38 2026 +0200

    #1461 Invalid version detected with CMake FetchContent from URL (#1465)

    * Bold project documentation link in README

    * #1461 Invalid version detected when used with CMake FetchContent from URL
    * Reject a .git dir that belongs to a parent project, e.g. when fetched as a URL tarball with no .git of its own
    * Update documentation on including ETL in another project with CMake's FetchContent

    ---------

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>
    Co-authored-by: tzijnge <someone@somewhere.com>

commit c6d17b3a8d55c1bc8989a99e28f29dfad4a88685
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date:   Thu Jun 18 10:35:20 2026 +0100

    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>

commit c32f9cc862e4f3762e96895f78f890001eac00f2
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Jun 17 13:31:53 2026 +0200

    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.

commit 20cab3225691a9782f422ad1ad132f3f8ce5cf8a
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sat Jun 13 11:00:39 2026 +0200

     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>

commit 6d9ed143b28a72170e94b5e6a3cee278ef3d62dc
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Fri Jun 12 09:04:24 2026 +0200

    Add etl::infinite_loop (#1458)

commit 4f9618d8df434b9d9768965925f4d231755b5aec
Author: Christoph Rüthing <christoph.cr.ruething@bmw.de>
Date:   Mon Jun 8 16:23:35 2026 +0200

    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>

commit 1ca5bb012fd155ac0d3ddfaafeeba5578059c9a2
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date:   Mon Jun 8 14:16:52 2026 +0100

    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>

commit 9b56ffe676f5e9b3c5056745778049800ac33c8a
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Jun 8 11:16:22 2026 +0100

    Fix: rename docs/Messaging to docs/messaging

commit b969b2c46c28b871db76f2c9ee6c8e27abb83427
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Jun 8 11:16:02 2026 +0100

    Rename step 1

commit b3ade470b0c7d013137ad88400b7ade30d53a176
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Jun 8 11:05:31 2026 +0100

    Fix: rename docs/Messaging to docs/messaging

commit 9907ab3b684a7c617525e1df198c1fae00522e62
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Jun 8 11:04:58 2026 +0100

    Rename step 1

commit 12792e418f7f6e08f8bb4d9dd24eafe6c5730c21
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Jun 8 10:42:41 2026 +0100

    Fix: rename docs/Messaging to docs/messaging

commit f383184b0e6b3e7b3737fa37da1a16cf4e15b982
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Jun 8 10:42:10 2026 +0100

    Rename step 1

commit eed3d0b7b00a5be6222e663550d14fa66af96f45
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date:   Mon Jun 8 08:58:47 2026 +0100

    Hotfix/documentation updates (#1456)

    * message_router and fsm documentation corrections

    * message_router and fsm documentation corrections

    * message_router and fsm documentation corrections

    * Delete docs/Messaging/message-router.md

    The folder is no longer valid.

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>

commit 4a88884b3972aad9495713ec9902323c1986ab9c
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date:   Sat Jun 6 13:12:44 2026 +0100

    Issue/add hugo support for documentation (#1449)

    * 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>

commit 42a21a92e86908267022230ade61ced8224c982b
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Thu Jun 4 23:34:59 2026 +0200

    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.

commit e379c1354383dc937df10ddf2e7d4463a27114b0
Merge: 7e782b85 2d7ddb05
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Jun 1 11:34:59 2026 +0100

    Merge branch 'serges147/master' into development

    # Conflicts:
    #	include/etl/intrusive_avl_tree.h

commit 7e782b850db1dd4de78dc1dc8522fac19daeaaa2
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Jun 1 11:32:10 2026 +0100

    Added documentation deploy action to www.etlcpp.com

commit 8a782cc7f121b9c60db59b325a0802c1f14191d8
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sun May 31 20:32:38 2026 +0200

     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.

commit e3fad3c908ddbbb0838820ab178415589f5d2dc2
Author: Sergei <sergej.shirokov@gmail.com>
Date:   Sun May 31 11:49:55 2026 +0300

    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>

commit af3944acdbb0ee05245f973056d77a536c2ce1ec
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue May 26 10:11:24 2026 +0200

    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.

commit 9765cbf7643ea2f49e16441847296bba7aab2aa0
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue May 26 05:19:42 2026 +0200

    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.

commit 41174ed7f6eedc0be4bbfdebc021453af7785df7
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue May 26 05:18:27 2026 +0200

    Add missing constexpr to intrusive_links.h constructors (#1446)

commit 6bb9841dae6b8101a936b885c9577b9dfde88224
Author: SamHalvoe <46531812+SamHalvoe@users.noreply.github.com>
Date:   Mon May 25 21:47:34 2026 +0200

    added Pico and additional Teensy defines (#1444)

    * Print test names at test time (#1343)

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

    * added Pico and additional Teensy defines

    * fix format

    ---------

    Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
    Co-authored-by: SamHalvoe <SamHalvoe@users.noreply.github.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 652034603b060e1af990a61b5266d5876da21fe4
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Mon May 18 09:01:17 2026 +0200

    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>

commit 373247e5c15e4342502848fd2175decbafc58895
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Mon May 18 08:14:26 2026 +0200

    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.

commit eba472fa3a69471d7366dfdb694361f36899a580
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue May 12 21:02:32 2026 +0200

    Simplify and fix test/run-syntax-checks.sh (#1432)

commit 57d386769472f99ea4f63e2573ef9de0cad27f72
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sat May 9 10:29:18 2026 +0200

    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>

commit f6f145c5e5ecdd43789df510d4fe8b5c7c9ac3e1
Author: Sergei <sergej.shirokov@gmail.com>
Date:   Fri May 8 11:33:21 2026 +0300

    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>

commit 079b3345d9f2e0b6048e40e9e0735dcef119ec04
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed May 6 19:26:10 2026 +0200

    Various bugfixes (#1428)

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit c9198d089c96e66f0547e9b91914d62d8e43838f
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed May 6 11:16:20 2026 +0200

    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

commit a5d279d5e450732af3a7a23c35f7ed648d419ad3
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed May 6 11:13:02 2026 +0200

    Fix sanitizer use (#1429)

    * Fix sanitizer use

    A case issue prevented adding sanitizer in the tests.

    * Fix compiler warnings from actual sanitizer use

commit fe17d32e9bcbfabcb25cc4d00a810bcd8527e8c4
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed May 6 11:10:14 2026 +0200

    Fix meson build (#1431)

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit e8206cca83d2525bc054507d0efc218dfe6d951d
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed May 6 10:10:10 2026 +0200

    Remove unnecessary includes (#1434)

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit fdfd17a1c2d7259ed5c9093b354fe5fd31fad92b
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Wed Apr 8 15:30:53 2026 +0100

    Added missing format and print headers from VS2022 project

commit 4f411c66a92298bb4dfd1ab6b1d02d97af8453bb
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sun May 3 22:49:02 2026 +0200

    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.

commit 2d7ddb056cab70dd3d04bb01e9f85681db63af80
Author: Sergei Shirokov <sergej.shirokov@gmail.com>
Date:   Sat May 2 17:25:23 2026 +0300

    PR review minor fixes.

commit 1ea8473fe149c946a9bb4de8d668ce1b03c81177
Author: Sergei Shirokov <sergej.shirokov@gmail.com>
Date:   Fri Feb 6 18:08:11 2026 +0200

    Added etl::intrusive_avl_tree class.

commit b9b36d81557bb256292935780a5d34f1de060e57
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Thu Apr 30 12:30:01 2026 +0200

    Add bazel support (#1420)

    * Add bazel support

    * Add github workflow for bazel

commit a2e274bbc5cfd4220f6899307473ff80756420d7
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Thu Apr 30 12:27:12 2026 +0200

    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.

commit d1fe2938e196df4668d0c59888b4ec7a36f39c2f
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 29 10:11:02 2026 +0200

    Remove unused reinstall-cmake.sh (#1422)

    * Print test names at test time (#1343)

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

    * Remove unused reinstall-cmake.sh

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit a1cd6a5569afab04439a5c0e20b4786fb1a04bec
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 29 09:33:56 2026 +0200

    Activate -O3 in CI builds for C++23 (#1415)

    * Activate -O3 in CI builds for C++23

    For good coverage of potential warnings triggered by -O3, activate
    it for:

    * .github/workflows/clang-c++23.yml
    * .github/workflows/gcc-c++23.yml

    So additionally necessary CPU resources are limited.

    * Use Ubuntu-24.04 to test C++23

    ---------

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 943e8e60891aacf37e0dfd29badaf44b50ccaba2
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Apr 28 15:35:21 2026 +0200

    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>

commit 15ca12649e9273f6243cf69183038b4fff63fa38
Author: Joris Putcuyps <joris.putcuyps@gmail.com>
Date:   Tue Apr 28 14:13:55 2026 +0200

    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>

commit ee0d4740b3a27aaefbcd6b8e6960080202836d4b
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Apr 28 11:43:54 2026 +0200

    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>

commit fe7b2da10cabfad4aa2f0808b36fc6c60224301b
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Apr 28 11:03:25 2026 +0200

    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>

commit 5ccbc6fbff06f523c44fbc563681a0a9fe28a93f
Author: Joris Putcuyps <joris.putcuyps@gmail.com>
Date:   Tue Apr 28 10:23:52 2026 +0200

    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>

commit ff772d4bd15ede7574088ac8e844ed509ef1f8aa
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Apr 28 09:57:21 2026 +0200

    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>

commit 43e97b7f3cdcb0aefbeff4934ab746b9594941c9
Author: Joris Putcuyps <joris.putcuyps@gmail.com>
Date:   Tue Apr 28 09:30:23 2026 +0200

    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>

commit b96c2a9ecd5e38d946af21d4e990ee87e817d87a
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Mon Apr 27 22:49:39 2026 +0200

    Consolidate Dockerfile non-root user to vscode (#1417)

    Previously, we had differently named default users in the
    containers.

commit fbd738db691c41804cee60ffe87e5f94528c3fa3
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 22 13:28:47 2026 +0200

    Replace deprecated builtin __is_trivially_relocatable if possible (#1402)

    Fixes: #1400

commit a97817010ec436327e3b28110f7e9f40823e02c2
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 22 12:37:53 2026 +0200

    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>

commit 2b1dec0e7976b2d6cdaae42853e01abd3b45f7ef
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 22 11:31:51 2026 +0200

    Run generator_test.py in CI checks (#1376)

    * Print test names at test time (#1343)

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

    * Run generator_test.py in CI checks

    * Remove running generator.bat in CI checks

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit b860326b267832dc5b21e853f9bb4948b92d7dc4
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Apr 21 15:27:43 2026 +0200

    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.

commit bbf74c5334ed6812f50b9f674b4b7e15bc8e36d9
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sun Apr 19 13:19:53 2026 +0200

    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

commit ff65c753d6a7218e296c49e007af38424236a535
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sat Apr 18 17:13:43 2026 +0200

    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>

commit 5dc682b7ffec0fad9285b9ec6f0967019386d4ee
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 15 15:53:29 2026 +0200

    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

commit f858b8a72ddff1f16d6481f543bc4ccf8e177bbb
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 15 11:27:57 2026 +0200

    Add installed dependencies for docker, documentation (#1377)

    * Add development tools to docker image

    python3-cogapp, clang-format, treefmt

    Add script to run development environment in docker container

    Document docker use in docs/docker.md

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 866c8a315ed87c1319f96fa31bfeccd0c4728ab9
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 15 10:47:52 2026 +0200

    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>

commit 17799452d26f4dd534974aac54c5e441896becb1
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 15 10:09:28 2026 +0200

    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>

commit 29d0cfec7cdc14481a9cced4bcf7dc661398af55
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Apr 14 12:38:59 2026 +0200

    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>

commit f258fe4af8672d50baece68288f827f60d653514
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Apr 14 11:56:05 2026 +0200

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

commit 3e4d41ca57de475f4b769320308e80a103c8f5d6
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Apr 14 11:56:05 2026 +0200

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

commit b14f70698f5ff309bfc49e25f96fd95beaaf0320
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Apr 14 11:48:03 2026 +0200

    Fix chrono.h year_month_weekday_last and year_month_weekday sysdays() (#1396)

    * Print test names at test time (#1343)

    * Fix chrono.h year_month_weekday_last and year_month_weekday sysdays()

    Bug 1: year_month_weekday_last::operator sys_days() — wrong weekday construction

    The code was constructing a weekday from a raw day count using weekday(unsigned),
    which treats the value as a weekday encoding (0–6). The fix uses weekday(sys_days),
    which correctly accounts for the epoch being a Thursday (+4 offset).

    Bug 2: year_month_weekday::operator sys_days() — same wrong weekday
    construction + off-by-one in day_of_month

    Same weekday(unsigned) vs weekday(sys_days) issue. Additionally, the day_of_month
    calculation was missing the 1 + base — it computed a 0-based offset from day 1,
    but forgot to add the 1 back when converting to an actual day number.

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit beeb4cf462b748cb890fd4b9abff75bb0a981ede
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sat Apr 11 10:38:39 2026 +0200

    Fix coverage workflow for action version (#1384)

    * Print test names at test time (#1343)

    * Fix coverage workflow for action version

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit f118c2807afcfdc31d2e95a35624070a8afe1faf
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sat Apr 11 10:16:03 2026 +0200

    Fix broken syntax from clang-format reformat (#1385)

    * Print test names at test time (#1343)

    * Fix broken syntax from clang-format reformat

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit ae6ca929c1d1936dd3d8127cd66e7c75988f51d0
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sat Apr 11 10:10:17 2026 +0200

    Rename _current to _current_it in ranges.h (#1387)

    * Print test names at test time (#1343)

    * Rename _current to _current_it in ranges.h

    Resolves conflict with _current macro from Zephyr and improves
    self-explanation of variable.

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 7971824914eb58c21868d9cf43c8b019b1c46418
Author: John Wellbelove <jwellbelove@users.noreply.github.com>
Date:   Thu Apr 9 07:21:19 2026 +0100

    Add the ability to specify the callback type to etl closure (#1393)

    * Print test names at test time (#1343)

    * Modified closure to accept the callback type as a template parameter

    * Modified closure to accept the callback type as a template parameter

    * Applied clang-format

    * Fixed C++03 compatibility

    * Fixed C++03 compatibility

    # Conflicts:
    #	include/etl/closure.h

    ---------

    Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>

commit 8dc0301a6747945c263c5c5cfa678eee9f4c5edc
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 8 17:58:12 2026 +0200

    Document etl::format_to and etl::print (#1378)

    * Print test names at test time (#1343)

    * Document etl::format_to and etl::print

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>

commit 912e22f238b707edc4d47d830f61f922cea79d70
Merge: 654e222b 1a6762d6
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sun Apr 5 14:32:40 2026 +0100

    Merge branch 'development'

commit 1a6762d6c38dc12bf6c84884e0ccb650706e5c1f
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sun Apr 5 14:13:22 2026 +0100

    Updated version and release notes

commit ee04aa76c5aa66345096483f8abc014c14a29d1f
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sun Apr 5 14:03:25 2026 +0100

    VS2022 project update

commit 3cd03fcb7f1c59fb27582e3e8ce744440bf5c092
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sun Apr 5 14:37:15 2026 +0200

    Fix initializer_list use in algorithm.h and definition of data() in iterator.h (#1374)

    * Print test names at test time (#1343)

    * Fix initializer_list use in algorithm.h

    Needs to be conditional.

    * Move definition of data() in iterator.h

    Needs to be defined earlier.

    ---------

    Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com>

commit 654e222bd9374d5404d5886cf746b8a276f3746e
Merge: 22ee7691 a1ad1336
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sat Apr 4 10:50:06 2026 +0100

    Merge branch 'development'

commit a1ad13364e9e48717beb766cb77f8c946b00c385
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sat Apr 4 10:49:00 2026 +0100

    Updated release notes

commit 22ee76914d7999f4605f93a1651e55016383570d
Merge: a0c98662 e2bed928
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sat Apr 4 10:02:24 2026 +0100

    Merge branch 'development'

    # Conflicts:
    #	test/main.cpp

commit e2bed928146fe4392fa8f02c8a058527829240d7
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sat Apr 4 09:40:46 2026 +0100

    Updated version and release notes

commit 576b03f38db24bc7c1284667b4790296d6670dbe
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sat Apr 4 00:14:49 2026 +0100

    Merged from local copy of PR1295

commit f7e1384a70b17705fd7f531fd2e6298f47ee9002
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Fri Apr 3 20:09:06 2026 +0100

    Merge development

commit e61589ebf207eb3ac8c15b5ba8a34429a6b983d3
Merge: 1ce3deb0 823f2493
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Fri Apr 3 20:08:41 2026 +0100

    Merge branch 'development' into delegate-from-non-capturing-lambda

    # Conflicts:
    #	include/etl/private/delegate_cpp11.h
    #	test/test_delegate.cpp

commit 823f2493b440f09c051800061be1747a3657bd79
Author: Maksim Danilov <mdanilov@me.com>
Date:   Fri Apr 3 18:35:41 2026 +0200

    Rename 'leaf' to 'child' in intrusive_links.h (#1373)

    * Print test names at test time (#1343)

    * Rename 'leaf' to 'child' in intrusive_links.h

    Recent versions of the Tasking TriCore compiler treat
    'leaf' as a reserved C++ keyword, causing compilation failures in ETL.

    ---------

    Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
    Co-authored-by: Maksim Danilov <maksim.danilov@accenture.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 982adecca4e52281ea5289e6979a0760ea67ec77
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Fri Apr 3 16:55:18 2026 +0100

    Added manually triggered clang-format action

    # Conflicts:
    #	.github/workflows/clang-format_update.yaml

commit 2059c5b657e87b0a3e9ae47c3e1a7e8ff4dfca17
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Fri Apr 3 16:46:42 2026 +0100

    Added manually triggered clang-format action

    # Conflicts:
    #	.github/workflows/clang-format_update.yaml

commit bd6e55b12e350b87a41c4342d35779b6cf9aa92e
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Fri Apr 3 16:35:57 2026 +0100

    Added manually triggered clang-format action

    # Conflicts:
    #	.github/workflows/clang-format_update.yaml

commit 5a7674b6372a0ee33e2e7f73d68c395273ba2c35
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Fri Apr 3 16:35:57 2026 +0100

    Added manually triggered clang-format action

    # Conflicts:
    #	.github/workflows/clang-format_update.yaml

commit 2e74b07dffca347b9fd2c79eff3fc854686a3b47
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Fri Apr 3 16:35:57 2026 +0100

    Added manually triggered clang-format action

commit f5128a39fe6c7696c0808a94110585315369c90f
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Fri Apr 3 13:58:19 2026 +0100

    Attempt to fix syntax that comfuse clang-format

commit 01066b86ae8577c57dfcc816e3b0ad470571e3f9
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Fri Apr 3 10:45:54 2026 +0100

    Attempt to fix syntax that comfuse clang-format

commit aeb8e4f73442bcd757e1680c16e8dcecd42b006e
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Thu Apr 2 14:11:45 2026 +0100

    Formatted source files

commit c7571660bd0ea3abbd88d2e0355f3df5820d07b8
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Thu Apr 2 14:07:10 2026 +0100

    Adjusted ColumnLimit  to  150

commit 6a1585b3178021ff453f9067a08f7fafeea60406
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Thu Apr 2 12:28:16 2026 +0100

    Improved include regex

commit 9fba468dc2970bbf25f874a3b93a11e13d3b3e01
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Thu Apr 2 11:33:44 2026 +0100

    Removed ETL_DEPRECATED_REASON=[[deprecated(%0)]] from configuration

commit bd1def8b413288372127f28c9d7a773ceb78f62d
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Thu Apr 2 10:35:49 2026 +0100

    Used the correct macro for 'if constexpr'

commit 27d284713a051c60b4457601bec9226083334040
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Thu Apr 2 09:25:06 2026 +0100

    Updated .clang-format to include more ETL macros

commit 1405bf65ded081a3fa159f0db36b6ac772ab1810
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Thu Apr 2 08:26:17 2026 +0100

    Updated .treefmt to exclude more files and directories

commit 09dd40d4dd91e5817e1f8769c99bcc90e265e3de
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 1 22:43:04 2026 +0200

    Fix .clang-format to recognize ETL macros as attributes

commit c536a39f0a10e826bc2fc4c4d8e73f56a00212b4
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Wed Apr 1 17:53:29 2026 +0200

    Treefmt config

commit 9b394b8677c4765091af729a50a9e3ec1e5a97fa
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Wed Apr 1 17:34:15 2026 +0100

    Added certain Hugo files and diectories to the Git ignore file

commit 9d2c73793d8467c459a0eb0152ee46df85d4849d
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Wed Apr 1 13:33:18 2026 +0100

    Ran clang-format on generated files, using the .clang-format from PR #1314

commit 1ce3deb0f79f08ec7dc6b07ccc674aa293666b3f
Author: Benedek Kupper <kupper.benedek@gmail.com>
Date:   Tue Mar 31 21:56:42 2026 +0200

    test: delegate: add unary + to convert lambda to function pointer

commit ea397ec2ddc4b2e0f3e0aeb8b3244f1ae1ef748b
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Tue Mar 31 11:23:49 2026 +0100

    Changed non-capturing lambda API to runtime function pointer API

commit a483eb90c470b25ea1e3f990e9fd97e448e1bdc6
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Tue Mar 31 19:11:02 2026 +0100

    Fixed generator_test.py

    Updated generator files in the VS2022 project
    Adde licence headers to the generator headers

commit c970fa9bad1af14e8dacf86e5ac81daba189beca
Author: Diogo Cavaleiro <diogo.cavaleiro@ctw.bmwgroup.com>
Date:   Wed Feb 25 11:48:06 2026 +0000

    Add clang-format v18 workflow and configuration

commit d17c0297ec0202fcbd04fd3b4b7250f1df14abb3
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Tue Mar 31 17:36:54 2026 +0200

    Factor out generated code (#1369)

    Previously, generator code under include/etl/generators needed to be
    synchronized with the generated files under include/etl explicitly.
    Leading to errors in the CI checks if forgotten.

    This change separates out the generated parts to cpp03 specific
    snippets. This way, most code under include/etl is now directly editable,
    with only some pre-C++11 code separated out to
    include/etl/generators/*_cpp03_generator.h which still needs to be
    re-generated on respective changes. But in many cases, this is not necessary.

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 3c2a4d48a9fa86bce603020b81dd152c122c874b
Author: William Sciaroni <wsciaroni@protonmail.com>
Date:   Tue Mar 31 06:20:31 2026 -0500

    Update Dockerfile and Devcontainer. (#1360)

    * Print test names at test time (#1343)

    * Remove python3-cogapp from Dockerfile

    Removed python3-cogapp from the Dockerfile installation.

    * Update .devcontainer/Dockerfile

    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

    * Change base image and update Python package installation

    * Change container to use cpp devcontainer version 2

    * Point to specific version of the devcontainer

    * Update devcontainer to use debian snapshot for reproducability

    * Fetch sources via https

    * Make devcontainer more robust for debian_snapshot

    * Make fetch non-https for snapshot

    * Install CMake from apt

    * Update devcontainers to remove CMake version

    * Change Clang version from 22 to 21

    * Apply suggestion from @rolandreichweinbmw

    ---------

    Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
    Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 3d564d68b9b849a4d334932d334fb8280ef3f0e6
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Mar 30 19:34:15 2026 +0100

    Fixed sign conversion in advance_helper

commit e4dfb6c045f0cb7176f3a01c5fe3f2c809d7f22a
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Mon Mar 30 19:06:07 2026 +0100

    Fixed iterator.h #if #else #endif

    Fixed type_lookup_generator to match genereted

commit 95c9cabc1002f0ec80b8aa97445ab2365dc2c5df
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sat Mar 28 20:37:03 2026 +0000

    Fix for PR 1367

commit 3638d89f8b99cde27b7c793c513d6f4da1ba45fd
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sat Mar 28 13:50:27 2026 +0000

    Fix for PR 1367

commit 03ca3c817ee17deb179a754af54a81a7f3d7cd0b
Author: John Wellbelove <john.wellbelove@etlcpp.com>
Date:   Sat Mar 28 12:03:12 2026 +0000

    Fix for PR 1367

commit b83cef566836b5e84463f50df9e14003fc71884c
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Sat Mar 28 12:15:56 2026 +0100

    Fix compilation with -Wsign-conversion (#1367)

    * Fix compilation with -Wsign-conversion

    For tests with GCC and Clang

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

    * Fix support of negative Id in type_lookup.h: type_from_id

    * Fix element access arithmetic in atomic_gcc_sync.h fetch_add/fetch_sub

    * Fix rounded_integral_division.h: divide_round_half_odd(): direction is always 1

commit 2c2ce9a39f1bbe1d37948e97c8e4173a0c076442
Author: Bram Meijer <48760013+Brambovich@users.noreply.github.com>
Date:   Sat Mar 28 10:16:00 2026 +0100

    Add a inplace_function constructor from a nullptr (#1336)

    * Add a inplace_function constructor with a nullptr argument

    * Add unit test for nullptr construction

    ---------

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit f718c54396fe0446f0f483a89b3e35d33f691b4c
Author: Daniel Santos <Daniel.SB.Santos@ctw.bmwgroup.com>
Date:   Fri Mar 27 10:17:56 2026 +0000

    Add bounds and empty checks to container classes (#1334)

    * add bounds and empty checks to containers

    * address code rabbit review

    * correct C++11 constexpr error

    * rename new constexpr macro and make it global

    * rename queue specializations' exceptions

    * change front() implementation in locked queue specializations

    * refactor usage of CONSTEXPR and NO_EXCEPT

    * expand intrusive queue tests

    * introduce lock guards on locked queues

    * Print test names at test time (#1343)

    * revert mutex and return changes on locking queues

    * finish reverting the locked queues

    ---------

    Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 12cdbc0da02e84a94a66ead292f34093356d92ea
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Fri Mar 27 10:19:50 2026 +0100

    Bug fixes in variant_variadic.h (#1358)

    * Print test names at test time (#1343)

    * Bug fixes in variant_variadic.h

    ---------

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit ab03ea114fa59bc9ace96e5f75063da0e1bd8be5
Author: Bram Meijer <48760013+Brambovich@users.noreply.github.com>
Date:   Fri Mar 27 09:11:45 2026 +0100

    Fix compilation issue when including etl/chrono next to etl/to_string. (#1365)

    * Print test names at test time (#1343)

    * Fix namespace issue of floor/round in to_string_helper

    ---------

    Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de>
    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 2f242e37f219cb784ffc8ee3ef7da0f8784708c1
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Thu Mar 26 10:46:20 2026 +0100

    Restrict etl::atomic for general types (#1359)

    * Print test names at test time (#1343)

    * Restrict etl::atomic for general types

    Needs adding is_copy_assignable and is_move_assignable, and
    adjustments to is_trivially_copyable and is_assignable

    * Resolve mutable T value vs. volatile qualified methods

    * Remove volatile method overloads

    They are deprecated in C++20 because they don't work as users expect anyway.

    MSVC hinted for this.

    ---------

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 31b87b541989bbd7da8e11c1cc0ce8f477115c8d
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Thu Mar 26 09:56:17 2026 +0100

    Add C++ ranges library for C++17 (#1316)

    * Add ranges

    * Print test names at test time (#1343)

    * Fix conflit commit errors

    * Cast return value of operator* to value_type

    Fixed warning on VS2022

    ---------

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit add42b6c875420882944d7e946dc22a1ecea9e25
Author: Roland Reichwein <Roland.Reichwein@bmw.de>
Date:   Thu Mar 26 09:29:05 2026 +0100

    Mark uninitialized use from std library (#1349)

    * Print test names at test time (#1343)

    * Mark uninitialized use from std library

    Similar to other cases, adds compiler pragmas against warnings
    caused by std library in optimized builds of tests

    ---------

    Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com>

commit 2f6a3e04aa8e043054f29502c5dcc52669f952cb
Author: Timon Zijnge <47081647+tzijnge@users.noreply.github.com>
Date:   Thu Mar 26 08:56:50 2026 +0100

    Manchester big endian support (#1353)

    * manchester
    * Added manchester code and test

    * manchester
    * Formatting and added missing file

    * manchester
    * Some functions can only be constexpr since C++14

    * manchester
    * Manchester decode and some refactoring

    * manchester
    * Added some missing typenames

    * manchester
    * constexpr void function not al…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants