<feed xmlns='http://www.w3.org/2005/Atom'>
<title>catch3, branch v3.16.0</title>
<subtitle>Progmasoft Catch3: an independently maintained C++17 test framework with a parallel runner, property checks, snapshots and structured results.</subtitle>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/'/>
<entry>
<title>v3.16.0</title>
<updated>2026-08-25T07:32:22+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-25T07:32:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=317ac1ed4c0bb6e6b91eafc817e05c488feffcb3'/>
<id>317ac1ed4c0bb6e6b91eafc817e05c488feffcb3</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Improve String matcher handling of case sensitivity</title>
<updated>2026-08-24T13:11:48+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-24T13:11:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=fc5bc1fa8b57326b5bc8eaa189b3534b99913d07'/>
<id>fc5bc1fa8b57326b5bc8eaa189b3534b99913d07</id>
<content type='text'>
The old implementation of String matchers worked by making a, potentially
lower-cased, copy of both the constructor arg, and the arg to `match` calls.

The new implementation does not make copies, and instead does per-character
lowering if needed. This is a win in **most** cases, with two exceptions:

1) Case-insensitive `Equals` between long strings. The old implementation
   is easy to autovectorize by the compiler, which wins over the extra copy
   with sufficiently long inputs.
2) Case-insensitive `ContainsSubstring` with inputs that trigger the worst
   case complexity of O(m*n) of the naive implementation.

The latter is fixable with some elbow grease by implementing a proper
string search algorithm, but the former is a cost we have to live with.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The old implementation of String matchers worked by making a, potentially
lower-cased, copy of both the constructor arg, and the arg to `match` calls.

The new implementation does not make copies, and instead does per-character
lowering if needed. This is a win in **most** cases, with two exceptions:

1) Case-insensitive `Equals` between long strings. The old implementation
   is easy to autovectorize by the compiler, which wins over the extra copy
   with sufficiently long inputs.
2) Case-insensitive `ContainsSubstring` with inputs that trigger the worst
   case complexity of O(m*n) of the naive implementation.

The latter is fixable with some elbow grease by implementing a proper
string search algorithm, but the former is a cost we have to live with.
</pre>
</div>
</content>
</entry>
<entry>
<title>Further reduce stamped out types for each templated test case</title>
<updated>2026-08-23T18:46:39+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-23T13:05:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=499442d7ef9242ce1bb329d69ea13ee6d340421c'/>
<id>499442d7ef9242ce1bb329d69ea13ee6d340421c</id>
<content type='text'>
This provides further speed-ups for TUs with many test cases templated
over the same set of types. For especially test-heavy (but still
realistic) TUs, the speed up is up to 20%.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This provides further speed-ups for TUs with many test cases templated
over the same set of types. For especially test-heavy (but still
realistic) TUs, the speed up is up to 20%.
</pre>
</div>
</content>
</entry>
<entry>
<title>Avoid stamping out common type helpers in each templated test cases</title>
<updated>2026-08-23T09:31:50+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-20T19:38:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=9a2b2ee8d6d325fc0d9ccf449fb375e78c6f3480'/>
<id>9a2b2ee8d6d325fc0d9ccf449fb375e78c6f3480</id>
<content type='text'>
This provides small (but measurable) improvements in compilation
times when a TU has multiple test cases templated over the same types.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This provides small (but measurable) improvements in compilation
times when a TU has multiple test cases templated over the same types.
</pre>
</div>
</content>
</entry>
<entry>
<title>Don't store extra copy of all `TestCaseInfo*` in `TestRegistry`</title>
<updated>2026-08-22T21:28:11+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-22T21:28:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=ef3a728265292e6a1dbec727b0099d3d8b3f6420'/>
<id>ef3a728265292e6a1dbec727b0099d3d8b3f6420</id>
<content type='text'>
We used to store a full vector of "views" of the registered test infos,
so that it can be retrieved externally. However, the only user of that
interface left was `Session`, specifically `Session::applyFilenameAsTags`.

By moving the adding of the filename tags into the `ITestCaseRegistry`
interface, we avoid storing the vector and make the initial test registration
faster.

The new code is ugly and shows a design/layering issue, but no worse than
the previous approach did.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
We used to store a full vector of "views" of the registered test infos,
so that it can be retrieved externally. However, the only user of that
interface left was `Session`, specifically `Session::applyFilenameAsTags`.

By moving the adding of the filename tags into the `ITestCaseRegistry`
interface, we avoid storing the vector and make the initial test registration
faster.

The new code is ugly and shows a design/layering issue, but no worse than
the previous approach did.
</pre>
</div>
</content>
</entry>
<entry>
<title>Don't instantiate the default implementation of benchmarks in every TU</title>
<updated>2026-08-22T21:01:51+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-22T17:00:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=69da66ee7370d7c249ba6f2a322a78dcdd623761'/>
<id>69da66ee7370d7c249ba6f2a322a78dcdd623761</id>
<content type='text'>
The underlying benchmarking machinery is templated, so that it can use
different clock implementations (either for testing, or to support user
with platform-specific clocks). However, 99.99% of all users interact
with it using the `BENCHMARK` macro, which means that they use it with
`std::chrono::steady_clock`.

By adding outlined implementation of benchmarking helpers specialized
onto `std::chrono::steady_clock`, we save some amount of time per every
TU that uses benchmarks.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The underlying benchmarking machinery is templated, so that it can use
different clock implementations (either for testing, or to support user
with platform-specific clocks). However, 99.99% of all users interact
with it using the `BENCHMARK` macro, which means that they use it with
`std::chrono::steady_clock`.

By adding outlined implementation of benchmarking helpers specialized
onto `std::chrono::steady_clock`, we save some amount of time per every
TU that uses benchmarks.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add optimizer barrier to benchmark calls of void-returning functions</title>
<updated>2026-08-22T18:43:13+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-22T13:19:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=45f9ea1e798c2e128dcba53602ccbddfe5676f6f'/>
<id>45f9ea1e798c2e128dcba53602ccbddfe5676f6f</id>
<content type='text'>
The goal is to do the equivalent of clobbering memory, which forces
the compiler to keep side effects that are external to the benchmarked
function, while allowing it to optimize inside the benchmarked function.

E.g. this cannot be optimized away:
```cpp
BENCHMARK("foo") {
    global_count += 1;
};
```

while this can:
```cpp
BENCHMARK("bar") {
    size_t local_count = 0;
    for (size_t i = 0; i &lt; 100; ++i) {
        local_count += 1;
    }
};
```
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The goal is to do the equivalent of clobbering memory, which forces
the compiler to keep side effects that are external to the benchmarked
function, while allowing it to optimize inside the benchmarked function.

E.g. this cannot be optimized away:
```cpp
BENCHMARK("foo") {
    global_count += 1;
};
```

while this can:
```cpp
BENCHMARK("bar") {
    size_t local_count = 0;
    for (size_t i = 0; i &lt; 100; ++i) {
        local_count += 1;
    }
};
```
</pre>
</div>
</content>
</entry>
<entry>
<title>Preallocate test case vectors in TestRegistry</title>
<updated>2026-08-22T18:42:23+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-21T15:37:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=9915f7250dcfc2c7bbd9e86c83b29438df39d856'/>
<id>9915f7250dcfc2c7bbd9e86c83b29438df39d856</id>
<content type='text'>
Preallocating to some reasonable and small number of tests avoids
much of the geometric-reallocation threashing at low sizes, without
taking up too much memory for tiny test binaries.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Preallocating to some reasonable and small number of tests avoids
much of the geometric-reallocation threashing at low sizes, without
taking up too much memory for tiny test binaries.
</pre>
</div>
</content>
</entry>
<entry>
<title>Tiny formatting fix in catch_template_test_registry.hpp</title>
<updated>2026-08-22T18:41:59+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-08-20T18:39:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=f9dfb1031565f61bccabf7d95f91a7606eb74f45'/>
<id>f9dfb1031565f61bccabf7d95f91a7606eb74f45</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>fix: work around clang 20/21 + libc++ compile failure in TEMPLATE_PRODUCT_TEST_CASE with differing arities (#3173)</title>
<updated>2026-08-20T15:39:01+00:00</updated>
<author>
<name>Matt Van Horn</name>
</author>
<published>2026-08-20T15:39:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=fdfc07e571eb7f046013052a9fa57db51c6a2cb9'/>
<id>fdfc07e571eb7f046013052a9fa57db51c6a2cb9</id>
<content type='text'>
* fix: work around clang 20/21 + libc++ compile failure in TEMPLATE_PRODUCT_TEST_CASE with differing arities

Fixes #3115

* docs: reference llvm/llvm-project#130778 in the clang 20/21 workaround comment

---------

Co-authored-by: Matt Van Horn &lt;455140+mvanhorn@users.noreply.github.com&gt;</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* fix: work around clang 20/21 + libc++ compile failure in TEMPLATE_PRODUCT_TEST_CASE with differing arities

Fixes #3115

* docs: reference llvm/llvm-project#130778 in the clang 20/21 workaround comment

---------

Co-authored-by: Matt Van Horn &lt;455140+mvanhorn@users.noreply.github.com&gt;</pre>
</div>
</content>
</entry>
</feed>
