物理構成
ここでは,Yuライブラリの物理構成を規定する.
配布形態
Yuライブラリは全体として,ヘッダオンリーで配布される. これは,導入コストの最小化および部分的取得の容易化,ABI問題の回避を目的とする. リンクは要求されない.
ヘッダオンリー配布の性質上,すべてのエンティティの定義はODRに従うよう記述される.
ディレクトリ構成
ディレクトリは公開名前空間の階層に対応するように配置される.
名前空間に対応するディレクトリ名は,その名前空間と同名だとする.
例えば,yu::foo::barという名前空間に属するエンティティを定義するヘッダは,yu/foo/barに配置する.
非公開名前空間に対応するディレクトリの存在や配置は保障されず,ユーザはそれに依存してはならない.
各サブライブラリは,それと同名の公開名前空間を持つ.
したがって,この規則により,各サブライブラリに対応するディレクトリの存在が保障される.
例えば,Yu.Fooというサブライブラリは,yu::foo公開名前空間に対応し,したがってyu/fooというディレクトリが存在することが保障される.
ヘッダ構成
サブライブラリに属する各ヘッダは,原則として1つのエンティティの定義を提供する. ただし,複数のエンティティが密接に結びついていて,それらを同じヘッダに定義する合理的な理由があるとき,1つのヘッダが複数のエンティティを定義してもよい. 例として,あるメタ関数とそのエイリアステンプレートは,同じヘッダで定義されてもよい.
各ヘッダ名は,対応するエンティティと同名だとする.
各ヘッダは,対応するエンティティが属する名前空間に対応するディレクトリに配置される.
例えば,エンティティyu::foo::barを定義するヘッダbar.hppは,ディレクトリyu/fooに配置される.
非公開のエンティティに対応するヘッダの存在はおよび配置は保障されず,そのため上記の規定は適用されない.
上記で規定されたヘッダに加え,各サブライブラリは,サブライブラリ全体を一括でインクルードするためのヘッダを提供する.
このヘッダは,サブライブラリに対応するディレクトリが存在する階層と同じ階層に,そのディレクトリと同名で提供される.
例えば,Yu.Fooというサブライブラリは,yu/fooディレクトリに対応し,同時にyu/foo.hppというヘッダを提供する.
公開境界
公開されたエンティティに対応するヘッダおよび,サブライブラリ全体をインクルードするヘッダを,公開ヘッダだとする.
公開ヘッダのパスおよび名称は,後方互換性において安定したインタフェースとして扱われる. 各公開ヘッダは,追加のヘッダを事前にインクルードすることなく単独でインクルード可能でなくてはならない.
公開されていないヘッダは,ユーザコードから直接インクルードされてはならず,それらの存在や配置は保障されない.