algo — C++23 日本語リファレンス GitHub

リファレンス執筆ガイド

公開されるリファレンスは、ヘッダの /// コメントだけから生成する。Markdown を 手書きする場所はない。ページの体裁を変えたいときは tools/reference/ を、 文章を直したいときはヘッダを編集する。

mise run docs        # docs/generated/ にページを生成する
mise run docs-check  # 生成したうえで網羅率・例・リンクを検査する
mise run docs-site   # 検証結果なしでサイトのソースを _jekyll/ に組み立てる

生成先の docs/generated/ は Git 管理外である。CI が検査時とサイト構築時に生成する。

ページの構成

生成されるページは cpprefjp と同じ 2 段構成にしている。

ページ 生成元 内容
reference/<category>/<header> ヘッダ全体 概要、インクルード、提供する型・関数の一覧、例、検証、依存関係、実装
reference/<category>/<header>/<name> 型 1 つ・関数 1 つ シグネチャ、概要、パラメータ、戻り値、計算量、メンバ一覧と詳細、関連項目

同名のオーバーロードは 1 ページにまとまる。記述が同じなら 1 つの説明に、違えば (1) (2) と番号が振られる。クラスのメンバは「構築・破棄 / メンバ関数 / 演算子 / 静的メンバ関数 / メンバ型 / メンバ変数」に自動で分類され、一覧表に収まらない情報 (パラメータ・戻り値・事前条件・備考・複数の記述)を持つものだけが詳細節を持つ。

private のメンバ、記述のないエンティティはページに出ない。

public な基底(CRTP の基底を含む)の public メンバは、派生型のページにも 「基底 X から継承」と添えて載る。派生側に同名のメンバがあれば基底側は載らない (C++ の名前隠蔽と同じ)。コンストラクタ・デストラクタは引き継がない。 そのため共通部分を基底へ括り出すときは、記述は基底のメンバに 1 回だけ書けばよい。 派生型ごとにラッパーや using Base::f; を書き直す必要はない。基底は記述付きの クラスとしてどこかのヘッダで宣言されていること(lib/internal/ でよい)。

タグ

タグ 用途
@file そのブロックをヘッダ自身の説明にする。ページ見出しと概要になる
@brief 1 行の説明。一覧表のセルに入るので簡潔に書く
@details 段落。複数書けば複数段落になる
@tparam / @param テンプレート引数・引数の説明
@return 戻り値
@pre 呼び出し側が保証すべき事前条件
@complexity 時間計算量。重要なら空間計算量も
@note / @warning 備考・注意
@see 参考。URL はリンクになる
@code … @endcode 例。そのままコンパイルして実行できる完全なプログラムを書く

@file ブロックは include 群の直後に置き、次の要素の説明とは空行で区切る。 主要な型が 1 つに定まるヘッダでは省略してよく、その型の @brief がページ見出しになる。

#pragma once
#include <vector>

/// @file
/// @brief 素集合データ構造 (Union-Find)
/// @details 要素の集合を併合し、2 要素が同じ連結成分に属するかを管理する。
/// @note 代表元は併合順に依存するため、特定の添字になるとは限らない。
/// @code
/// #include <iostream>
/// #include "data_structure/union_find.hpp"
///
/// int main() {
///     union_find uf(5);
///     uf.unite(0, 1);
///     std::cout << uf.same(0, 1) << '\n';
/// }
/// @endcode

/// @brief 素集合データ構造
/// @complexity 構築は $O(n)$、併合は償却 $O(\alpha(n))$
struct union_find {

@code の中身は g++ -std=c++23 -I lib でコンパイルして実際に実行され、標準出力が ページの「出力」節になる。壊れた例は mise run docs-check が落とす。入力は空なので、 標準入力を読む例は書かない。

記述方針

検査

mise run docs-check は次を確かめる。

下限値は現状維持のためのもので、公開 API を増やしたら同じ PR で引き上げる。 lib/internal/ と lib/template/ は網羅率の対象外だが、ページは生成される。