<feed xmlns='http://www.w3.org/2005/Atom'>
<title>catch3/src, branch devel-noexcept-funcs</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>WIP: More noexcept</title>
<updated>2026-09-05T13:24:15+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-09-02T18:53:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=ace418200064a2467441f565f74ac41cf5884150'/>
<id>ace418200064a2467441f565f74ac41cf5884150</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>WIP: Fixup comment</title>
<updated>2026-09-05T13:20:23+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-09-05T13:20:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=d59be347677feae83d352e7a4d7f04082632e9ac'/>
<id>d59be347677feae83d352e7a4d7f04082632e9ac</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>WIP: noexcept in handleUnexpectedInFlightException</title>
<updated>2026-09-04T21:21:11+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-09-04T21:21:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=1d406997a25f07854191be2552f82d6612247ae2'/>
<id>1d406997a25f07854191be2552f82d6612247ae2</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Reduce number of instantiations of is_foo_comparable trait</title>
<updated>2026-09-04T18:54:43+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-09-04T18:54:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=897d8043eb192d0fc361c6339ce13e1cabe481c4'/>
<id>897d8043eb192d0fc361c6339ce13e1cabe481c4</id>
<content type='text'>
This provides minor compile-time optimization.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This provides minor compile-time optimization.
</pre>
</div>
</content>
</entry>
<entry>
<title>Avoid bad compile time scaling of test registration with optimizations</title>
<updated>2026-09-03T18:22:37+00:00</updated>
<author>
<name>Martin Hořeňovský</name>
</author>
<published>2026-09-03T18:16:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.progmasoft.com/catch3/commit/?id=de1330d036168492a04b649a1fa0593faece6f74'/>
<id>de1330d036168492a04b649a1fa0593faece6f74</id>
<content type='text'>
GCC is especially bad, as it had quadratic scaling in the number of
registered test cases in a TU, but Clang also scaled superlinearly, and
this commit fixes both.

AIUI:
1) Each `TEST_CASE` creates a separate global fragment to handle creating
   the `unique_ptr&lt;ITestInvoker&gt;`, moving the instance into AutoReg,
   destroying the old instance, etc, etc.
2) With optimizations enabled, the compiler merges all these global
   fragments into one big global fragment.
3) Then the compiler runs various optimizations passes on this new global
   fragment.
4) Because some of the passes scale superlinearly, the compilation times
   scale superlinearly in the number of `TEST_CASE` in a translation unit.

For bonus point, no optimization actually happens.

This commit fixes the problem (for non-LTO builds) by adding new `AutoReg`
constructor, one that takes the function pointer raw, instead of wrapped
in `ITestInvoker`. By delaying the construction of the `ITestInvoker`
into the outlined constructor, we no longer create big global fragments
for the compiler to optimize.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
GCC is especially bad, as it had quadratic scaling in the number of
registered test cases in a TU, but Clang also scaled superlinearly, and
this commit fixes both.

AIUI:
1) Each `TEST_CASE` creates a separate global fragment to handle creating
   the `unique_ptr&lt;ITestInvoker&gt;`, moving the instance into AutoReg,
   destroying the old instance, etc, etc.
2) With optimizations enabled, the compiler merges all these global
   fragments into one big global fragment.
3) Then the compiler runs various optimizations passes on this new global
   fragment.
4) Because some of the passes scale superlinearly, the compilation times
   scale superlinearly in the number of `TEST_CASE` in a translation unit.

For bonus point, no optimization actually happens.

This commit fixes the problem (for non-LTO builds) by adding new `AutoReg`
constructor, one that takes the function pointer raw, instead of wrapped
in `ITestInvoker`. By delaying the construction of the `ITestInvoker`
into the outlined constructor, we no longer create big global fragments
for the compiler to optimize.
</pre>
</div>
</content>
</entry>
<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>
</feed>
