streamio
alloc/io の stream std の stdin/stdout と buffered sink へ
目的
std/stdioが持 つ stdin/stdout の入口 を、reboot後 のalloc/iotrait群 とread/write/flush/closeの共通名 へ載 せ替 えます。- binary stream を
基準 にしつつ text helper と buffered stdout sink を併設 し、kpwrite/kpreadや将来 の file/socket stream の昇格 先 を用意 します。
注意
現在 のstd/stdioは error code を外部 へ公開 していないため、StdoutStream/StdinStream/StreamWriterの impl は失敗 を詳細化 できません。現状 は成功として丸 めます。- stdin の text read は
std/stdio.read_allに従 い、現状 では 4096 byte までの固定長 読 み込 みです。 - stdin の byte read と
StreamScannerは、binary経路 として EOF までの全体 をByteBuf/ scanner buffer に保持 します。
計算量
- byte/text の
相互 変換 は O(n) です。 - buffered sink の append は O(len) / O(桁数)、flush は
現在 の保留 byte数 を n として O(n) です。
#entry main
#target std
#import "std/streamio" as *
#import "std/iotarget" as *
fn main <()*>i32> ():
let bytes0 <ByteBuf> stream_bytes_from_str "ab";
let _len <i32> io_bytebuf_len bytes0;
let sc <StreamScanner> unwrap_ok open ReadStream::Text "1 2";
let a <i32> read sc;
let b <i32> read sc;
close sc;
unwrap_ok open WriteStream::Stdio
|> write "x"
|> writeln add a b
|> close;
0StdinStream
目的
alloc/ioの reader trait群 に stdin を載 せるための具体型 を与 えます。
注意
内部 状態 を持 たないのでCopy/Cloneを実装 します。
StdoutStream
目的
alloc/ioの write / flush / close trait群 に stdout を載 せるための具体型 を与 えます。
注意
内部 状態 を持 たないのでCopy/Cloneを実装 します。
TextInputStream
in-memory text を stream として
目的
ReadStream::Text "..."から入力 stream を作 り、stdin や file read と同 じread面 へ載 せます。
注意
現在 は全読込 helper だけを想定 した in-memory source です。
ByteInputStream
raw binary を stream として
目的
ReadStream::Bytes bytesから binary input stream を作 り、stdin や file read と同 じread面 へ載 せます。
注意
bytesは stream内部 へ所有権 ごと移動 します。
StreamScanner
read target を token
目的
kpreadにあった token parser の中核 をstd側へ昇格 し、stdin / in-memory text / binary / file を同 じ scanner面 へ載 せます。
注意
- scanner handle
自体 は軽量 なのでCopy/Cloneを実装 します。 - copy / clone は
同 じ cursor と buffer を共有 する alias です。readを進 めると、ほかの alias から見 える位置 も進 みます。 - buffer の
解放 はcloseが担当 するので、alias を作 った場合 でもcloseは最後 に 1回 だけ呼 んでください。 別々 にopenした scanner同士 は状態 を共有 しないので、複数 の stream を同時 に維持 できます。
StreamWriter
write target へ
目的
kpwriteなどの buffered write中核 をstdへ昇格 し、競技向け helper 以外でも再利用 できるようにします。
注意
内部 で確保 した書 き込 み buffer を所有 するためCopy/Cloneは実装 しません。使 い終 わったらcloseで解放 してください。flushは出力 のみを行 い、所有権 は維持 します。現在 の target kind は stdout だけです。各 writer は独立 した buffer を持 つため、複数 の reader / writer を同時 に保持 できます。
stream_bytes_from_str
str を byte
目的
- text helper と binary helper の
橋渡 しとして、strを連続 byte buffer へ複製 します。
stream_bytes_to_str
byte str として
目的
- binary stream の
内容 を text helper へ渡 したい場合 の最小 変換 を提供 します。
実装
- UTF-8
検証 は行 わず、byte列 をそのままstr表現 へ移 します。
open
read target から scanner を
目的
- stdin / in-memory text / binary buffer / file path を、1
個 のopen入口 で token scanner へ載 せます。 ReadStreamだけを受 け付 けることで、open WriteStream::Stdioのような誤用 を compile error にします。
実装
- target ごとに byte
列 へ正規化 してから header を確保 し、buf ptr/len/posを保持 します。
注意
- file read
失敗 や確保 失敗 はResult::Errに丸 めます。
skip_ws
ASCII
is_eof
token が
skip
scan_token_impl
str として
scan_i32_impl
i32 として
scan_u32_impl
u32 として
scan_u64_impl
u64 として
scan_i64_impl
i64 として
scan_f64_impl
f64 として
scan_f32_impl
f32 として
open
write target へ
目的
- stdout などの write target を
指定 して、buffered sink を生成 します。 WriteStreamだけを受 け付 けることで、open ReadStream::Stdioのような誤用 を compile error にします。
実装
現在 はWriteStream::Stdioだけを受 け付 け、header に target kind を記録 します。
注意
未対応 target はResult::Errを返 します。
close
buffered sink の
注意
- 未 flush の
内容 は捨 てられます。必要 なら先 にflushを呼 んでください。
drain_impl
buffered sink の
実装
std/stdio.stdio_write_memを使 い、partial write を吸収 しながら保留 byte列 を出力 します。
計算量
現在 の書 き込 み長 さを n として O(n) です。
reserve_impl
need byte
注意
- need が capacity を
超 える case は呼 び出 し側 で避 けてください。この版 では buffer拡張 ではなく flush を選 びます。
push_u8_impl
1 byte
計算量
通常 は O(1) で、flush が入 ると O(len) です。
push_newline_impl
を 1 byte
append_str_impl
str を buffered sink へ
注意
strは[len][bytes]形式 なので、bytes先頭 はstring_data_ptrで得 ます。
append_i32_impl
i32 を 10
実装
INT_MINは絶対値 が overflow するため定数 文字列 で処理 します。- それ
以外 は桁数 を数 えて末尾 から埋 めます。
append_u32_impl
u32 を 10
append_u64_impl
u64 を 10
append_i64_impl
i64 を
append_f64_fixed_impl
f64 を
注意
NaN/infは未対応 です。
append_f64_impl
f64 を
append_f32_fixed_impl
f32 を
append_f32_impl
f32 を
StreamWritable
StreamWriter へ
ScannerReadable
StreamScanner から
read
StreamScanner から token /
目的
- suffix
付 き API を残 さず、read scの 1個 の名前 へ統一 します。
注意
型引数 または受 け側 の型注釈 で読 む型 を決 めます。
write
StreamWriter へ text を
目的
StreamWriterの text /数値 出力 を trait dispatch で 1個 のwriteへ集約 し、公開面に型 suffix を残 しません。
write
pipe StreamWriter へ
writeln
StreamWriter へ
writeln
pipe StreamWriter へ
flush
StreamWriter の
StreamReadableResult
input stream を
StdoutWritable
StdoutStream へ
read
StdinStream を
read
in-memory text stream を
read
in-memory byte stream を
write
StdoutStream へ byte
write
pipe StdoutStream へ byte
writeln
StdoutStream へ text と
を
writeln
pipe StdoutStream へ text と
を
flush
StdoutStream の
close
StreamScanner を
close
StdinStream を
close
TextInputStream を
close
ByteInputStream を
close
StdoutStream を