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