インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
bounds_t<LowerT, UpperT> は半開区間の下限と上限を保持します。下限と上限で異なる整数表現を使用できるようにテンプレート化されており、1 つの次元の有効な反復空間をモデル化します。
境界を使用して、範囲全体を反復することも、範囲の一部に反復空間を制限することもできます。
境界の作成
境界は、完全な bounds_t 型を使用して作成できますが、これは面倒です。
bounds_t<int, int>(start, finish)
bounds_t<int, aligned<16>>(start, aligned<16>(finish))
bounds_t<fixed<0>, fixed<1920>>()
ファクトリー関数 bounds を使用して bounds_t<> を構築するほうが簡単です。
bounds(start,finish);
bounds(start, aligned<16>(finish));
bounds(0_fixed, 1920_fixed)
境界の特定
アクセサーは、有効な反復空間を把握しています。アクセサーの初期境界は、下限が fixed<0>、上限が n_container(fixed<>,aligned<>, または int) の構築時に指定された次元の範囲の値と型に設定されます。
アクセサーの特定の次元の境界を照会するには、テンプレート関数 bounds_d<int DimensionT>(object) を使用します。
auto b0 = bounds_d<0>(ca);
auto b1 = bounds_d<1>(ca);
for (int y = b0.lower(); y < b0.upper(); ++y)
for (int x = b1.lower(); x < b1.upper(); ++x) {
RGBAs pixel = ca[y][x];
// …
}
bounds_t は、C++11 の範囲ベースの for ループにも利用できます。
for (auto y: bounds_d<0>(ca))
for (auto x: bounds_d<1>(ca)) {
RGBAs pixel = ca[y][x];
// …
}
for (auto y: ca.bounds_d0())
for (auto x: ca.bounds_d1()) {
RGBAs pixel = ca[y][x];
// …
}
N 次元のインデックスと境界
多次元のインデックス値と境界値をモデル化するため、次のテンプレート・クラスが提供されています: n_index_t<…> および n_bounds_t<…>。これらは可変個引数テンプレートで、任意の数の引数を受け付けます。
n_index は、n_index_t のインスタンスを簡単に作成するためのジェネレーターです。
n_index[540][960]
n_bounds は、n_bounds_t のインスタンスを簡単に作成するためのジェネレーターです。
n_bounds[bounds(540,1080)][bounds(960,1920)]
n_bounds_t は、n_index_t and と n_extent_t で定義することもできます。
n_bounds(n_index[540][960], n_extent[540][960]);
サブセクションへのアクセス
コンテナーのアクセサーから n_bounds_t で定義されたサブセクションの新しいアクセサーを作成できます。
auto ca = c.const_access();
auto subsect = ca.section(n_bounds[bounds(540, 1080)][bounds(960,1920)]);
サブセクションのアクセサーの bounds_d<int Dimension> の結果を制限します。
異なるインデックス空間に変換した新しいアクセサーを作成することもできます。
auto offsetnewSpace = ca.translated_to(n_index[1000][2000]);
auto zeroSpace = ca.translated_to_zero();
アクセスには、アクセサーの下限に n_index をマップする変換が適用されます。これにより、ブロックごとに巡回する大きなインデックス空間で小さなコンテナーを再利用したり、サブセクションのインデックス空間を開始位置に移動することができます。