module Buffer:伸張可能な文字列バッファsig..end
このモジュールは必要に応じて自動的に伸張する文字列バッファを実装します。
このバッファにより、文字列の累積的な連結が準線型時間で実現できます
(これに対して、複数の文字列をふたつずつ順に連結すると O(n2) オーダーの時間がかかります)。
type t
val create : int -> tcreate n は初期状態として空の新しいバッファを返します。
引数 n はバッファの内容を格納する文字列の初期サイズです。
この文字列はバッファに n 文字を越える文字を格納しようとすると自動的に再割り当てされ、 reset が呼び出されると n 文字に切り詰められます。
性能を最大化するためには、 n はバッファに格納される文字数と同じ桁数にしておくのがよいでしょう(例えば、出力用の行バッファであれば 80)。
ただし、 n を越えてバッファが伸張しても何の問題もありません。
適切な値が不確かな場合には、例えば n = 16 としておきましょう。
n が 1 から Sys.max_string_length の範囲にない場合には、この範囲に切り詰められます。val contents : t -> stringval sub : t -> int -> int -> stringBuffer.sub b off len はバッファ b の現在の内容の off 番目から len バイト分の長さの部分文字列(のコピー)を返します。
引数が範囲外であった場合には Invalid_argument 例外が発生します。
バッファ自体は何の影響も受けません。val blit : t -> int -> string -> int -> int -> unitBuffer.blit src srcoff dst dstoff len はバッファ src の現在の内容の srcoff 番目の位置から len 文字を、 dst の dstoff 番目にコピーします。
srcoff と len がバッファ src の適切な部分文字列を表さないか、 dstoff と len が dst の適切な部分文字列を表さない場合には Invalid_argument 例外が発生します。
Since 3.11.2
val nth : t -> int -> charInvalid_argument 例外が発生します。val length : t -> intval clear : t -> unitval reset : t -> unitBuffer.create n で確保された長さ n の初期文字列と取り替えます。
長く使われ大きく伸張したバッファについては、 reset を使うことでバッファの使用している空間を速やかに再利用させることができるようになります。val add_char : t -> char -> unitadd_char b c はバッファ b の末尾に文字 c を追加します。val add_string : t -> string -> unitadd_string b s はバッファ b の末尾に文字列 s を追加します。val add_substring : t -> string -> int -> int -> unitadd_substring b s ofs len は文字列 s の ofs 文字目から len 文字の文字列を取り出し、それをバッファ b の末尾に追加します。val add_substitute : t -> (string -> string) -> string -> unitadd_substitute b f s は文字列パターン s に置換処理をほどこしてバッファ b の末尾に追加します。
置換処理では、パターン中から変数を探し出し、各変数名を f に適用して得られた値で置き換えます。
文字列パターン中で、変数はエスケープされていない $ で始まる以下のいずれかです。
_ の空でない並び$ をエスケープされた $ とします。
これは $ そのものを表します。
変数名を囲む括弧の閉じ括弧が見つからない場合には Not_found 例外が発生します。val add_buffer : t -> t -> unitadd_buffer b1 b2 は バッファ b2 の現在の内容を b1 の末尾に追加します。
b2 は変更されません。val add_channel : t -> in_channel -> int -> unitadd_channel b ic n は入力チャネル ic からちょうど n 文字読み込み、それをバッファ b の末尾に格納します。
チャネルが n 文字以下しか格納していなかった場合には End_of_file 例外が発生します。val output_buffer : out_channel -> t -> unitoutput_buffer oc b はバッファ b の現在の内容を出力チャネル oc に書き込みます。