to‑many リンクのタイプは、以下のとおりです。
それぞれのタイプのリンクに、実装に使用されるコンテナーに応じて、適切なアクセサー操作とミューテーター操作が生成されます。 関係を実装する場合のデフォルトは、ロールのプロパティーを使用して変更できます。
デフォルトで、複数オブジェクトに対する順序付けリンクは RiCList として実装されます。CG::Relation::Ordered プロパティーを Checked に設定することにより to-many リンクは順序付けリンクになります。 この順序付けには、多重度がわかっている場合の関係 (限定順序付け関係) と多重度が不明の場合 (無制限順序付け関係) があります。
デフォルトで、複数オブジェクトに対する非順序リンクは RiCCollection として実装されます。Ordered プロパティーを Cleared に設定することで、to‑many リンクは非順序リンクになります。 このリンクには、多重度がわかっている場合の関係 (限定非順序関係) と多重度が不明の場合 (無制限非順序関係) があります。
サブオブジェクトに対するリンクは、 もし、そのサブオブジェクトの多重度が 1 (組み込みスカラー関係) の場合は、組み込みデータ・メンバーとして実装され、サブオブジェクトの多重度が 2 以上の数値 (組み込み固定関係) である場合は、配列として実装されます。
例えば、HomeHeatingSystem オブジェクトには、itsFurnace というサブオブジェクトと itsRoom という 3 つのサブオブジェクトがあり、すべてコンポーネントとして組み込まれています。この場合、 theFurnace に、組み込みスカラー関係があり、 theRooms には、HomeHeatingSystem に対する組み込み固定関係があります。 これらの関係は、以下のように実装されます。
struct HomeHeatingSystem {
/*** User implicit entries ***/
struct Furnace theFurnace;
struct Room theRooms[3];
};
CG::Relation::Implementation プロパティーをスカラー関係の場合は Scalar に、また、固定関係の場合は Fixed に設定することにより同じ結果が得られます。 これらのタイプの関係の実装は、2 つの条件下でのみ使用されます。
デフォルトで、固定の多重度を持つ to-many リンクは、RiCCollection として実装されます。
デフォルトで、限定子がリンクに指定される to-many リンクは、RiCMap として実装されます。
ランダム・アクセス・リンクは、コンテナー内の項目にランダム・アクセスを提供するように拡張された関係です。 ロールの C_CG::Relation::GetAt プロパティーを Checked に設定することにより to-many リンクにランダム・アクセスを指定することができます。 また、C_CG::Relation::GetAtGenerate プロパティーも Checked に設定する必要があります。この設定により、コンテナー用に適切な getAt() メソッドを使用するロールのアクセサーが生成されます。 コンテナー内の特定要素にアクセスするために getAt() メソッドへのパラメーターとして $index キーワードが渡されます。 $index のデフォルト値は、int i です。
例えば、限定順序付け関係の GetAt プロパティーは次の値になります。
RiCList_getAt(&$me$cname, $index)
theRooms の GetAt プロパティーを Checked に設定すると、次のアクセサーが HomeHeatingSystem に生成されて、特定の Room にアクセスできるようになります。
struct Room * HomeHeatingSystem_getTheRooms(
const HomeHeatingSystem* const me, int i) {
return RiCList_getAt(&me->theRooms, i);
}