module Assimp::StructAccessors

Public Class Methods

extended(mod) click to toggle source
# File lib/assimp/base.rb, line 15
def self.extended(mod)
  mod.instance_variable_set(:@__has_ref, false)
end

Public Instance Methods

has_ref?() click to toggle source
# File lib/assimp/base.rb, line 19
def has_ref?
  @__has_ref
end
struct_array_attr_accessor(*args) click to toggle source
# File lib/assimp/base.rb, line 152
def struct_array_attr_accessor(*args)
  struct_array_attr_reader(*args)
  struct_array_attr_writer(*args)
  struct_array_attr_checker(*args)
end
struct_array_attr_checker(*args) click to toggle source
# File lib/assimp/base.rb, line 143
def struct_array_attr_checker(*args)
  args.each { |attr, klass, count|
    raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
    define_method(:"#{attr}?") do
      ! self[attr].null?
    end
  }
end
struct_array_attr_reader(*args) click to toggle source
# File lib/assimp/base.rb, line 53
def struct_array_attr_reader(*args)
  args.each { |attr, klass, count|
    raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
    t = nil
    s = nil
    if klass.kind_of? Symbol
      t = Assimp::find_type(klass)
      s = t.size
      define_method(attr) do
        n = ( count ? self[count] : self[:"num_#{attr}"] )
        p = self[attr]
        if n == 0 || p.null?
          []
        else
          n.times.collect { |i|
            p.get(t, i*s) 
          }
        end
      end
    elsif klass.kind_of?(Class) && klass < FFI::Struct
      s = klass.size
      define_method(attr) do
        n = ( count ? self[count] : self[:"num_#{attr}"] )
        p = self[attr]
        if n == 0 || p.null?
          []
        else
          n.times.collect { |i|
            klass.new(p+i*s)
          }
        end
      end
    else
      raise "Invalid type: #{klass.inspect} for #{attr.inspect}!"
    end
  }
end
struct_array_attr_writer(*args) click to toggle source
# File lib/assimp/base.rb, line 91
def struct_array_attr_writer(*args)
  args.each { |attr, klass, count|
    raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
    @__has_ref = true
    t = nil
    s = nil
    if klass.kind_of? Symbol
      t = Assimp::find_type(klass)
      s = t.size
      define_method(:"#{attr}=") do |values|
        values = [] if values.nil?
        if count
          self[count] = values.length
        else
          self[:"num_#{attr}"] = values.length
        end
        ptr = (values.length == 0 ? nil : FFI::MemoryPointer::new(t, values.length))
        values.each_with_index { |v, i|
          ptr.put(t, i*s, v)
        }
        self.instance_variable_set(:"@#{attr}", ptr)
        self[attr] = ptr
        values
      end
    elsif klass.kind_of?(Class) && klass < FFI::Struct
      s = klass.size
      k = klass
      define_method(:"#{attr}=") do |values|
        values = [] if values.nil?
        if count
          self[count] = values.length
        else
          self[:"num_#{attr}"] = values.length
        end
        ptr = (values.length == 0 ? nil : FFI::MemoryPointer::new(klass, values.length))
        values.each_with_index { |v, i|
          ptr.put_array_of_uint8(i*s, v.pointer.read_array_of_uint8(s))
        }
        if k.has_ref?
          self.instance_variable_set(:"@#{attr}", [ptr, values])
        else
          self.instance_variable_set(:"@#{attr}", ptr)
        end
        self[attr] = ptr
        values
      end
    else
      raise "Invalid type: #{klass.inspect} for #{attr.inspect}!"
    end
  }
end
struct_attr_accessor(*args) click to toggle source
# File lib/assimp/base.rb, line 48
def struct_attr_accessor(*args)
  struct_attr_reader(*args)
  struct_attr_writer(*args)
end
struct_attr_reader(*args) click to toggle source
# File lib/assimp/base.rb, line 23
def struct_attr_reader(*args)
  args.each { |attr|
    raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
    if @layout[attr].type.kind_of?( FFI::StructByValue ) && @layout[attr].type.struct_class == Assimp::String
      define_method(attr) { self[attr].data }
    else
      define_method(attr) { self[attr] }
    end
  }
end
struct_attr_writer(*args) click to toggle source
# File lib/assimp/base.rb, line 34
def struct_attr_writer(*args)
  args.each { |attr|
    raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
    if @layout[attr].type.kind_of?( FFI::StructByValue ) && @layout[attr].type.struct_class == Assimp::String
      define_method(attr.to_s+"=") { |o| self[attr].data = o }
    elsif @layout[attr].type.kind_of?( FFI::StructByValue ) && @layout[attr].type.struct_class.has_ref?
      @__has_ref = true
      define_method(attr.to_s+"=") { |o| self.instance_variable_set(:"@#{attr}", o); self[attr] = o }
    else
      define_method(attr.to_s+"=") { |o| self[attr] = o }
    end
  }
end
struct_ref_array_attr_accessor(*args) click to toggle source
# File lib/assimp/base.rb, line 194
def struct_ref_array_attr_accessor(*args)
  struct_ref_array_attr_reader(*args)
  struct_ref_array_attr_writer(*args)
  struct_array_attr_checker(*args)
end
struct_ref_array_attr_reader(*args) click to toggle source
# File lib/assimp/base.rb, line 158
def struct_ref_array_attr_reader(*args)
  args.each { |attr, klass, count|
    raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
    define_method(attr) do
      n = ( count ? self[count] : self[:"num_#{attr}"] )
      p = self[attr]
      if n == 0 || p.null?
        []
      else
        ptrs = p.read_array_of_pointer(self[:"num_#{attr}"])
        ptrs.collect { |ptr| ptr.null? ? nil : klass::new(ptr) }
      end
    end
  }
end
struct_ref_array_attr_writer(*args) click to toggle source
# File lib/assimp/base.rb, line 174
def struct_ref_array_attr_writer(*args)
  args.each { |attr, klass, count|
    raise "Invalid attribute #{attr.inspect}!" unless @layout.members.include?(attr)
    @__has_ref = true
    define_method(:"#{attr}=") do |values|
      values = [] if values.nil?
      if count
        self[count] = values.length
      else
        self[:"num_#{attr}"] = values.length
      end
      ptr = (values.length == 0 ? nil : FFI::MemoryPointer::new(:pointer, values.length))
      ptr.write_array_of_pointer(values.collect(&:pointer)) if ptr
      self.instance_variable_set(:"@#{attr}", [ptr, values.dup])
      self[attr] = ptr
      values
    end
  }
end