Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion doc/.pa11yci.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
},
"urls": [
"http://localhost:8088/capy/index.html",
"http://localhost:8088/capy/why-capy.html",
"http://localhost:8088/capy/quick-start.html",
"http://localhost:8088/capy/4.coroutines/4b.tasks.html",
"http://localhost:8088/capy/reference/boost/capy.html"
Expand Down
4 changes: 2 additions & 2 deletions doc/.vale.ini
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ BasedOnStyles = Vale, Google, Capy
; Two known-affected spots as of the fix-round-1 report, neither currently flagged live by
; Vale, both still real defects to fix from the worklist rather than from a fresh Vale run:
; `stop_token` bare in prose at 9l.RunApi.adoc:171, and `Intentionally` after a colon at
; 9o.WhyNotTMC.adoc:68. If you are tempted to re-add a BlockIgnores line for source blocks:
; 9p.WhyNotTMC.adoc:68. If you are tempted to re-add a BlockIgnores line for source blocks:
; don't. Confirm first, with an isolated fixture, that Vale is actually failing to skip
; something.
; Ignore inline code spans (backticks) AND `cpp:target[...]` reference macros
Expand All @@ -53,7 +53,7 @@ BasedOnStyles = Vale, Google, Capy
; phrase-exact form left exposed while suppressing its 16 siblings.
; This is NOT a Google.Colons demotion, on purpose: demoting the rule would also
; hide the genuine non-idiom Colons hits. Measured after: 11 survive (8 .adoc, all
; in 9o.WhyNotTMC/9b.Separation/3b.synchronization; 3 docstring "Pass ..." hits in
; in 9p.WhyNotTMC/9b.Separation/3b.synchronization; 3 docstring "Pass ..." hits in
; io/any_*_stream.hpp). 30 - 16 does not equal 11 because the Vocab above also
; removed 3 .adoc Colons hits — Vale treats vocabulary terms as capitalisation
; exceptions, and "Capy"/"Corosio"/"Coroutine" after a colon were never defects.
Expand Down
60 changes: 30 additions & 30 deletions doc/lint/baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,28 +73,28 @@
"modules/ROOT/pages/9.design/9i.TypeEraseAwaitable.adoc:#5:Vale.Spelling",
"modules/ROOT/pages/9.design/9k.Executor.adoc:#1:Capy.NoFluff",
"modules/ROOT/pages/9.design/9k.Executor.adoc:#1:Google.OxfordComma",
"modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#1:Capy.SimpleTense",
"modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#1:Google.OxfordComma",
"modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#1:Google.Will",
"modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#1:Vale.Spelling",
"modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#2:Capy.SimpleTense",
"modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#2:Google.Will",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#10:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#1:Google.Colons",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#1:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#2:Google.Colons",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#2:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#3:Google.Colons",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#3:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#4:Google.Colons",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#4:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#5:Google.Colons",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#5:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#6:Google.Colons",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#6:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#7:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#8:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotTMC.adoc:#9:Vale.Spelling"
"modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#1:Capy.SimpleTense",
"modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#1:Google.OxfordComma",
"modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#1:Google.Will",
"modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#1:Vale.Spelling",
"modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#2:Capy.SimpleTense",
"modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#2:Google.Will",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#10:Vale.Spelling",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#1:Google.Colons",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#1:Vale.Spelling",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#2:Google.Colons",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#2:Vale.Spelling",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#3:Google.Colons",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#3:Vale.Spelling",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#4:Google.Colons",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#4:Vale.Spelling",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#5:Google.Colons",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#5:Vale.Spelling",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#6:Google.Colons",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#6:Vale.Spelling",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#7:Vale.Spelling",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#8:Vale.Spelling",
"modules/ROOT/pages/9.design/9p.WhyNotTMC.adoc:#9:Vale.Spelling"
]
},
"vale_docstrings": {
Expand Down Expand Up @@ -448,14 +448,14 @@
"advisory-C2:modules/ROOT/pages/9.design/9l.RunApi.adoc:#2:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9l.RunApi.adoc:#3:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9l.RunApi.adoc:#4:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9m.WhyNotCobalt.adoc:#1:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9m.WhyNotCobalt.adoc:#2:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9m.WhyNotCobalt.adoc:#3:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#1:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#2:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#3:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#4:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9n.WhyNotCobaltConcepts.adoc:#5:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9n.WhyNotCobalt.adoc:#1:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9n.WhyNotCobalt.adoc:#2:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9n.WhyNotCobalt.adoc:#3:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#1:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#2:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#3:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#4:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/9.design/9o.WhyNotCobaltConcepts.adoc:#5:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/A.specification-methods/Ab.cancellation.adoc:#1:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/A.specification-methods/Ab.cancellation.adoc:#2:sentence over 25 words",
"advisory-C2:modules/ROOT/pages/A.specification-methods/Ac.contingencies.adoc:#1:sentence over 25 words",
Expand Down
8 changes: 4 additions & 4 deletions doc/modules/ROOT/nav.adoc
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
* xref:index.adoc[Introduction]
* xref:why-capy.adoc[Why Capy?]
* xref:quick-start.adoc[Quick Start]
* xref:2.cpp20-coroutines/2.intro.adoc[Introduction To {cpp}20 Coroutines]
** xref:2.cpp20-coroutines/2a.foundations.adoc[Coroutine Foundations]
Expand Down Expand Up @@ -53,9 +52,10 @@
** xref:9.design/9i.TypeEraseAwaitable.adoc[Type-Erasing Awaitables]
** xref:9.design/9k.Executor.adoc[Executor]
** xref:9.design/9l.RunApi.adoc[Run API]
** xref:9.design/9m.WhyNotCobalt.adoc[Why Not Cobalt?]
** xref:9.design/9n.WhyNotCobaltConcepts.adoc[Why Not Cobalt Concepts?]
** xref:9.design/9o.WhyNotTMC.adoc[Why Not TooManyCooks?]
** xref:9.design/9m.WhyNotAsio.adoc[Why Not Asio?]
** xref:9.design/9n.WhyNotCobalt.adoc[Why Not Cobalt?]
** xref:9.design/9o.WhyNotCobaltConcepts.adoc[Why Not Cobalt Concepts?]
** xref:9.design/9p.WhyNotTMC.adoc[Why Not TooManyCooks?]
* xref:A.specification-methods/A.intro.adoc[Methods of API Description]
** xref:A.specification-methods/Ab.cancellation.adoc[Cancellation]
** xref:A.specification-methods/Ac.contingencies.adoc[Contingencies]
Expand Down
9 changes: 9 additions & 0 deletions doc/modules/ROOT/pages/4.coroutines/4a.flow-control.adoc
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
//
// Copyright (c) 2026 Andrzej Krzemieński (akrzemi1@gmail.com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/cppalliance/capy
//

= Flow control
:page-mode: explanation

Capy's design is driven by the needs of network I/O processing,

Check warning on line 13 in doc/modules/ROOT/pages/4.coroutines/4a.flow-control.adoc

View workflow job for this annotation

GitHub Actions / Antora Docs

[sentence_length C2] sentence over 25 words (36)
where a piece of the program, in order to continue, needs to wait for an I/O operation to finish,

Check warning on line 14 in doc/modules/ROOT/pages/4.coroutines/4a.flow-control.adoc

View workflow job for this annotation

GitHub Actions / Antora Docs

[vale_adoc Capy.NoFluff] Filler/fluff — delete or rewrite (style guide C5/C9): 'in order to'.
but when this happens is unpredictable. The challenge here is:

1. To utilize this waiting time as efficiently as possible, processing other tasks.

Check warning on line 17 in doc/modules/ROOT/pages/4.coroutines/4a.flow-control.adoc

View workflow job for this annotation

GitHub Actions / Antora Docs

[vale_adoc Capy.NoFluff] Filler/fluff — delete or rewrite (style guide C5/C9): 'utilize'.
2. To avoid any concurrency or lifetime management bugs.
3. To have the user code be simple and intuitive.

Expand All @@ -18,13 +27,13 @@

This is exactly what happens when you write:

[source,cpp]

Check warning on line 30 in doc/modules/ROOT/pages/4.coroutines/4a.flow-control.adoc

View workflow job for this annotation

GitHub Actions / Antora Docs

[doc_lint B2] raw code, not include::example$/role=pseudocode/role=external
----
process(co_await stream.read_some(buffer));
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ <1>
/*~~~*/ <2>
----
<1> The `co_await`-expression schedules an I/O operation to be called in the

Check warning on line 36 in doc/modules/ROOT/pages/4.coroutines/4a.flow-control.adoc

View workflow job for this annotation

GitHub Actions / Antora Docs

[sentence_length C2] sentence over 25 words (26)
xref:4.coroutines/4d.executors.adoc[_execution context_],
and registers
the resumption of the coroutine after the I/O operation finishes. Once the scheduling and registering is done,
Expand Down
7 changes: 4 additions & 3 deletions doc/modules/ROOT/pages/9.design/9.intro.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Each page examines one concept or facility in depth: the rationale behind its de
* xref:9.design/9i.TypeEraseAwaitable.adoc[Type-Erasing Awaitables] -- How the `any_*` wrappers achieve zero steady-state allocation.
* xref:9.design/9k.Executor.adoc[Executor] -- The `Executor` concept's relationship to Asio, and why `dispatch` returns a coroutine handle.
* xref:9.design/9l.RunApi.adoc[Run API] -- Why `run_async` and `run` use a two-phase `f(context)(task)` call syntax.
* xref:9.design/9m.WhyNotCobalt.adoc[Why Not Cobalt?] -- How Capy's foundation differs from Boost.Cobalt's Asio-based design.
* xref:9.design/9n.WhyNotCobaltConcepts.adoc[Why Not Cobalt Concepts?] -- A side-by-side look at type-erased write-stream algorithms in both libraries.
* xref:9.design/9o.WhyNotTMC.adoc[Why Not TooManyCooks?] -- Choosing between Capy and TooManyCooks by workload: network I/O versus compute.
* xref:9.design/9m.WhyNotAsio.adoc[Why Not Asio?] -- What Capy keeps from Boost.Asio, and what changes once the continuation is always a coroutine.
* xref:9.design/9n.WhyNotCobalt.adoc[Why Not Cobalt?] -- How Capy's foundation differs from Boost.Cobalt's Asio-based design.
* xref:9.design/9o.WhyNotCobaltConcepts.adoc[Why Not Cobalt Concepts?] -- A side-by-side look at type-erased write-stream algorithms in both libraries.
* xref:9.design/9p.WhyNotTMC.adoc[Why Not TooManyCooks?] -- Choosing between Capy and TooManyCooks by workload: network I/O versus compute.
Original file line number Diff line number Diff line change
@@ -1,26 +1,6 @@
= Why Capy?
= Capy and Boost.Asio: A Comparison
:page-mode: explanation

Capy makes `co_await` the only way to do asynchronous work. There are no callbacks, no futures, and no sender/receiver layer to reconcile.

That restriction buys a guarantee the hybrid libraries cannot make: *a coroutine always resumes on the executor it was started with.* State you touch between two suspension points needs no mutex, because nothing else can run there. An awaitable that could resume you on any thread is rejected at compile time.

[source,cpp]
----
include::example$snippets/why_capy.cpp[tag=invariant]
----

[NOTE]
====
See xref:4.coroutines/4d.executors.adoc#the-same-executor-invariant[the same-executor invariant] for the rationale and xref:4.coroutines/4e.io-awaitable.adoc#bridging-a-foreign-awaitable[bridging a foreign awaitable] for the escape hatch.
====

== What Capy Is Not

Capy is not a networking library. It has no sockets, no acceptors, no DNS, no TLS, and no platform event loop. Those belong to Corosio, which is built on Capy.

Capy is the execution model and the byte-stream layer beneath them. It also stands alone for work that never touches the network: HTTP parsing, protocol state machines, serialization.

== Where Capy Advances Beyond Asio

Boost.Asio is currently the world leader in portable asynchronous I/O. The standard is silent here. The global ecosystem offers nothing comparable.
Expand Down Expand Up @@ -325,7 +305,3 @@ Meanwhile, the {cpp} standards committee has produced `std::execution`—a sende
Boost has always been where the practical meets the principled. Where real-world feedback shapes design. Where code ships before papers standardize. Capy continues this tradition.

This library advances beyond Asio in the domains where they overlap. Not by abandoning what works, but by building on it. Not by chasing theoretical purity, but by solving the problems that have frustrated {cpp} developers for years. Those problems are template explosion, compile-time costs, error message novels, ergonomic concurrency, and more.

Capy is already the foundation for work that does not look alike. CERN's traccc project uses Capy without Corosio for GPU reconstruction pipelines. The Http parser is built entirely on Capy's byte streams. Corosio, Websocket, Beast2 and Burl build the networking stack on top of it.

Capy has no external dependencies and does not require Boost.
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ Templates can achieve this by type-erasing every customization point. The cost m

== Stream Concepts

Capy defines three coroutine-only stream concepts. Cobalt inherits Asio's `AsyncReadStream` and `AsyncWriteStream`, which are hybrid concepts supporting callbacks, futures, and coroutines. Cobalt's `cobalt::io` wrappers simplify the API, but still include full Asio headers. See xref:9.design/9n.WhyNotCobaltConcepts.adoc[Write Stream Design] for a detailed comparison of the two approaches.
Capy defines three coroutine-only stream concepts. Cobalt inherits Asio's `AsyncReadStream` and `AsyncWriteStream`, which are hybrid concepts supporting callbacks, futures, and coroutines. Cobalt's `cobalt::io` wrappers simplify the API, but still include full Asio headers. See xref:9.design/9o.WhyNotCobaltConcepts.adoc[Write Stream Design] for a detailed comparison of the two approaches.

Capy's concepts form a small, flat set: cpp:ReadStream[] and cpp:WriteStream[] each define a single partial-transfer primitive (`read_some`, `write_some`); cpp:Stream[] requires both. There is no further refinement.

Expand Down Expand Up @@ -222,7 +222,7 @@ Capy introduces the https://wg21.link/P4003[IoAwaitable protocol] and uses it fo

[source,cpp]
----
include::example$snippets/9m_why_not_cobalt.cpp[tag=await_suspend_env,indent=0]
include::example$snippets/9n_why_not_cobalt.cpp[tag=await_suspend_env,indent=0]
----

No thread-local state. No ambient context. The executor and stop token flow forward through the call chain via the cpp:io_env[] parameter.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Both Capy and Cobalt allow you to write a non-template coroutine algorithm that

[source,cpp]
----
include::example$snippets/9n_why_not_cobalt_concepts.cpp[tag=capy_signature]
include::example$snippets/9o_why_not_cobalt_concepts.cpp[tag=capy_signature]
----

[source,cpp,role=external]
Expand Down Expand Up @@ -121,7 +121,7 @@ Capy's cpp:IoAwaitable[] protocol passes the execution environment as an explici

[source,cpp]
----
include::example$snippets/9n_why_not_cobalt_concepts.cpp[tag=await_suspend_env,indent=0]
include::example$snippets/9o_why_not_cobalt_concepts.cpp[tag=await_suspend_env,indent=0]
----

The executor and stop token flow forward structurally through the call chain via cpp:io_env[]. If a task's machinery does not provide them, the code does not compile. There is no fallback.
Expand Down Expand Up @@ -222,7 +222,7 @@ The type-erased wrapper cpp:any_write_stream[] also models the cpp:WriteStream[]

[source,cpp]
----
include::example$snippets/9n_why_not_cobalt_concepts.cpp[tag=any_write_some_template]
include::example$snippets/9o_why_not_cobalt_concepts.cpp[tag=any_write_some_template]
----

Type erasure does not narrow the interface.
Expand Down Expand Up @@ -273,14 +273,14 @@ Capy's cpp:WriteStream[] concept includes semantic requirements in the concept's

[source,cpp]
----
include::example$snippets/9n_why_not_cobalt_concepts.cpp[tag=semantics_quote]
include::example$snippets/9o_why_not_cobalt_concepts.cpp[tag=semantics_quote]
----

The concept also includes a coroutine-specific warning about buffer lifetime:

[source,cpp]
----
include::example$snippets/9n_why_not_cobalt_concepts.cpp[tag=lifetime_warning]
include::example$snippets/9o_why_not_cobalt_concepts.cpp[tag=lifetime_warning]
----

[cols="1,1,1"]
Expand Down Expand Up @@ -402,7 +402,7 @@ Capy's cpp:any_write_stream[] constructor preallocates storage sized exactly to

[source,cpp]
----
include::example$snippets/9n_why_not_cobalt_concepts.cpp[tag=ctor_prealloc]
include::example$snippets/9o_why_not_cobalt_concepts.cpp[tag=ctor_prealloc]
----

After construction, each `co_await stream.write_some(buf)` reuses this preallocated storage. There is no per-operation allocation and no fixed-size buffer in the coroutine frame.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ HALO (Heap Allocation Lowering Optimization) lets compilers eliminate coroutine

[source,cpp]
----
include::example$snippets/9o_why_not_tmc.cpp[tag=arena,indent=0]
include::example$snippets/9p_why_not_tmc.cpp[tag=arena,indent=0]
----

*TMC provides:*
Expand All @@ -160,7 +160,7 @@ When you write `co_await something`, what happens?

[source,cpp]
----
include::example$snippets/9o_why_not_tmc.cpp[tags=std_suspend_void;std_suspend_bool;std_suspend_handle,indent=0]
include::example$snippets/9p_why_not_tmc.cpp[tags=std_suspend_void;std_suspend_bool;std_suspend_handle,indent=0]
----

The awaitable receives a handle to resume. That's all. No information about where to resume, no cancellation mechanism.
Expand All @@ -169,7 +169,7 @@ The awaitable receives a handle to resume. That's all. No information about wher

[source,cpp]
----
include::example$snippets/9o_why_not_tmc.cpp[tag=await_suspend_env,indent=0]
include::example$snippets/9p_why_not_tmc.cpp[tag=await_suspend_env,indent=0]
----

The awaitable receives:
Expand Down Expand Up @@ -203,7 +203,7 @@ What happens when you `co_await` an awaitable that doesn't implement the extende

[source,cpp]
----
include::example$snippets/9o_why_not_tmc.cpp[tag=strict_static_assert,indent=0]
include::example$snippets/9p_why_not_tmc.cpp[tag=strict_static_assert,indent=0]
----

*TMC:* Wrap in a trampoline that captures current context.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// Official repository: https://github.com/cppalliance/capy
//

// Compiled fragments shown in pages/9.design/9m.WhyNotCobalt.adoc.
// Compiled fragments shown in pages/9.design/9n.WhyNotCobalt.adoc.

#include "../doc_warnings.hpp"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// Official repository: https://github.com/cppalliance/capy
//

// Compiled fragments shown in pages/9.design/9n.WhyNotCobaltConcepts.adoc.
// Compiled fragments shown in pages/9.design/9o.WhyNotCobaltConcepts.adoc.

#include "../doc_warnings.hpp"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// Official repository: https://github.com/cppalliance/capy
//

// Compiled fragments shown in pages/9.design/9o.WhyNotTMC.adoc.
// Compiled fragments shown in pages/9.design/9p.WhyNotTMC.adoc.

#include "../doc_warnings.hpp"

Expand Down Expand Up @@ -113,4 +113,4 @@ struct why_not_tmc_test

} // namespace

TEST_SUITE(why_not_tmc_test, "boost.capy.doc.9o_why_not_tmc");
TEST_SUITE(why_not_tmc_test, "boost.capy.doc.9p_why_not_tmc");
34 changes: 0 additions & 34 deletions test/doc/snippets/why_capy.cpp

This file was deleted.

Loading