diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index c99f2a345..545bf3626 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -186,7 +186,7 @@ jobs: # Individual check steps below stay non-blocking (continue-on-error: true): they # print each tool's raw findings for review. Enforcement is done by the # no-new-violations comparator, which diffs a fresh run against baseline.json. - # The gated rules are A1/A6/A7/B2/D2/ANCHOR + MrDocs-no-warnings + C2/C4/C9/C10. + # The gated rules are A1/A6/A7/B2/B6/D2/ANCHOR + MrDocs-no-warnings + C2/C4/C9/C10. # The gate step below names them via --gate and REPORTS them: it prints each with # file, line and an excerpt, and annotates it on the diff, but runs without # --strict, so it does not fail the job. It keeps continue-on-error: false so a @@ -358,7 +358,7 @@ jobs: # job (no --strict). The two when_any.hpp C2 refusals this once expected are # gone — resolved before #383 — and the live gated findings are #383's own. node lint/check-no-new-violations.mjs \ - --gate 'doc_lint:^(A1|A6|B2|D2|ANCHOR):' \ + --gate 'doc_lint:^(A1|A6|B2|B6|D2|ANCHOR):' \ --gate 'vale_adoc:Capy\.PartHeadings$' \ --gate 'mrdocs_warnings:.*' \ --gate 'sentence_length:^C2:' \ diff --git a/doc/STYLE_GUIDE.md b/doc/STYLE_GUIDE.md index b85e4a90a..2c41342f9 100644 --- a/doc/STYLE_GUIDE.md +++ b/doc/STYLE_GUIDE.md @@ -94,6 +94,15 @@ The Antora pipeline provides two mechanisms; use them instead of hand-authoring: suppressions live in `test/doc/doc_warnings.hpp`, included once per file outside every tag; a warning that fires in one fragment stays in that fragment with a comment saying why. B5 is enforced by review only — no script checks it. +- **B6. Every `@see` target in a docstring is an `@ref`.** Write `@see @ref task, @ref Executor`, + never `@see task, Executor`. MrDocs treats the text after `@see` as an ordinary paragraph and + does not auto-link names in it (Doxygen does), so a bare name renders as plain text in the + "See Also" section. Nothing warns about it either: `warn-broken-ref` checks only `@ref` + targets. Keep the line to the list of links. Prose after `@see` ("which describes teardown") + renders unlinked too, so move it into the description. When a name inside a class resolves + to the wrong symbol (`@ref execution_context` inside `execution_context::service` finds the + constructor), qualify it. `doc-lint.mjs` checks every `@see` paragraph in the public headers, + including the lines it wraps onto. ## Part C — Wording (pragmatic Simplified Technical English) @@ -236,7 +245,7 @@ Not every rule is machine-checkable. Each rule sits in one of three tiers: | Tier | Rules | |---|---| -| **Gate** | A1, A6, A7, B2, B3, C2, C4, C9, C10, D2 | +| **Gate** | A1, A6, A7, B2, B3, B6, C2, C4, C9, C10, D2 | | **Warning** | A2, B1, C1, C3, C5, C6, D4, D5, E1 | | **Review** | A3, A4, A5, B4, B5, C7, C8, C11, D1, D3, E2, E3, E4 | diff --git a/doc/lint/README.md b/doc/lint/README.md index be512692a..6f5dacadb 100644 --- a/doc/lint/README.md +++ b/doc/lint/README.md @@ -14,7 +14,7 @@ site build. Node built-ins only, no dependencies of their own. | Script | What it checks | |---|---| -| `doc-lint.mjs` | Structural AsciiDoc/nav rules (A1, A6, B2, ANCHOR, D2, …). JSON on stdout. | +| `doc-lint.mjs` | Structural AsciiDoc/nav rules (A1, A6, B2, ANCHOR, D2, …), plus B6 (`@see` without `@ref`) over the public headers. JSON on stdout. | | `extract-docstrings.mjs` | Extracts header docstrings into `.docstrings/*.adoc` so Vale can lint them. | | `sentence-length.mjs` | **The authority for C2** (no sentence over 25 words), over both corpora. JSON on stdout. | | ↳ | Emits `C2` (hard slice), `advisory-C2` (design essays) and `BACKTICK` (unbalanced code span). | @@ -113,7 +113,7 @@ the rule at the head. Verified by planting a violation and confirming the finger inside a delimited block `[[` is literal and renders fine, and that negative was bite-tested too. `doc-lint.mjs` also emits a `SHAPE` rule alongside `A1`/`A6`/`B2`/`ANCHOR`/`D2` — deliberately outside the -gate spec's `^(A1|A6|B2|D2|ANCHOR):` alternation, the same way `advisory-C2` sits outside +gate spec's `^(A1|A6|B2|B6|D2|ANCHOR):` alternation, the same way `advisory-C2` sits outside `sentence_length`'s `^C2:`. SHAPE is a content-shape heuristic over every `role=output`/ `role=figure` bare listing (doc/STYLE_GUIDE.md B3): those roles are a permanent B2 exemption, so a block wrongly tagged non-code would otherwise be permanently invisible. A SHAPE finding never @@ -124,7 +124,7 @@ fingerprint, and for the Vale checks the check name is at the **tail**, so `^Cap matches nothing and the comparator then reports `gated: true, gatedNew: 0` — a gate that announces it is gating while checking nothing, at exit 0. Measured twice on this branch. The head-anchored shape is correct only for the two rule-at-the-head checks (`doc_lint`, -`sentence_length`), which is why the live spec mixes `^(A1|A6|B2|D2|ANCHOR):` and `^C2:` with +`sentence_length`), which is why the live spec mixes `^(A1|A6|B2|B6|D2|ANCHOR):` and `^C2:` with `Capy\.PartHeadings$` and `(Capy\.SimpleTense|Capy\.NoFluff|Capy\.Terminology)$`. When you add a gate, plant a violation of that exact rule and watch the step fail before you believe it. diff --git a/doc/lint/baseline.mjs b/doc/lint/baseline.mjs index 698dd01ac..c75148f31 100644 --- a/doc/lint/baseline.mjs +++ b/doc/lint/baseline.mjs @@ -225,9 +225,13 @@ function docLintFingerprints() { for (const it of items) { const fp = occurrenceKey(seen, `${check}:${it.file}`, it.message); fingerprints.push(fp); - // doc-lint reports paths relative to the pages tree, not to doc/. + // doc-lint reports paths relative to the pages tree, not to doc/ -- + // except B6, which scans headers and reports repo-relative paths. if (wantDetails) { - details[fp] = { ...resolveSource(`modules/ROOT/pages/${it.file}`, it.line ?? null, null), + const src = it.file.startsWith('include/') + ? { file: it.file, line: it.line ?? null } + : resolveSource(`modules/ROOT/pages/${it.file}`, it.line ?? null, null); + details[fp] = { ...src, rule: check, message: it.message, excerpt: null }; } } diff --git a/doc/lint/doc-lint.mjs b/doc/lint/doc-lint.mjs index 1268a2005..7f7f757b4 100644 --- a/doc/lint/doc-lint.mjs +++ b/doc/lint/doc-lint.mjs @@ -63,6 +63,17 @@ // block-depth skip rather than a whole-file regex. Bite-test per // style-guide F4: put `` `[[nodiscard]]` `` in a page and confirm // ANCHOR fires. +// B6 — every `@see` line in a public header names its targets with +// `@ref`. MrDocs does not auto-link names in `@see` (Doxygen does), +// so `@see task` renders as plain text in "See Also" and nothing +// warns: `warn-broken-ref` only checks `@ref` targets. The line must +// be `@see @ref a, @ref b` and nothing else; prose after `@see` also +// renders unlinked, so it fires too. The lines a `@see` paragraph +// wraps onto are held to the same rule. Scans include/boost/capy minus +// detail/ (the same scope as extract-docstrings.mjs). This is the one +// rule here that reads headers, not pages, so its `file` is +// repo-relative (`include/...`). Bite-test per style-guide F4: write +// `@see task` in a header and confirm B6 fires. // D2 — every page in a CONCEPT_DIRS chapter (or quick-start.adoc) has // >=1 include::example$. D2's "concept page" is a pedagogical // category, not a Diátaxis mode — deliberately independent of @@ -81,6 +92,8 @@ const ROOT = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..') // pages-tree override is for (exercising B2 in isolation). const PAGES_DIR = process.argv[2] ? path.resolve(process.argv[2]) : path.join(ROOT, 'modules/ROOT/pages'); const NAV_FILE = path.join(ROOT, 'modules/ROOT/nav.adoc'); +// B6's header tree; a second CLI arg overrides it for the self-test. +const HEADERS_DIR = process.argv[3] ? path.resolve(process.argv[3]) : path.join(ROOT, '../include/boost/capy'); // The four Diátaxis modes doc/STYLE_GUIDE.md Part A defines. A1 rejects // anything else, including the legacy `concept` value (never a Diátaxis @@ -270,7 +283,55 @@ function scanAnchors(lines) { return out; } -const findings = { A1: [], A6: [], B2: [], SHAPE: [], ANCHOR: [], D2: [] }; +function walkHeaders(dir) { + let out = []; + for (const ent of fs.readdirSync(dir, { withFileTypes: true })) { + const p = path.join(dir, ent.name); + if (ent.isDirectory()) { if (ent.name !== 'detail') out = out.concat(walkHeaders(p)); } + else if (ent.name.endsWith('.hpp')) out.push(p); + } + return out; +} + +// A `@see` paragraph holding anything other than `@ref name` items joined by +// commas. The paragraph runs past the `@see` line, as Doxygen's does, until a +// blank line, `*/`, a line opening with any command but `@ref`, or (for a +// `///` comment) a line that is not `///`. Each offending line is reported. +const SEE_LINE = /^(\s*)(\/\/\/)?\s*[@\\]see\b(.*)$/; +const SEE_REF = /[@\\]ref\s+[\w:~<>]+(?:\([^)]*\))?/g; +const NOT_REF_COMMAND = /^[@\\](?!ref\b)\w/; +function scanSeeLines(lines) { + const out = []; + const check = (text, i) => { + const body = text.split('*/')[0]; + if (body.replace(SEE_REF, '').replace(/[\s,]/g, '') !== '') + out.push({ line: i + 1, message: `@see entry without @ref renders unlinked: ${body.trim()}` }); + return !text.includes('*/'); + }; + let open = false; // inside a @see paragraph + let slashes = false; // ...that lives in a `///` run + lines.forEach((l, i) => { + const m = SEE_LINE.exec(l); + if (m) { + slashes = m[2] !== undefined; + open = check(m[3], i); + return; + } + if (!open) return; + let text = l; + if (slashes) { + const s = /^\s*\/\/\/(.*)$/.exec(l); + if (!s) { open = false; return; } + text = s[1]; + } + const t = text.trim(); + if (t === '' || t.startsWith('*/') || NOT_REF_COMMAND.test(t)) { open = false; return; } + open = check(text, i); + }); + return out; +} + +const findings = { A1: [], A6: [], B2: [], B6: [], SHAPE: [], ANCHOR: [], D2: [] }; const files = walk(PAGES_DIR); for (const file of files) { @@ -300,6 +361,13 @@ for (const file of files) { } } +for (const file of walkHeaders(HEADERS_DIR)) { + const rel = path.join('include/boost/capy', path.relative(HEADERS_DIR, file)); + for (const s of scanSeeLines(fs.readFileSync(file, 'utf8').split('\n'))) { + findings.B6.push({ file: rel, line: s.line, message: s.message }); + } +} + const navText = fs.readFileSync(NAV_FILE, 'utf8'); const topEntries = navText.split('\n').filter(l => /^\* xref:/.test(l)); const qsIndex = topEntries.findIndex(l => /quick-start/.test(l)); diff --git a/doc/lint/selftest.mjs b/doc/lint/selftest.mjs index df623857b..a5aa2a8f7 100644 --- a/doc/lint/selftest.mjs +++ b/doc/lint/selftest.mjs @@ -428,7 +428,44 @@ try { '', ].join('\n')); - const d = spawnSync('node', [path.join(SCRIPT_DIR, 'doc-lint.mjs'), DOCLINT_TMP], + // B6 header fixture, passed to doc-lint.mjs as its header tree. Line + // numbers are asserted below: 3, 4 and 5 must fire; 6 and 7 must not. + // detail/ is outside B6's scope, so its bare `@see` must not fire either. + write('hdr/see.hpp', [ + '/** Brief.', // 1 + '', // 2 + ' @see task', // 3 <- must fire + ' @see @ref task, Executor', // 4 <- must fire (one name unlinked) + ' @see @ref run, which describes teardown.', // 5 <- must fire (prose) + ' @see @ref task, @ref this_coro::executor', // 6 <- must NOT fire + ' @see @ref run(Ex)', // 7 <- must NOT fire + '*/', + '', + ].join('\n')); + write('hdr/detail/hidden.hpp', '/** Brief.\n @see task\n*/\n'); + // B6 continuation fixture: a `@see` paragraph wraps onto following lines + // until a blank line, `*/`, a non-@ref command, or the end of a `///` run. + // 3 and 12 must fire; nothing else may. + write('hdr/see-wrap.hpp', [ + '/** Brief.', // 1 + ' @see @ref a,', // 2 + ' b', // 3 <- must fire (bare name, wrapped) + ' @see @ref a,', // 4 + ' @ref b', // 5 <- must NOT fire (wrapped @ref) + ' @see @ref a', // 6 + '', // 7 blank line ends the paragraph + ' Plain prose after the list.', // 8 <- must NOT fire + ' @see @ref a', // 9 + ' @par Note', // 10 a command ends the paragraph + ' More prose.', // 11 <- must NOT fire + ' @see @ref a, b */', // 12 <- must fire (bare name before */) + '/// @see @ref a,', // 13 + '/// @ref b', // 14 <- must NOT fire + 'int prose_outside_the_comment;', // 15 <- must NOT fire (/// run ended) + '', + ].join('\n')); + + const d = spawnSync('node', [path.join(SCRIPT_DIR, 'doc-lint.mjs'), DOCLINT_TMP, path.join(DOCLINT_TMP, 'hdr')], { encoding: 'utf8', cwd: DOC_DIR, maxBuffer: 16 * 1024 * 1024 }); check('doc-lint.mjs exits 0 against the B2 fixture tree', d.status === 0, `exited ${d.status}: ${(d.stderr || '').trim().slice(-200)}`); @@ -535,6 +572,15 @@ try { `attr-anchor.adoc:10 is the passthrough fix and must not fire; got: ${JSON.stringify(anchorRule)}`); check('ANCHOR finds exactly the one planted prose violation', anchorRule.length === 1, `expected exactly 1 ANCHOR finding, got: ${JSON.stringify(anchorRule)}`); + + // B6: MrDocs renders a bare `@see` name as plain text and warns about + // nothing, so a regression here would be silent on the site too. + const seeLines = dOut.findings.B6.map((f) => `${f.file}:${f.line}`).sort(); + check('B6 flags exactly the bare-name, mixed and prose @see lines, nothing in detail/', + JSON.stringify(seeLines) === JSON.stringify( + ['include/boost/capy/see-wrap.hpp:12', 'include/boost/capy/see-wrap.hpp:3', + 'include/boost/capy/see.hpp:3', 'include/boost/capy/see.hpp:4', 'include/boost/capy/see.hpp:5']), + `got: ${JSON.stringify(seeLines)}`); } } finally { fs.rmSync(DOCLINT_TMP, { recursive: true, force: true }); diff --git a/include/boost/capy/buffers.hpp b/include/boost/capy/buffers.hpp index 9185d9934..58a8fc401 100644 --- a/include/boost/capy/buffers.hpp +++ b/include/boost/capy/buffers.hpp @@ -40,7 +40,7 @@ class mutable_buffer; single-element sequence) and is implicitly convertible to `const_buffer`. - @see const_buffer, MutableBufferSequence + @see @ref const_buffer, @ref MutableBufferSequence */ class mutable_buffer { @@ -130,7 +130,7 @@ class mutable_buffer single-element sequence). Implicitly constructible from `mutable_buffer`. - @see mutable_buffer, ConstBufferSequence + @see @ref mutable_buffer, @ref ConstBufferSequence */ class const_buffer { @@ -233,7 +233,7 @@ class const_buffer @li Convertible to `const_buffer`, OR @li A bidirectional range with value type convertible to `const_buffer` - @see const_buffer, MutableBufferSequence + @see @ref const_buffer, @ref MutableBufferSequence */ // tag::const_buffer_sequence_concept[] template @@ -258,7 +258,7 @@ concept ConstBufferSequence = @li Convertible to `mutable_buffer`, OR @li A bidirectional range with value type convertible to `mutable_buffer` - @see mutable_buffer, ConstBufferSequence + @see @ref mutable_buffer, @ref ConstBufferSequence */ // tag::mutable_buffer_sequence_concept[] template @@ -474,7 +474,7 @@ length_impl(It first, It last, long) @return The number of buffers in `bs`. - @see buffer_size + @see @ref buffer_size */ template std::size_t diff --git a/include/boost/capy/buffers/buffer_param.hpp b/include/boost/capy/buffers/buffer_param.hpp index 2deefbf0b..482ab09f8 100644 --- a/include/boost/capy/buffers/buffer_param.hpp +++ b/include/boost/capy/buffers/buffer_param.hpp @@ -94,7 +94,7 @@ namespace capy { @tparam BS The buffer sequence type. Must satisfy either ConstBufferSequence or MutableBufferSequence. - @see ConstBufferSequence, MutableBufferSequence + @see @ref ConstBufferSequence, @ref MutableBufferSequence */ template requires ConstBufferSequence || MutableBufferSequence diff --git a/include/boost/capy/buffers/buffer_slice.hpp b/include/boost/capy/buffers/buffer_slice.hpp index 2ce1b0d10..037637f0f 100644 --- a/include/boost/capy/buffers/buffer_slice.hpp +++ b/include/boost/capy/buffers/buffer_slice.hpp @@ -63,7 +63,7 @@ using slice_type = std::conditional_t< @par !example example - @see slice_type, consuming_buffers + @see @ref slice_type, @ref consuming_buffers */ template requires MutableBufferSequence diff --git a/include/boost/capy/buffers/consuming_buffers.hpp b/include/boost/capy/buffers/consuming_buffers.hpp index 00ebd5040..a049fb362 100644 --- a/include/boost/capy/buffers/consuming_buffers.hpp +++ b/include/boost/capy/buffers/consuming_buffers.hpp @@ -38,7 +38,7 @@ namespace capy { @par !example example - @see buffer_slice, slice_of + @see @ref buffer_slice */ template requires MutableBufferSequence || ConstBufferSequence diff --git a/include/boost/capy/concept/context_runnable.hpp b/include/boost/capy/concept/context_runnable.hpp index af3fc8308..1dae1e862 100644 --- a/include/boost/capy/concept/context_runnable.hpp +++ b/include/boost/capy/concept/context_runnable.hpp @@ -97,7 +97,7 @@ namespace capy { @par !example example - @see ContextAwaitable, run, run_async + @see @ref ContextAwaitable, @ref run, @ref run_async */ // tag::context_runnable_concept[] template diff --git a/include/boost/capy/concept/execution_context.hpp b/include/boost/capy/concept/execution_context.hpp index 73c8f8a10..eaf075fe0 100644 --- a/include/boost/capy/concept/execution_context.hpp +++ b/include/boost/capy/concept/execution_context.hpp @@ -60,7 +60,7 @@ namespace capy { @par !example example_2 - @see Executor, execution_context + @see @ref Executor, @ref execution_context */ template concept ExecutionContext = diff --git a/include/boost/capy/concept/executor.hpp b/include/boost/capy/concept/executor.hpp index 6239e8c03..ada80471f 100644 --- a/include/boost/capy/concept/executor.hpp +++ b/include/boost/capy/concept/executor.hpp @@ -163,7 +163,7 @@ class execution_context; @par !example example_2 - @see ExecutionContext, execution_context + @see @ref ExecutionContext, @ref execution_context */ // tag::executor_concept[] template diff --git a/include/boost/capy/concept/read_stream.hpp b/include/boost/capy/concept/read_stream.hpp index 6524dac11..d3fa8d3f3 100644 --- a/include/boost/capy/concept/read_stream.hpp +++ b/include/boost/capy/concept/read_stream.hpp @@ -102,7 +102,7 @@ namespace capy { @par !example example_2 - @see ContextAwaitable, MutableBufferSequence, awaitable_decomposes_to + @see @ref ContextAwaitable, @ref MutableBufferSequence, @ref awaitable_decomposes_to */ // tag::read_stream_concept[] template diff --git a/include/boost/capy/concept/stream.hpp b/include/boost/capy/concept/stream.hpp index 43526020d..5d5dd1268 100644 --- a/include/boost/capy/concept/stream.hpp +++ b/include/boost/capy/concept/stream.hpp @@ -36,7 +36,7 @@ namespace capy { @par !example example - @see ReadStream, WriteStream + @see @ref ReadStream, @ref WriteStream */ template concept Stream = ReadStream && WriteStream; diff --git a/include/boost/capy/concept/write_stream.hpp b/include/boost/capy/concept/write_stream.hpp index dc8390be8..c29296c53 100644 --- a/include/boost/capy/concept/write_stream.hpp +++ b/include/boost/capy/concept/write_stream.hpp @@ -111,7 +111,7 @@ namespace capy { @par !example example_2 - @see ContextAwaitable, ConstBufferSequence, awaitable_decomposes_to + @see @ref ContextAwaitable, @ref ConstBufferSequence, @ref awaitable_decomposes_to */ // tag::write_stream_concept[] template diff --git a/include/boost/capy/cond.hpp b/include/boost/capy/cond.hpp index a814f6aaa..293b05a6d 100644 --- a/include/boost/capy/cond.hpp +++ b/include/boost/capy/cond.hpp @@ -29,7 +29,7 @@ namespace capy { @par !example example - @see error + @see @ref error */ enum class cond { diff --git a/include/boost/capy/continuation.hpp b/include/boost/capy/continuation.hpp index a478b73aa..56b6c2eac 100644 --- a/include/boost/capy/continuation.hpp +++ b/include/boost/capy/continuation.hpp @@ -78,7 +78,7 @@ class chain_owner; `h.resume()`. The executor's internal locking provides the necessary synchronization between these two accesses. - @see Executor, executor_ref + @see @ref Executor, @ref executor_ref */ struct continuation { diff --git a/include/boost/capy/error.hpp b/include/boost/capy/error.hpp index 4aae7d3bd..f1dbd2d26 100644 --- a/include/boost/capy/error.hpp +++ b/include/boost/capy/error.hpp @@ -26,7 +26,7 @@ namespace capy { @ref cond error conditions instead. These enum values are implementation details subject to change. - @see cond + @see @ref cond */ enum class error { diff --git a/include/boost/capy/ex/any_executor.hpp b/include/boost/capy/ex/any_executor.hpp index 0e0fff33b..06a575c25 100644 --- a/include/boost/capy/ex/any_executor.hpp +++ b/include/boost/capy/ex/any_executor.hpp @@ -75,7 +75,7 @@ struct is_strand_type> : std::true_type {}; @par !example example - @see executor_ref, Executor + @see @ref executor_ref, @ref Executor */ class any_executor { diff --git a/include/boost/capy/ex/await_context.hpp b/include/boost/capy/ex/await_context.hpp index 6844ed759..0db7c8185 100644 --- a/include/boost/capy/ex/await_context.hpp +++ b/include/boost/capy/ex/await_context.hpp @@ -41,7 +41,7 @@ class chain_owner; The referenced executor and allocator must remain valid for the lifetime of any coroutine using this environment. - @see ContextAwaitable, ContextRunnable + @see @ref ContextAwaitable, @ref ContextRunnable */ struct await_context { diff --git a/include/boost/capy/ex/context_awaitable_promise_base.hpp b/include/boost/capy/ex/context_awaitable_promise_base.hpp index 28507561c..4254a5e1e 100644 --- a/include/boost/capy/ex/context_awaitable_promise_base.hpp +++ b/include/boost/capy/ex/context_awaitable_promise_base.hpp @@ -96,10 +96,10 @@ namespace capy { the teardown of an armed waker's frame on its executor thread is a precondition violation. - @see this_coro::environment, this_coro::executor, - this_coro::stop_token, this_coro::frame_allocator - @see await_context - @see ContextAwaitable + @see @ref this_coro::environment, @ref this_coro::executor, + @ref this_coro::stop_token, @ref this_coro::frame_allocator + @see @ref await_context + @see @ref ContextAwaitable */ template class context_awaitable_promise_base diff --git a/include/boost/capy/ex/execution_context.hpp b/include/boost/capy/ex/execution_context.hpp index 3cca6cea3..0cfe201c9 100644 --- a/include/boost/capy/ex/execution_context.hpp +++ b/include/boost/capy/ex/execution_context.hpp @@ -60,7 +60,7 @@ namespace capy { @par !example example - @see service, ExecutionContext + @see @ref service, @ref ExecutionContext */ class BOOST_CAPY_DECL execution_context @@ -126,7 +126,7 @@ class BOOST_CAPY_DECL @par !example example - @see execution_context + @see @ref boost::capy::execution_context */ class BOOST_CAPY_DECL service @@ -359,7 +359,7 @@ class BOOST_CAPY_DECL @return Pointer to the frame allocator. - @see set_frame_allocator + @see @ref set_frame_allocator */ std::pmr::memory_resource* get_frame_allocator() const noexcept @@ -379,7 +379,7 @@ class BOOST_CAPY_DECL @param mr Pointer to the memory resource. - @see get_frame_allocator + @see @ref get_frame_allocator */ void set_frame_allocator(std::pmr::memory_resource* mr) noexcept @@ -404,7 +404,7 @@ class BOOST_CAPY_DECL @param a The allocator to use. - @see get_frame_allocator + @see @ref get_frame_allocator */ template requires (!std::is_pointer_v) diff --git a/include/boost/capy/ex/executor_ref.hpp b/include/boost/capy/ex/executor_ref.hpp index 6d91bc099..b8fd7573a 100644 --- a/include/boost/capy/ex/executor_ref.hpp +++ b/include/boost/capy/ex/executor_ref.hpp @@ -98,7 +98,7 @@ inline constexpr executor_vtable vtable_for = { @par !example example - @see any_executor, Executor + @see @ref any_executor, @ref Executor */ class executor_ref { diff --git a/include/boost/capy/ex/frame_alloc_mixin.hpp b/include/boost/capy/ex/frame_alloc_mixin.hpp index 941b5657e..0bb3dae23 100644 --- a/include/boost/capy/ex/frame_alloc_mixin.hpp +++ b/include/boost/capy/ex/frame_alloc_mixin.hpp @@ -48,7 +48,7 @@ namespace capy { The allocation fast path uses thread-local storage and requires no synchronization. The global pool fallback is mutex-protected. - @see context_awaitable_promise_base, frame_allocator, recycling_memory_resource + @see @ref context_awaitable_promise_base, @ref recycling_memory_resource */ struct frame_alloc_mixin { diff --git a/include/boost/capy/ex/frame_allocator.hpp b/include/boost/capy/ex/frame_allocator.hpp index 34affe4c3..91ed2f074 100644 --- a/include/boost/capy/ex/frame_allocator.hpp +++ b/include/boost/capy/ex/frame_allocator.hpp @@ -105,7 +105,7 @@ current_frame_allocator_ref() noexcept @return The thread-local memory_resource pointer, or `nullptr` if none is set. - @see set_current_frame_allocator, ContextAwaitable + @see @ref set_current_frame_allocator, @ref ContextAwaitable */ inline std::pmr::memory_resource* @@ -129,7 +129,7 @@ get_current_frame_allocator() noexcept @param mr The memory_resource to install, or `nullptr` to clear. - @see get_current_frame_allocator, ContextAwaitable + @see @ref get_current_frame_allocator, @ref ContextAwaitable */ inline void set_current_frame_allocator( @@ -161,7 +161,7 @@ set_current_frame_allocator( @param h The coroutine handle to resume. - @see get_current_frame_allocator, set_current_frame_allocator + @see @ref get_current_frame_allocator, @ref set_current_frame_allocator */ // tag::safe_resume[] inline void diff --git a/include/boost/capy/ex/immediate.hpp b/include/boost/capy/ex/immediate.hpp index baa17b3cf..2ba5f0631 100644 --- a/include/boost/capy/ex/immediate.hpp +++ b/include/boost/capy/ex/immediate.hpp @@ -42,7 +42,7 @@ namespace capy { @par !example example_2 - @see ready, results + @see @ref ready, @ref results */ template struct immediate @@ -115,7 +115,7 @@ struct immediate @return An immediate awaitable containing a successful `results`. - @see immediate, results + @see @ref immediate, @ref results */ inline immediate> @@ -179,7 +179,7 @@ ready(T1 t1, T2 t2, T3 t3) @return An immediate awaitable containing a failed `results`. - @see immediate, results + @see @ref immediate, @ref results */ inline immediate> diff --git a/include/boost/capy/ex/recycling_memory_resource.hpp b/include/boost/capy/ex/recycling_memory_resource.hpp index a9c5c0406..99e02418b 100644 --- a/include/boost/capy/ex/recycling_memory_resource.hpp +++ b/include/boost/capy/ex/recycling_memory_resource.hpp @@ -42,8 +42,8 @@ namespace capy { @par !example example - @see get_recycling_memory_resource - @see run_async + @see @ref get_recycling_memory_resource + @see @ref run_async */ BOOST_CAPY_MSVC_WARNING_PUSH BOOST_CAPY_MSVC_WARNING_DISABLE(4275) // non dll-interface base class @@ -301,8 +301,8 @@ BOOST_CAPY_MSVC_WARNING_POP @return Pointer to the recycling memory resource. - @see recycling_memory_resource - @see run_async + @see @ref recycling_memory_resource + @see @ref run_async */ BOOST_CAPY_DECL std::pmr::memory_resource* diff --git a/include/boost/capy/ex/run.hpp b/include/boost/capy/ex/run.hpp index 70990b9d9..362da498f 100644 --- a/include/boost/capy/ex/run.hpp +++ b/include/boost/capy/ex/run.hpp @@ -1,5 +1,6 @@ // // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com) +// Copyright (c) 2026 Michael Vandeberg // // 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) @@ -806,8 +807,8 @@ namespace boost::capy { @return A wrapper that accepts a task for execution. - @see task - @see Executor + @see @ref task + @see @ref Executor */ template [[nodiscard]] auto @@ -818,12 +819,14 @@ run(Ex ex) /** Bind a task to an executor with a stop token. + @ref run(Ex) describes teardown and preconditions. + @param ex The executor on which the task should run. @param st The stop token for cooperative cancellation. @return A wrapper that accepts a task for execution. - @see run(Ex), which describes teardown and its precondition. + @see @ref run(Ex) */ template [[nodiscard]] auto @@ -835,12 +838,14 @@ run(Ex ex, std::stop_token st) /** Bind a task to an executor with a memory resource. + @ref run(Ex) describes teardown and preconditions. + @param ex The executor on which the task should run. @param mr The memory resource for frame allocation. @return A wrapper that accepts a task for execution. - @see run(Ex), which describes teardown and its precondition. + @see @ref run(Ex) */ template [[nodiscard]] auto @@ -856,12 +861,14 @@ run(Ex ex, std::pmr::memory_resource* mr) `co_await run(ex, alloc)(task())`: the task's frame is allocated from memory the wrapper holds until the end of that expression. + @ref run(Ex) describes teardown and preconditions. + @param ex The executor on which the task should run. @param alloc The allocator for frame allocation. @return A wrapper that accepts a task for execution. - @see run(Ex), which describes teardown and its precondition. + @see @ref run(Ex) */ template [[nodiscard]] auto @@ -873,13 +880,15 @@ run(Ex ex, Alloc alloc) /** Bind a task to an executor with stop token and memory resource. + @ref run(Ex) describes teardown and preconditions. + @param ex The executor on which the task should run. @param st The stop token for cooperative cancellation. @param mr The memory resource for frame allocation. @return A wrapper that accepts a task for execution. - @see run(Ex), which describes teardown and its precondition. + @see @ref run(Ex) */ template [[nodiscard]] auto @@ -895,13 +904,15 @@ run(Ex ex, std::stop_token st, std::pmr::memory_resource* mr) `co_await run(ex, alloc)(task())`: the task's frame is allocated from memory the wrapper holds until the end of that expression. + @ref run(Ex) describes teardown and preconditions. + @param ex The executor on which the task should run. @param st The stop token for cooperative cancellation. @param alloc The allocator for frame allocation. @return A wrapper that accepts a task for execution. - @see run(Ex), which describes teardown and its precondition. + @see @ref run(Ex) */ template [[nodiscard]] auto diff --git a/include/boost/capy/ex/run_async.hpp b/include/boost/capy/ex/run_async.hpp index c152b9e51..5865023e9 100644 --- a/include/boost/capy/ex/run_async.hpp +++ b/include/boost/capy/ex/run_async.hpp @@ -401,7 +401,7 @@ make_trampoline(Ex, Handlers, Alloc) @par !example example - @see run_async + @see @ref run_async */ template class [[nodiscard]] run_async_wrapper @@ -576,9 +576,9 @@ class [[nodiscard]] run_async_wrapper @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -616,9 +616,9 @@ run_async(Ex ex) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template requires detail::RunAsyncHandler

@@ -657,9 +657,9 @@ run_async(Ex ex, H1 h1) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template requires (detail::RunAsyncHandler

&& detail::RunAsyncHandler

) @@ -697,9 +697,9 @@ run_async(Ex ex, H1 h1, H2 h2) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -732,9 +732,9 @@ run_async(Ex ex, std::stop_token st) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template requires detail::RunAsyncHandler

@@ -768,9 +768,9 @@ run_async(Ex ex, std::stop_token st, H1 h1) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template requires (detail::RunAsyncHandler

&& detail::RunAsyncHandler

) @@ -804,9 +804,9 @@ run_async(Ex ex, std::stop_token st, H1 h1, H2 h2) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -836,9 +836,9 @@ run_async(Ex ex, std::pmr::memory_resource* mr) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -869,9 +869,9 @@ run_async(Ex ex, std::pmr::memory_resource* mr, H1 h1) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -902,9 +902,9 @@ run_async(Ex ex, std::pmr::memory_resource* mr, H1 h1, H2 h2) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -935,9 +935,9 @@ run_async(Ex ex, std::stop_token st, std::pmr::memory_resource* mr) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -969,9 +969,9 @@ run_async(Ex ex, std::stop_token st, std::pmr::memory_resource* mr, H1 h1) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -1002,9 +1002,9 @@ run_async(Ex ex, std::stop_token st, std::pmr::memory_resource* mr, H1 h1, H2 h2 @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -1032,9 +1032,9 @@ run_async(Ex ex, Alloc alloc) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -1063,9 +1063,9 @@ run_async(Ex ex, Alloc alloc, H1 h1) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -1094,9 +1094,9 @@ run_async(Ex ex, Alloc alloc, H1 h1, H2 h2) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -1125,9 +1125,9 @@ run_async(Ex ex, std::stop_token st, Alloc alloc) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto @@ -1157,9 +1157,9 @@ run_async(Ex ex, std::stop_token st, Alloc alloc, H1 h1) @return A wrapper that accepts a `task` for immediate execution. - @see task - @see Executor - @see run_async_wrapper + @see @ref task + @see @ref Executor + @see @ref run_async_wrapper */ template [[nodiscard]] auto diff --git a/include/boost/capy/ex/strand.hpp b/include/boost/capy/ex/strand.hpp index e05f4352c..651d833de 100644 --- a/include/boost/capy/ex/strand.hpp +++ b/include/boost/capy/ex/strand.hpp @@ -78,7 +78,7 @@ namespace capy { @tparam Ex The type of the underlying executor. Must satisfy the `Executor` concept. - @see Executor + @see @ref Executor */ template class strand diff --git a/include/boost/capy/ex/this_coro.hpp b/include/boost/capy/ex/this_coro.hpp index 4f7274fbe..b347c0590 100644 --- a/include/boost/capy/ex/this_coro.hpp +++ b/include/boost/capy/ex/this_coro.hpp @@ -27,7 +27,7 @@ namespace capy { @par !example example - @see context_awaitable_promise_base, await_context + @see @ref context_awaitable_promise_base, @ref await_context */ namespace this_coro { @@ -37,8 +37,8 @@ namespace this_coro { yield the coroutine's current execution environment. The tag itself carries no data; it serves only as a sentinel for compile-time dispatch. - @see environment - @see context_awaitable_promise_base + @see @ref environment + @see @ref context_awaitable_promise_base */ struct environment_tag {}; @@ -48,8 +48,8 @@ struct environment_tag {}; yield the coroutine's current executor. The tag itself carries no data; it serves only as a sentinel for compile-time dispatch. - @see executor - @see context_awaitable_promise_base + @see @ref executor + @see @ref context_awaitable_promise_base */ struct executor_tag {}; @@ -59,8 +59,8 @@ struct executor_tag {}; yield the coroutine's current stop token. The tag itself carries no data; it serves only as a sentinel for compile-time dispatch. - @see stop_token - @see context_awaitable_promise_base + @see @ref stop_token + @see @ref context_awaitable_promise_base */ struct stop_token_tag {}; @@ -70,8 +70,8 @@ struct stop_token_tag {}; yield the coroutine's current frame allocator. The tag itself carries no data; it serves only as a sentinel for compile-time dispatch. - @see frame_allocator - @see context_awaitable_promise_base + @see @ref frame_allocator + @see @ref context_awaitable_promise_base */ struct frame_allocator_tag {}; @@ -96,9 +96,9 @@ struct frame_allocator_tag {}; @li Returns a pointer to the stored `await_context` @li This operation never suspends; `await_ready()` always returns `true` - @see environment_tag - @see context_awaitable_promise_base - @see await_context + @see @ref environment_tag + @see @ref context_awaitable_promise_base + @see @ref await_context */ inline constexpr environment_tag environment{}; @@ -125,8 +125,8 @@ inline constexpr environment_tag environment{}; returns `false`). @li This operation never suspends; `await_ready()` always returns `true`. - @see executor_tag - @see context_awaitable_promise_base + @see @ref executor_tag + @see @ref context_awaitable_promise_base */ inline constexpr executor_tag executor{}; @@ -154,8 +154,8 @@ inline constexpr executor_tag executor{}; @li The returned token remains valid for the coroutine's lifetime. @li This operation never suspends; `await_ready()` always returns `true`. - @see stop_token_tag - @see context_awaitable_promise_base + @see @ref stop_token_tag + @see @ref context_awaitable_promise_base */ inline constexpr stop_token_tag stop_token{}; @@ -180,8 +180,8 @@ inline constexpr stop_token_tag stop_token{}; `nullptr` when the default allocator is in use. @li This operation never suspends; `await_ready()` always returns `true`. - @see frame_allocator_tag - @see context_awaitable_promise_base + @see @ref frame_allocator_tag + @see @ref context_awaitable_promise_base */ inline constexpr frame_allocator_tag frame_allocator{}; diff --git a/include/boost/capy/ex/thread_pool.hpp b/include/boost/capy/ex/thread_pool.hpp index 4dc84b317..344118120 100644 --- a/include/boost/capy/ex/thread_pool.hpp +++ b/include/boost/capy/ex/thread_pool.hpp @@ -204,7 +204,7 @@ class thread_pool::executor_type Increments the outstanding work count. Must be paired with a subsequent call to @ref on_work_finished. - @see on_work_finished, work_guard + @see @ref on_work_finished, @ref work_guard */ BOOST_CAPY_DECL void @@ -218,7 +218,7 @@ class thread_pool::executor_type @pre A preceding call to @ref on_work_started was made. - @see on_work_started, work_guard + @see @ref on_work_started, @ref work_guard */ BOOST_CAPY_DECL void diff --git a/include/boost/capy/ex/work_guard.hpp b/include/boost/capy/ex/work_guard.hpp index 926327feb..f40e1de33 100644 --- a/include/boost/capy/ex/work_guard.hpp +++ b/include/boost/capy/ex/work_guard.hpp @@ -55,7 +55,7 @@ namespace capy { @tparam Ex A type satisfying the Executor concept. - @see make_work_guard, Executor + @see @ref make_work_guard, @ref Executor */ template class work_guard @@ -220,7 +220,7 @@ class work_guard @return A `work_guard` holding work on `ex`. - @see work_guard + @see @ref work_guard */ template work_guard diff --git a/include/boost/capy/io/any_read_stream.hpp b/include/boost/capy/io/any_read_stream.hpp index 0f501f119..f0631ad97 100644 --- a/include/boost/capy/io/any_read_stream.hpp +++ b/include/boost/capy/io/any_read_stream.hpp @@ -65,7 +65,7 @@ namespace capy { @par !example example - @see any_write_stream, any_stream, ReadStream + @see @ref any_write_stream, @ref any_stream, @ref ReadStream */ class any_read_stream { diff --git a/include/boost/capy/io/any_stream.hpp b/include/boost/capy/io/any_stream.hpp index b00639a8e..fa8ac81bc 100644 --- a/include/boost/capy/io/any_stream.hpp +++ b/include/boost/capy/io/any_stream.hpp @@ -55,7 +55,7 @@ namespace capy { @par !example example - @see any_read_stream, any_write_stream, ReadStream, WriteStream + @see @ref any_read_stream, @ref any_write_stream, @ref ReadStream, @ref WriteStream */ class any_stream : public any_read_stream diff --git a/include/boost/capy/io/any_write_stream.hpp b/include/boost/capy/io/any_write_stream.hpp index 5a331d1ad..dd789fd5c 100644 --- a/include/boost/capy/io/any_write_stream.hpp +++ b/include/boost/capy/io/any_write_stream.hpp @@ -66,7 +66,7 @@ namespace capy { @par !example example - @see any_read_stream, any_stream, WriteStream + @see @ref any_read_stream, @ref any_stream, @ref WriteStream */ class any_write_stream { diff --git a/include/boost/capy/io/write_now.hpp b/include/boost/capy/io/write_now.hpp index e9009e150..03bc0fb60 100644 --- a/include/boost/capy/io/write_now.hpp +++ b/include/boost/capy/io/write_now.hpp @@ -1,5 +1,6 @@ // // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com) +// Copyright (c) 2026 Michael Vandeberg // // 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) @@ -83,7 +84,7 @@ namespace capy { } @endcode - @see write, write_some, WriteStream, ConstBufferSequence + @see @ref write, @ref write_some, @ref WriteStream, @ref ConstBufferSequence */ template requires WriteStream @@ -343,7 +344,7 @@ class write_now detail::throw_system_error( ec ); @endcode - @see write, write_some, WriteStream + @see @ref write, @ref write_some, @ref WriteStream */ // GCC falsely warns that the coroutine promise's // placement operator new(size_t, write_now&, auto&) diff --git a/include/boost/capy/quitter.hpp b/include/boost/capy/quitter.hpp index 8db10d878..824a481ea 100644 --- a/include/boost/capy/quitter.hpp +++ b/include/boost/capy/quitter.hpp @@ -126,7 +126,7 @@ struct quitter_return_base @tparam T The result type. Use `quitter<>` for `quitter`. - @see task, ContextRunnable, ContextAwaitable + @see @ref task, @ref ContextRunnable, @ref ContextAwaitable */ template struct [[nodiscard]] BOOST_CAPY_CORO_AWAIT_ELIDABLE @@ -147,7 +147,7 @@ struct [[nodiscard]] BOOST_CAPY_CORO_AWAIT_ELIDABLE Result storage and `return_value`/`return_void` are provided by `detail::quitter_return_base`. - @see context_awaitable_promise_base, ContextRunnable + @see @ref context_awaitable_promise_base, @ref ContextRunnable */ struct promise_type : context_awaitable_promise_base diff --git a/include/boost/capy/read.hpp b/include/boost/capy/read.hpp index 91249d775..f7daee9a9 100644 --- a/include/boost/capy/read.hpp +++ b/include/boost/capy/read.hpp @@ -78,7 +78,7 @@ namespace capy { @par !example example - @see ReadStream, MutableBufferSequence + @see @ref ReadStream, @ref MutableBufferSequence */ template requires ReadStream && MutableBufferSequence diff --git a/include/boost/capy/read_at_least.hpp b/include/boost/capy/read_at_least.hpp index 754a5b76e..000bdc4b2 100644 --- a/include/boost/capy/read_at_least.hpp +++ b/include/boost/capy/read_at_least.hpp @@ -98,7 +98,7 @@ namespace capy { @par !example example - @see read, ReadStream, MutableBufferSequence + @see @ref read, @ref ReadStream, @ref MutableBufferSequence */ template requires ReadStream && MutableBufferSequence diff --git a/include/boost/capy/task.hpp b/include/boost/capy/task.hpp index 89d3e8fe9..67f9a8f21 100644 --- a/include/boost/capy/task.hpp +++ b/include/boost/capy/task.hpp @@ -111,7 +111,7 @@ struct task_return_base @tparam T The result type. Use `task<>` for `task`. - @see ContextRunnable, ContextAwaitable, run, run_async + @see @ref ContextRunnable, @ref ContextAwaitable, @ref run, @ref run_async */ template struct [[nodiscard]] BOOST_CAPY_CORO_AWAIT_ELIDABLE @@ -128,7 +128,7 @@ struct [[nodiscard]] BOOST_CAPY_CORO_AWAIT_ELIDABLE Result storage and `return_value`/`return_void` are provided by `detail::task_return_base`. - @see context_awaitable_promise_base, ContextRunnable + @see @ref context_awaitable_promise_base, @ref ContextRunnable */ struct promise_type : context_awaitable_promise_base diff --git a/include/boost/capy/test/bufgrind.hpp b/include/boost/capy/test/bufgrind.hpp index 7f013ba4d..0e111288b 100644 --- a/include/boost/capy/test/bufgrind.hpp +++ b/include/boost/capy/test/bufgrind.hpp @@ -56,7 +56,7 @@ namespace test { @par !example example_3 - @see buffer_slice + @see @ref buffer_slice */ template class bufgrind diff --git a/include/boost/capy/test/fuse.hpp b/include/boost/capy/test/fuse.hpp index 6554c776c..d36e79402 100644 --- a/include/boost/capy/test/fuse.hpp +++ b/include/boost/capy/test/fuse.hpp @@ -602,7 +602,7 @@ class fuse @return The @ref result of the armed run. - @see armed + @see @ref armed */ template result @@ -617,7 +617,7 @@ class fuse @return The @ref result of the armed run. - @see armed + @see @ref armed */ template requires ContextRunnable> diff --git a/include/boost/capy/test/read_stream.hpp b/include/boost/capy/test/read_stream.hpp index 1c9ac7e44..e0a09e01b 100644 --- a/include/boost/capy/test/read_stream.hpp +++ b/include/boost/capy/test/read_stream.hpp @@ -45,7 +45,7 @@ namespace test { @par !example example - @see fuse, ReadStream + @see @ref fuse, @ref ReadStream */ class read_stream { @@ -133,7 +133,7 @@ class read_stream @throws std::system_error When the attached @ref fuse is in exception mode and reaches its failure point. - @see fuse + @see @ref fuse */ template auto diff --git a/include/boost/capy/test/run_blocking.hpp b/include/boost/capy/test/run_blocking.hpp index 50b1916e3..0e04ea107 100644 --- a/include/boost/capy/test/run_blocking.hpp +++ b/include/boost/capy/test/run_blocking.hpp @@ -45,7 +45,7 @@ class blocking_context; @par Thread Safety All member functions are safe to call from any thread. - @see blocking_context, run_blocking + @see @ref blocking_context, @ref run_blocking */ struct BOOST_CAPY_DECL blocking_executor { @@ -132,7 +132,7 @@ struct BOOST_CAPY_DECL blocking_executor `signal_done()`, `signal_abandoned()`, and `enqueue()` are safe to call from any thread. - @see blocking_executor, run_blocking + @see @ref blocking_executor, @ref run_blocking */ class BOOST_CAPY_DECL blocking_context : public execution_context @@ -225,7 +225,7 @@ class BOOST_CAPY_DECL blocking_context @par Thread Safety Safe to invoke from any thread. - @see run_blocking, blocking_context + @see @ref run_blocking, @ref blocking_context */ template struct blocking_handler_wrapper @@ -359,7 +359,7 @@ struct blocking_handler_wrapper run_blocking([&](int v) { result = v; })(my_task()); @endcode - @see run_blocking, run_async + @see @ref run_blocking, @ref run_async */ template class [[nodiscard]] run_blocking_wrapper @@ -469,7 +469,7 @@ class [[nodiscard]] run_blocking_wrapper @return A wrapper that accepts a task for blocking execution. - @see run_async + @see @ref run_async */ [[nodiscard]] inline auto run_blocking() @@ -504,7 +504,7 @@ run_blocking() @return A wrapper that accepts a task for blocking execution. - @see run_async + @see @ref run_async */ template [[nodiscard]] auto @@ -537,7 +537,7 @@ run_blocking(H1 h1) @return A wrapper that accepts a task for blocking execution. - @see run_async + @see @ref run_async */ template [[nodiscard]] auto @@ -564,7 +564,7 @@ run_blocking(H1 h1, H2 h2) @return A wrapper that accepts a task for blocking execution. - @see run_async + @see @ref run_async */ [[nodiscard]] inline auto run_blocking(std::stop_token st) @@ -584,7 +584,7 @@ run_blocking(std::stop_token st) @return A wrapper that accepts a task for blocking execution. - @see run_async + @see @ref run_async */ template [[nodiscard]] auto @@ -606,7 +606,7 @@ run_blocking(std::stop_token st, H1 h1) @return A wrapper that accepts a task for blocking execution. - @see run_async + @see @ref run_async */ template [[nodiscard]] auto diff --git a/include/boost/capy/test/stream.hpp b/include/boost/capy/test/stream.hpp index 6c1f25d1e..6291b94ac 100644 --- a/include/boost/capy/test/stream.hpp +++ b/include/boost/capy/test/stream.hpp @@ -63,7 +63,7 @@ namespace test { @par !example example - @see make_stream_pair, fuse + @see @ref make_stream_pair, @ref fuse */ class stream { @@ -233,7 +233,7 @@ class stream `error::canceled`. A read that can complete immediately from buffered data is unaffected by the stop token. - @see fuse, close + @see @ref fuse, @ref close */ template auto @@ -441,7 +441,7 @@ class stream data. An empty buffer sequence is a no-op that completes successfully regardless of the stop token. - @see fuse, close + @see @ref fuse, @ref close */ template auto @@ -514,7 +514,7 @@ class stream @param sv The data to inject. - @see make_stream_pair + @see @ref make_stream_pair */ void provide(std::string_view sv) @@ -537,7 +537,7 @@ class stream is set if a read error occurs (e.g. fuse injection). The bool is true if the data matches. - @see provide + @see @ref provide */ std::pair expect(std::string_view expected) @@ -573,7 +573,7 @@ class stream @return A view of the pending data. - @see provide, expect + @see @ref provide, @ref expect */ std::string_view data() const noexcept @@ -595,7 +595,7 @@ class stream @return A pair of connected streams. - @see stream, fuse + @see @ref stream, @ref fuse */ inline std::pair make_stream_pair(fuse f = {}) diff --git a/include/boost/capy/test/write_stream.hpp b/include/boost/capy/test/write_stream.hpp index d26781d3a..32c8f84a2 100644 --- a/include/boost/capy/test/write_stream.hpp +++ b/include/boost/capy/test/write_stream.hpp @@ -47,7 +47,7 @@ namespace test { @par !example example - @see fuse, WriteStream + @see @ref fuse, @ref WriteStream */ class write_stream { @@ -155,7 +155,7 @@ class write_stream @throws std::system_error When the attached @ref fuse is in exception mode and reaches its failure point. - @see fuse + @see @ref fuse */ template auto diff --git a/include/boost/capy/when_all.hpp b/include/boost/capy/when_all.hpp index 95edf980e..8666e5c69 100644 --- a/include/boost/capy/when_all.hpp +++ b/include/boost/capy/when_all.hpp @@ -697,7 +697,7 @@ class when_all_homogeneous_launcher @par !example example_1 - @see ContextAwaitableRange, when_all + @see @ref ContextAwaitableRange, @ref when_all */ template requires detail::is_results_v< @@ -816,7 +816,7 @@ template @par !example example_2 - @see ContextAwaitableRange, when_all + @see @ref ContextAwaitableRange, @ref when_all */ template requires detail::is_results_v< diff --git a/include/boost/capy/when_any.hpp b/include/boost/capy/when_any.hpp index 66833b131..9c8a6147c 100644 --- a/include/boost/capy/when_any.hpp +++ b/include/boost/capy/when_any.hpp @@ -774,7 +774,7 @@ class when_any_results_homogeneous_launcher @par !example example_1 - @see ContextAwaitableRange, when_any + @see @ref ContextAwaitableRange, @ref when_any */ template requires detail::is_results_v< @@ -899,7 +899,7 @@ template @par !example example_2 - @see ContextAwaitableRange, when_any + @see @ref ContextAwaitableRange, @ref when_any */ template requires detail::is_results_v< diff --git a/include/boost/capy/write.hpp b/include/boost/capy/write.hpp index a894efb17..802c91d2f 100644 --- a/include/boost/capy/write.hpp +++ b/include/boost/capy/write.hpp @@ -86,7 +86,7 @@ namespace capy { @par !example example - @see WriteStream, ConstBufferSequence, ContextAwaitable, results, cond. + @see @ref WriteStream, @ref ConstBufferSequence, @ref ContextAwaitable, @ref results, @ref cond */ template auto write(S& stream, CB buffers) -> task> diff --git a/include/boost/capy/write_at_least.hpp b/include/boost/capy/write_at_least.hpp index fbebd62cb..806854be4 100644 --- a/include/boost/capy/write_at_least.hpp +++ b/include/boost/capy/write_at_least.hpp @@ -96,7 +96,7 @@ namespace capy { @par !example example - @see write, WriteStream, ConstBufferSequence + @see @ref write, @ref WriteStream, @ref ConstBufferSequence */ template auto