英語版
このページの英語版を見る

std.range.interfaces

このモジュールは std.range.
メイン std.rangeのサブモジュールである。 を扱うためのテンプレート・ベースのツールを提供するが、実行時のポリモーフィズムが必要な場合など、範囲用のオブジェクト・ベースのインターフェースが必要になることもある。 ランタイム・ポリモーフィズムが必要な場合などである。この目的のために、このサブモジュール によって作成された範囲オブジェクトをラップするために使用できる、多くのオブジェクトとinterface の定義を提供する。 テンプレートによって作成された std.rangeテンプレートで作成された範囲オブジェクトを囲むために使用できる
InputRange 入力範囲のラッパー。
InputAssignable 割り当て可能な要素を持つ入力範囲のラッパー。
ForwardRange 前方範囲用のラッパー。
ForwardAssignable 割り当て可能な要素を持つフォワード・レンジ用のラッパー。
BidirectionalRange 双方向範囲用のラッパー。
BidirectionalAssignable 割り当て可能な要素を持つ双方向範囲用のラッパー。
RandomAccessFinite 有限ランダム・アクセス範囲のラッパー
RandomAccessAssignable 割り当て可能な要素を持つ有限ランダム・アクセス範囲のラッパー.
RandomAccessInfinite 無限ランダムアクセス範囲のラッパー
OutputRange 出力範囲のラッパー
OutputRangeObject OutputRange インタフェースを実装し、メソッドを仮想関数でラップするクラス。 put メソッドを仮想関数でラップするクラス。
outputRangeObject E型を受け入れるR型の基本範囲を持つOutputRangeObject 。 を作成するための便利な関数である。
InputRangeObject InputRange インタフェースを実装し、入力範囲のメソッドを仮想関数でラップするクラス。 入力範囲メソッドを仮想関数でラップしたクラス。
inputRangeObject を作成するための便利な関数である。InputRangeObject を作成するための便利な関数である。
MostDerivedInputRange 範囲に最もマッチするインターフェース型を返す。
Authors:
Andrei Alexandrescu, David Simcha, and Jonathan M Davis. Credit for some of the ideas in building this module goes to Leonardo Maffi.
interface InputRange(E);
これらのインターフェイスは、要素型Eを持つ入力範囲の仮想的な関数ベースのラッパーを提供することを意図している。 これは、DLL関数や仮想関数のように、明確に定義されたバイナリ・インターフェースが必要な場合に有用である。 DLL関数や仮想関数がジェネリックな範囲をパラメータとして受け取る必要がある場合などである。 が汎用範囲をパラメータとして受け取る必要がある場合などである。ただし isInputRange とその仲間たちは、構造インターフェイスへの適合性をチェックする これらのinterface 型の実装ではないことに注意されたい。

制限事項 これらのインターフェースは、ref 要素へのアクセスを転送することはできない。

ラップされた範囲の無限性は伝搬されない。
非ランダムアクセス範囲の場合、長さは伝搬されない。

Examples:
import std.algorithm.iteration : map;
import std.range : iota;

void useRange(InputRange!int range) {
    // 関数本体。
}

// 範囲型を作成する。
auto squares = map!"a * a"(iota(10));

// それをインターフェイスで包む。
auto squaresWrapped = inputRangeObject(squares);

// それを使う。
useRange(squaresWrapped);
@property E front();
E moveFront();
コール std.range.primitives.moveFront可能であれば を呼び出す。そうでなければ例外をスローする。 UnsupportedRangeMethod例外をスローする。
void popFront();
@property bool empty();
int opApply(scope int delegate(E));

int opApply(scope int delegate(size_t, E));
foreach 反復はopApplyを使用する。 なぜなら、ループごとに1回のデリゲート呼び出しの方が、3回の仮想関数呼び出しよりも速いからである。
interface ForwardRange(E): InputRange!E;
E 型の順方向範囲用インターフェース。
@property ForwardRange!E save();
interface BidirectionalRange(E): ForwardRange!E;
E 、双方向範囲のためのインターフェース。
@property BidirectionalRange!E save();
@property E back();
E moveBack();
呼び出し std.range.primitives.moveBack可能であれば ラップされた範囲を呼び出す。そうでない場合は、例外をスローする。 UnsupportedRangeMethod例外
void popBack();
interface RandomAccessFinite(E): BidirectionalRange!E;
E 型の有限ランダムアクセス範囲用インターフェース。
@property RandomAccessFinite!E save();
E opIndex(size_t);
E moveAt(size_t);
@property size_t length();
alias opDollar = length;
RandomAccessFinite!E opSlice(size_t, size_t);
interface RandomAccessInfinite(E): ForwardRange!E;
E 型の無限ランダムアクセス範囲用インターフェース。
enum bool empty;
E moveAt(size_t);
を呼び出す。 std.range.primitives.moveAtを呼び出す。 可能であれば、ラップされた範囲を呼び出す。そうでない場合は例外をスローする。 UnsupportedRangeMethod例外を投げる。
@property RandomAccessInfinite!E save();
E opIndex(size_t);
interface InputAssignable(E): InputRange!E;
InputRangeに代入可能な要素を追加する。
@property void front(E newVal);
interface ForwardAssignable(E): InputAssignable!E, ForwardRange!E;
ForwardRangeに割り当て可能な要素を追加する。
@property ForwardAssignable!E save();
interface BidirectionalAssignable(E): ForwardAssignable!E, BidirectionalRange!E;
BidirectionalRange に割り当て可能な要素を追加する。
@property BidirectionalAssignable!E save();
@property void back(E newVal);
interface RandomFiniteAssignable(E): RandomAccessFinite!E, BidirectionalAssignable!E;
RandomAccessFinite に割り当て可能な要素を追加する。
@property RandomFiniteAssignable!E save();
void opIndexAssign(E val, size_t index);
interface OutputRange(E);
E 型の出力レンジのインターフェース。 使い方は InputRange インターフェースと子孫に似ている。
void put(E);
class OutputRangeObject(R, E...): staticMap!(OutputRange, E);
すべての型Eに対してOutputRange インタフェースを実装し、各型のメソッドをラップする。 put E メソッドを仮想関数でラップする。
this(R range);
template MostDerivedInputRange(R) if (isInputRange!(Unqual!R))
R に最もマッチするインタフェース型を返す。
template InputRangeObject(R) if (isInputRange!(Unqual!R))
R が扱う最も派生したインタフェースを実装し、関連するすべての範囲プリミティブを仮想関数でラップする。 すべての関連する範囲プリミティブを仮想関数でラップする。 R がすでに がすでにInputRange インタフェースから派生している場合、それ自身をエイリアスにする。
InputRangeObject!R inputRangeObject(R)(R range)
if (isInputRange!R);
適切な型のInputRangeObject を作成するための便利な関数。 例として InputRangeを参照のこと。
template outputRangeObject(E...)
基本範囲を持つOutputRangeObject を作成するための便利な関数である。 R を持つE を作成するための便利な関数である。
Examples:
import std.array;
auto app = appender!(uint[])();
auto appWrapped = outputRangeObject!(uint, uint[])(app);
static assert(is(typeof(appWrapped) : OutputRange!(uint[])));
static assert(is(typeof(appWrapped) : OutputRange!(uint)));
OutputRangeObject!(R, E) outputRangeObject(R)(R range);
class UnsupportedRangeMethod: object.Exception;
インターフェイスメソッドがラップされた範囲でサポートされていない場合にスローされる。