Sha256: 33d6b883960a3ed1dde867b2fa33f92e893c43322c2c5c483bf5e8c0c5a4e0a8

Contents?: true

Size: 1.76 KB

Versions: 3

Compression:

Stored size: 1.76 KB

Contents

module GLib
  load_class :HashTable

  # Overrides for GHashTable, GLib's hash table implementation.
  class HashTable
    include Enumerable
    attr_accessor :key_type
    attr_accessor :value_type

    def each
      prc = Proc.new {|keyptr, valptr, userdata|
        key = GirFFI::ArgHelper.cast_from_pointer key_type, keyptr
        val = GirFFI::ArgHelper.cast_from_pointer value_type, valptr
        yield key, val
      }
      ::GLib::Lib.g_hash_table_foreach self.to_ptr, prc, nil
    end

    def to_hash
      Hash[self.to_a]
    end

    def insert key, value
      keyptr = GirFFI::InPointer.from key_type, key
      valptr = GirFFI::InPointer.from value_type, value
      ::GLib::Lib.g_hash_table_insert self.to_ptr, keyptr, valptr
    end

    class << self
      undef :new
      def new  keytype, valtype
        hash_fn, eq_fn = case keytype
                         when :utf8
                           lib = ::GLib::Lib.ffi_libraries.first
                           [ FFI::Function.new(:uint, [:pointer], lib.find_function("g_str_hash")),
                             FFI::Function.new(:int, [:pointer, :pointer], lib.find_function("g_str_equal"))]
                         else
                           [nil, nil]
                         end
        wrap(keytype, valtype, Lib.g_hash_table_new(hash_fn, eq_fn))
      end

      def wrap keytype, valtype, ptr
        super(ptr).tap do |it|
          break if it.nil?
          it.key_type = keytype
          it.value_type = valtype
        end
      end

      def from_hash keytype, valtype, hash
        return nil if hash.nil?
        return hash if hash.is_a? self
        ghash = self.new keytype, valtype
        hash.each do |key, val|
          ghash.insert key, val
        end
        ghash
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
gir_ffi-0.2.2 lib/ffi-glib/hash_table.rb
gir_ffi-0.2.1 lib/ffi-glib/hash_table.rb
gir_ffi-0.2.0 lib/ffi-glib/hash_table.rb