文字集合

文字集合chsetは、 そのテンプレートパラメータCharTの制限によって 有限の範囲に制限された文字の集合にマッチする。 このクラスは、単一の文字の集合に対して動作するパーサの最適化の一つである。 テンプレートクラスは文字型CharTによってパラメータ化され、 8、16、32ビットおよび64ビット文字にさえ効率的に働く。

    template <typename CharT = char>
    class chset;

chsetはリテラル(例、'x')、ch_pまたはchlit<>range_pまたはrange<>anychar_pおよびnothing_pから構築される(プリミティブを参照)か、または別の chset からコピーコンストラクタで構築される。 chsetクラスはインスタンスを容易に値渡しできるように copy-on-write スキームを用いる。

sparseなビットベクタ

16/32/64ビット文字を扱う(accomodate)為に、chsetクラスは静的に切り替える、 文字型が8ビットより大きくないときのstd::bitsetの実装から、 disjoint rangeの整列済みベクタ(sorted vector)(range_run)を用いるsparseなビット/真理値集合へと。 その集合はadjacent or overlapping ranges are coalescedであるような範囲から構築される。

range_runは非常に空間的に経済的なものである、 多くの範囲と僅かなindividual disjoint valueがあるような状況で。 n を範囲の個数とすると、探索は O(log n) で行われる。

例:

    chset<> s1('x');
    chset<> s2(anychar_p - s1);

加えて(optionally)、文字集合は次の構文の定義文字列を用いて構築することもできる。 この構文は、集合要素の区切りを括弧(suqre bracket)でなく二重引用符で行う点を 除けば POSIX 形式の正規表現文字集合を resemble している。 また特殊な否定^文字はない。

    range = anychar_p >> '-' >> anychar_p;
    set = *(range_p | anychar_p);

集合を C の文字列で定義しているため、通常の C/C++ のリテラル文字列の構文ルールが適用される。 例えば:

    chset<> s1("a-zA-Z");       // アルファベット文字
    chset<> s2("0-9a-fA-F");    // 16進数文字
    chset<> s3("actgACTG");     // DNA 識別子
    chset<> s4("\x7f\x7e");     // 16進数の 0x7F および 0x7E

標準的な Spirit の集合演算子(演算子を参照)に加えて、文字集合ごとに定義される(character-set-specific)逆(否定~)演算子が適用できる:

文字集合演算子
~a 集合の逆
a | b 集合の和
a & 集合の積
a - b 集合の差
a ^ b 集合の排他的論理和

ここでオペランド a および b はどちらも chset であるか、あるいはオペランドの一つが 文字リテラル、ch_pあるいはchlitrange_pあるいはrangeanychar_pあるいはnothing_pオペランドである。 anychar_pnothing_pオペランドには特殊な最適化されたオーバーロードが用意されている。 nothing_pオペランドは空の集合に変換され、一方で anychar_p オペランドは 用いられる文字型の全ての範囲(例えば、符号無し8ビット char なら0〜255)の要素を持つ集合に変換される。

特殊な場合は、~anychar_pnothing_pをもたらす(yield)が、 しかし ~nothing_pは不正であるということである。 anychar_pの反転は非対称(asymmetrical)で、T*からvoid*への 変換のように片道旅行である。

特殊変換
chset<CharT>(nothing_p) 空集合
chset<CharT>(anychar_p) CharT の全範囲(例えば符号無し8ビット char なら0〜255)
~anychar_p nothing_p
~nothing_p 不正



このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント(英語)