github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/compress/lzw/writer.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package lzw 6 7 import ( 8 "github.com/shogo82148/std/io" 9 ) 10 11 // WriterはLZWコンプレッサーです。データの圧縮形式を 12 // 下層のライターに書き込みます( [NewWriter] を参照)。 13 type Writer struct { 14 // wは圧縮バイトが書き込まれるライターです。 15 w writer 16 17 // order, write, bits, nBits, and widthは、 18 // コードストリームをバイトストリームに変換するための状態です。 19 order Order 20 write func(*Writer, uint32) error 21 bits uint32 22 nBits uint 23 width uint 24 // litWidthはリテラルコードのビット幅です。 25 litWidth uint 26 27 // hiは次のコード生成によって暗示されるコードです。 28 // overflowはhiがコードの幅を超えるコードです。 29 hi, overflow uint32 30 31 // savedCodeは最新のWrite呼び出しの終わりに蓄積されるコードです。 32 // もしWrite呼び出しがなかった場合、invalidCodeと等しいです。 33 savedCode uint32 34 35 // err は書き込み中に最初に発生したエラーです。ライターをクローズすると、 36 // 以降の書き込み呼び出しは errClosed を返します。 37 err error 38 39 // tableは20ビットのキーから12ビットの値へのハッシュテーブルです。各テーブルエントリにはkey<<12|valが含まれており、衝突は線形探査法によって解決されます。キーは12ビットのコード接頭辞と8ビットのバイト接尾辞で構成されます。値は12ビットのコードです。 40 table [tableSize]uint32 41 } 42 43 // Writeはpの圧縮された表現をwの基になるライターに書き込みます。 44 func (w *Writer) Write(p []byte) (n int, err error) 45 46 // Closeは [Writer] を閉じ、保留中の出力をフラッシュします。wの基になるライターは閉じません。 47 func (w *Writer) Close() error 48 49 // Resetは [Writer] の状態をクリアし、新しい [Writer] として再利用できるようにします。 50 func (w *Writer) Reset(dst io.Writer, order Order, litWidth int) 51 52 // NewWriterは新しい [io.WriteCloser] を作成します。 53 // 返された [io.WriteCloser] に書き込まれたデータは圧縮され、wに書き込まれます。 54 // 書き込みが完了した場合、呼び出し元の責任で [io.WriteCloser] をCloseする必要があります。 55 // リテラルコードに使用するビット数であるlitWidthは、範囲[2,8]内でなければなりませんが、通常は8です。 56 // 入力バイトは1<<litWidth未満でなければなりません。 57 // 58 // 返された [io.WriteCloser] の基になる型が [*Writer] であることが保証されます。 59 func NewWriter(w io.Writer, order Order, litWidth int) io.WriteCloser