NEPLg2 Standard Library - streamio - streamio
Web Playground
Web Playground

streamio

alloc/io の stream 抽象ちゅうしょうstd の stdin/stdout と buffered sink へ接続せつぞくする facade

目的もくてき

  • std/stdioつ stdin/stdout の入口いりぐちを、reboot alloc/io trait ぐん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) です。
TEST
#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;
    0

StdinStream

標準入力ひょうじゅんにゅうりょくあらわ軽量けいりょう handle

目的もくてき

  • alloc/io の reader trait ぐんに stdin をせるための具体型ぐたいかたあたえます。

注意ちゅうい

  • 内部ないぶ状態じょうたいたないので Copy / Clone実装じっそうします。

StdoutStream

標準出力ひょうじゅんしゅつりょくあらわ軽量けいりょう handle

目的もくてき

  • alloc/io の write / flush / close trait ぐんに stdout をせるための具体型ぐたいかたあたえます。

注意ちゅうい

  • 内部ないぶ状態じょうたいたないので Copy / Clone実装じっそうします。

TextInputStream

in-memory text を stream としてあつか軽量けいりょう handle

目的もくてき

  • ReadStream::Text "..." から入力にゅうりょく stream をつくり、stdin や file read とおなread めんせます。

注意ちゅうい

  • 現在げんざい全読込ぜんよみこみ helper だけを想定そうていした in-memory source です。

ByteInputStream

raw binary を stream としてあつかう in-memory input handle

目的もくてき

  • ReadStream::Bytes bytes から binary input stream をつくり、stdin や file read とおなread めんせます。

注意ちゅうい

  • bytes は stream 内部ないぶ所有権しょゆうけんごと移動いどうします。

StreamScanner

read target を token 単位たんい走査そうさする scanner

目的もくてき

  • 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 へ追記ついきしていく buffered sink

目的もくてき

  • 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 空白くうはく先頭せんとう BOM をばす

is_eof

token がのこっていないか確認かくにんする

skip

現在げんざい token を 1 消費しょうひする

scan_token_impl

つぎの token を str として

scan_i32_impl

つぎの token を i32 として

scan_u32_impl

つぎの token を u32 として

scan_u64_impl

つぎの token を u64 として

scan_i64_impl

つぎの token を i64 として

scan_f64_impl

つぎの token を f64 として

scan_f32_impl

つぎの token を f32 として

open

write target へく buffered sink をつく

目的もくてき

  • 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 の内容ないようを stdout へ

実装じっそう

  • 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 しんで buffered sink へ追記ついきする

実装じっそう

  • INT_MIN絶対値ぜったいちが overflow するため定数ていすう文字列もじれつ処理しょりします。
  • それ以外いがい桁数けたすうかぞえて末尾まつびからめます。

append_u32_impl

u32 を 10 しんで buffered sink へ追記ついきする

append_u64_impl

u64 を 10 しん追記ついきする

append_i64_impl

i64符号付ふごうつき 10 しん追記ついきする

append_f64_fixed_impl

f64固定こてい小数点しょうすうてん追記ついきする

注意ちゅうい

  • NaN / inf未対応みたいおうです。

append_f64_impl

f64小数点以下しょうすうてんいか 6 けた追記ついきする

append_f32_fixed_impl

f32固定こてい小数点しょうすうてん追記ついきする

append_f32_impl

f32小数点以下しょうすうてんいか 6 けた追記ついきする

StreamWritable

StreamWriter追記ついきできるあたい能力のうりょく

ScannerReadable

StreamScanner かられるあたい能力のうりょく

read

StreamScanner から token / 数値すうち

目的もくてき

  • suffix き API をのこさず、read sc の 1 名前なまえ統一とういつします。

注意ちゅうい

  • 型引数かたひきすうまたはがわ型注釈かたちゅうしゃくかためます。

write

StreamWriter へ text を追記ついきする共通名きょうつうめい overload

目的もくてき

  • StreamWriter の text / 数値すうち出力しゅつりょくを trait dispatch で 1 write集約しゅうやくし、公開面に型 suffix をのこしません。

write

pipe 終端しゅうたんから StreamWriter追記ついきする overload

writeln

StreamWriter追記ついきして改行かいぎょうする

writeln

pipe 終端しゅうたんから StreamWriter追記ついきして改行かいぎょうする overload

flush

StreamWriter保留中ほりゅうちゅう出力しゅつりょく反映はんえいする共通名きょうつうめい overload

StreamReadableResult

input stream を指定していしたかたとして能力のうりょく

StdoutWritable

StdoutStreamめるあたい能力のうりょく

read

StdinStream指定していしたかたとして

read

in-memory text stream を指定していしたかたとして

read

in-memory byte stream を指定していしたかたとして

write

StdoutStream へ byte れつや text を

write

pipe 終端しゅうたんから StdoutStream へ byte れつや text をく overload

writeln

StdoutStream へ text と つづけて

writeln

pipe 終端しゅうたんから StdoutStream へ text と つづけてく overload

flush

StdoutStream保留中ほりゅうちゅう出力しゅつりょく反映はんえいする

close

StreamScannerじて内部ないぶ buffer を解放かいほうする

close

StdinStreamじる

close

TextInputStreamじる

close

ByteInputStreamじる

close

StdoutStreamじる