Sha256: c057fb753956da0efbae156e2da6104a5fd200a67b5400beda6038d754308cb4

Contents?: true

Size: 1.16 KB

Versions: 3

Compression:

Stored size: 1.16 KB

Contents

module GirFFI
  # Represents a null-terminated array.
  class ZeroTerminated
    include Enumerable

    attr_reader :element_type

    def initialize elm_t, ptr
      @element_type = elm_t
      @ptr = ptr
    end

    def to_ptr
      @ptr
    end

    def self.from type, arg
      new type, InPointer.from_array(type, arg)
    end

    def self.wrap type, arg
      new type, arg
    end

    def each
      return if @ptr.null?
      offset = 0
      while (val = read_value(offset))
        offset += ffi_type_size
        yield wrap_value(val)
      end
    end

    def == other
      to_a == other.to_a
    end

    private

    def read_value offset
      val = @ptr.send(getter_method, offset)
      val unless val.zero?
    end

    def getter_method
      @getter_method ||= "get_#{ffi_type}"
    end

    def wrap_value val
      case element_type
      when Array
        element_type.last.wrap val
      when Class
        element_type.wrap val
      else
        val
      end
    end

    def ffi_type
      @ffi_type ||= TypeMap.type_specification_to_ffitype element_type
    end

    def ffi_type_size
      @ffi_type_size ||= FFI.type_size(ffi_type)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
gir_ffi-0.7.8 lib/gir_ffi/zero_terminated.rb
gir_ffi-0.7.7 lib/gir_ffi/zero_terminated.rb
gir_ffi-0.7.6 lib/gir_ffi/zero_terminated.rb