Skip to content

Commit c02683a

Browse files
Watson1978claude
andcommitted
IO::Buffer: ビット演算の 8 メソッドを追加
& | ^ ~ and! or! xor! not! を追加した。8 つとも 3.2 からなので #%since 3.2 で囲む (3.1 には無いことを実機で確認)。 説明がほぼ同じものはまとめ、4 エントリで表現している。 & | ^ で 1 つ、~ で 1 つ、and! or! xor! で 1 つ、not! で 1 つ。 ri に書かれていないが実機で確認した挙動を補った。 - 空のマスクを渡すと IO::Buffer::MaskError が発生する。rurema#3295 で収録した 例外クラスの発生条件が、これで文書化される。 - 読み取り専用のバッファに破壊版を呼ぶと IO::Buffer::AccessError が発生する。 - 破壊版の返り値は self。 - マスクが元より短い場合は先頭から繰り返し適用される (ri にも記載あり)。 ri の & の例は結果を +4 と表示しているが、実際は元と同じ 10 バイトになる (| の例は +10 で正しい)。例をそのまま写さず p buf.size # => 10 を明示した。 IO::Buffer.for はブロックを渡さないと読み取り専用になるため、破壊版の例では dup で複製している。その理由を例のコメントに書いた。 記載した例は 3.2 / 3.3 / 3.4 / 4.0 で実行して出力が一致することを確認した。 rake check_links はいずれの版も master と同数 (3.1: 225 / 3.2: 256 / 4.0: 257)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 81f7f59 commit c02683a

1 file changed

Lines changed: 82 additions & 0 deletions

File tree

manual/api/_builtin/IO__Buffer.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,3 +825,85 @@ p IO::Buffer.new(4).readonly? # => false
825825

826826
プライベートバッファに加えた変更は、元になったファイルのマッピングには反映されません。
827827
#%end
828+
829+
#%since 3.2
830+
### def &(mask) -> IO::Buffer
831+
### def |(mask) -> IO::Buffer
832+
### def ^(mask) -> IO::Buffer
833+
834+
バッファの各バイトと mask の各バイトのビット演算(AND / OR / XOR)を行い、
835+
結果を格納した新しいバッファを返します。
836+
837+
返されるバッファの大きさは元のバッファと同じです。
838+
mask が元のバッファより短い場合は、mask を先頭から繰り返し使います。
839+
840+
- **param** `mask` -- マスクを [c:IO::Buffer] で指定します。
841+
842+
- **raise** `IO::Buffer::MaskError` -- mask の大きさが 0 の場合に発生します。
843+
844+
```ruby
845+
# 4 バイトのマスクが 10 バイトに繰り返し適用される
846+
buf = IO::Buffer.for("1234567890") & IO::Buffer.for("\xFF\x00\x00\xFF")
847+
p buf.size # => 10
848+
p buf.get_string.bytes.map {|b| "%02x" % b }.join(" ") # => "31 00 00 34 35 00 00 38 39 00"
849+
```
850+
851+
- **SEE** [m:IO::Buffer#and!], [m:IO::Buffer#or!], [m:IO::Buffer#xor!]
852+
853+
### def ~ -> IO::Buffer
854+
855+
バッファの各バイトのビットを反転した、新しいバッファを返します。
856+
857+
返されるバッファの大きさは元のバッファと同じです。
858+
859+
```ruby
860+
buf = ~IO::Buffer.for("1234567890")
861+
p buf.size # => 10
862+
p buf.get_string.bytes.map {|b| "%02x" % b }.join(" ") # => "ce cd cc cb ca c9 c8 c7 c6 cf"
863+
```
864+
865+
- **SEE** [m:IO::Buffer#not!]
866+
867+
### def and!(mask) -> self
868+
### def or!(mask) -> self
869+
### def xor!(mask) -> self
870+
871+
[m:IO::Buffer#&] などと同じビット演算を、新しいバッファを作らずに
872+
自身に対して行います。`self` を返します。
873+
874+
mask が自身より短い場合は、mask を先頭から繰り返し使います。
875+
876+
- **param** `mask` -- マスクを [c:IO::Buffer] で指定します。
877+
878+
- **raise** `IO::Buffer::MaskError` -- mask の大きさが 0 の場合に発生します。
879+
880+
- **raise** `IO::Buffer::AccessError` -- 読み取り専用のバッファに対して
881+
呼び出した場合に発生します。
882+
883+
```ruby
884+
# IO::Buffer.for はブロックを渡さないと読み取り専用になるので、dup で複製する
885+
buf = IO::Buffer.for("1234567890").dup
886+
buf.and!(IO::Buffer.for("\xFF\x00\x00\xFF"))
887+
p buf.get_string.bytes.map {|b| "%02x" % b }.join(" ") # => "31 00 00 34 35 00 00 38 39 00"
888+
889+
IO::Buffer.for("1234").and!(IO::Buffer.for("\xFF")) # ~> IO::Buffer::AccessError
890+
```
891+
892+
- **SEE** [m:IO::Buffer#&], [m:IO::Buffer#|], [m:IO::Buffer#^]
893+
894+
### def not! -> self
895+
896+
[m:IO::Buffer#~] と同じビット反転を、新しいバッファを作らずに
897+
自身に対して行います。`self` を返します。
898+
899+
- **raise** `IO::Buffer::AccessError` -- 読み取り専用のバッファに対して
900+
呼び出した場合に発生します。
901+
902+
```ruby
903+
buf = IO::Buffer.for("1234567890").dup
904+
buf.not!
905+
p buf.get_string.bytes.map {|b| "%02x" % b }.join(" ") # => "ce cd cc cb ca c9 c8 c7 c6 cf"
906+
```
907+
908+
- **SEE** [m:IO::Buffer#~]
909+
#%end

0 commit comments

Comments
 (0)