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
open(file, _mode = "rb", autoclose: true, mode: _mode)
Alias for: new
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