class RbSDL2::RWOps::RWOpsPointer
Public Class Methods
from_memory(mem, size, autoclose: true, readonly: true) { |obj| ... }
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 24 def from_memory(mem, size, autoclose: true, readonly: true) ptr = if readonly ::SDL2.SDL_RWFromConstMem(mem, size) else ::SDL2.SDL_RWFromMem(mem, size) end ptr = RWOpsPointer.new(ptr) raise RbSDL2Error if ptr.null? ptr.autorelease = autoclose obj = allocate obj.__send__(:initialize, ptr, mem) if block_given? begin yield(obj) ensure obj.close end else obj end end
new(file, _mode = "rb", autoclose: true, mode: _mode) { |obj| ... }
click to toggle source
mode は一般的なファイルAPIと同じ文字列が使用できる。
Calls superclass method
# File lib/rb_sdl2/rw_ops.rb, line 47 def new(file, _mode = "rb", autoclose: true, mode: _mode) ptr = RWOpsPointer.new(::SDL2.SDL_RWFromFile(file.to_s, mode)) raise RbSDL2Error if ptr.null? ptr.autorelease = autoclose obj = super(ptr, file) if block_given? begin yield(obj) ensure obj.close end else obj end end
Also aliased as: open
new(ptr, obj = nil)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 88 def initialize(ptr, obj = nil) @obj = obj @ptr = ptr end
release(ptr)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 5 def release(ptr) # SDL_RWclose は RWOps構造体を開放する。そのため呼び出しは1回しかできない。 # ::FFI::AutoPointer を使うことで2重開放を防ぐ。 err = ::SDL2.SDL_RWclose(ptr) raise RbSDL2Error if err < 0 end
with_object(io, autoclose: true) { |obj| ... }
click to toggle source
io 引数には Ruby の IO オブジェクトのように振る舞うオブジェクトを与える。 オブジェクトは自動的にクローズされない。(close が呼ばれた場合はクローズする) autoclose オプション引数に false を与えて、RWOps#to_ptr から取り出したポインターを C のスコープへ渡す場合、ポインターが利用されている間 RWOps
オブジェクトを生存させる必要がある。
# File lib/rb_sdl2/rw_ops.rb, line 70 def with_object(io, autoclose: true) rw = RWOperator.new(io) ptr = rw.to_ptr ptr.autorelease = autoclose obj = allocate obj.__send__(:initialize, ptr, rw) if block_given? begin yield(obj) ensure obj.close end else obj end end
Public Instance Methods
autoclose=(bool)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 93 def autoclose=(bool) @ptr.autorelease = bool end
autoclose?(= @ptr.autorelease?)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 97 def autoclose? = @ptr.autorelease? def close = @ptr.free def closed? = @ptr.released? def inspect "#<#{self.class.name}:#{@obj.inspect}>" end def read(length = nil) raise IOError if closed? len = length.nil? ? size : length.to_i raise ArgumentError if len < 0 return "" if len == 0 ptr = ::FFI::MemoryPointer.new(len) num = ::SDL2.SDL_RWread(self, ptr, 1, len) raise RbSDL2Error if num == 0 ptr.read_bytes(num) end def seek(offset, whence = IO::SEEK_SET) raise IOError if closed? raise RbSDL2Error if ::SDL2.SDL_RWseek(self, offset, whence) == -1 0 end def size raise IOError if closed? num = ::SDL2.SDL_RWsize(self) raise RbSDL2Error if num < 0 num end def to_ptr raise IOError if closed? @ptr end def write(*str) raise FrozenError if frozen? raise IOError if closed? str.inject(0) do |sum, obj| bytes = obj.to_s len = bytes.size ptr = ::FFI::MemoryPointer.new(len).write_bytes(bytes) num = ::SDL2.SDL_RWwrite(self, ptr, 1, len) raise RbSDL2Error if num < len sum + len end end end
close(= @ptr.free)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 99 def close = @ptr.free def closed? = @ptr.released? def inspect "#<#{self.class.name}:#{@obj.inspect}>" end def read(length = nil) raise IOError if closed? len = length.nil? ? size : length.to_i raise ArgumentError if len < 0 return "" if len == 0 ptr = ::FFI::MemoryPointer.new(len) num = ::SDL2.SDL_RWread(self, ptr, 1, len) raise RbSDL2Error if num == 0 ptr.read_bytes(num) end def seek(offset, whence = IO::SEEK_SET) raise IOError if closed? raise RbSDL2Error if ::SDL2.SDL_RWseek(self, offset, whence) == -1 0 end def size raise IOError if closed? num = ::SDL2.SDL_RWsize(self) raise RbSDL2Error if num < 0 num end def to_ptr raise IOError if closed? @ptr end def write(*str) raise FrozenError if frozen? raise IOError if closed? str.inject(0) do |sum, obj| bytes = obj.to_s len = bytes.size ptr = ::FFI::MemoryPointer.new(len).write_bytes(bytes) num = ::SDL2.SDL_RWwrite(self, ptr, 1, len) raise RbSDL2Error if num < len sum + len end end end end
closed?(= @ptr.released?)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 101 def closed? = @ptr.released? def inspect "#<#{self.class.name}:#{@obj.inspect}>" end def read(length = nil) raise IOError if closed? len = length.nil? ? size : length.to_i raise ArgumentError if len < 0 return "" if len == 0 ptr = ::FFI::MemoryPointer.new(len) num = ::SDL2.SDL_RWread(self, ptr, 1, len) raise RbSDL2Error if num == 0 ptr.read_bytes(num) end def seek(offset, whence = IO::SEEK_SET) raise IOError if closed? raise RbSDL2Error if ::SDL2.SDL_RWseek(self, offset, whence) == -1 0 end def size raise IOError if closed? num = ::SDL2.SDL_RWsize(self) raise RbSDL2Error if num < 0 num end def to_ptr raise IOError if closed? @ptr end def write(*str) raise FrozenError if frozen? raise IOError if closed? str.inject(0) do |sum, obj| bytes = obj.to_s len = bytes.size ptr = ::FFI::MemoryPointer.new(len).write_bytes(bytes) num = ::SDL2.SDL_RWwrite(self, ptr, 1, len) raise RbSDL2Error if num < len sum + len end end end
free()
click to toggle source
Calls superclass method
# File lib/rb_sdl2/rw_ops.rb, line 13 def free @released = true super end
inspect()
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 103 def inspect "#<#{self.class.name}:#{@obj.inspect}>" end
read(length = nil)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 107 def read(length = nil) raise IOError if closed? len = length.nil? ? size : length.to_i raise ArgumentError if len < 0 return "" if len == 0 ptr = ::FFI::MemoryPointer.new(len) num = ::SDL2.SDL_RWread(self, ptr, 1, len) raise RbSDL2Error if num == 0 ptr.read_bytes(num) end
released?(= @released)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 18 def released? = @released end
seek(offset, whence = IO::SEEK_SET)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 118 def seek(offset, whence = IO::SEEK_SET) raise IOError if closed? raise RbSDL2Error if ::SDL2.SDL_RWseek(self, offset, whence) == -1 0 end
size()
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 124 def size raise IOError if closed? num = ::SDL2.SDL_RWsize(self) raise RbSDL2Error if num < 0 num end
to_ptr()
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 131 def to_ptr raise IOError if closed? @ptr end
write(*str)
click to toggle source
# File lib/rb_sdl2/rw_ops.rb, line 136 def write(*str) raise FrozenError if frozen? raise IOError if closed? str.inject(0) do |sum, obj| bytes = obj.to_s len = bytes.size ptr = ::FFI::MemoryPointer.new(len).write_bytes(bytes) num = ::SDL2.SDL_RWwrite(self, ptr, 1, len) raise RbSDL2Error if num < len sum + len end end