Sha256: 06f4e41ebfd9635f6b94e112ac9c3fc6e267f64920756d5e60932f3450fc74e6

Contents?: true

Size: 1.98 KB

Versions: 1

Compression:

Stored size: 1.98 KB

Contents

module PyBind
  class PyDict
    include Enumerable
    include PyObjectWrapper
    pybind_type LibPython.PyDict_Type

    def self.new(init = nil)
      case init
      when PyObjectStruct
        super
      when nil
        new(LibPython.PyDict_New())
      when Hash
        new.tap do |dict|
          init.each do |key, value|
            dict[key] = value
          end
        end
      else
        raise TypeError, "the argument must be a PyObjectStruct or a Hash"
      end
    end

    def [](key)
      case key
      when String, Symbol
        LibPython.PyDict_GetItemString(@pystruct, key.to_s).to_ruby
      else
        key = key.to_python
        LibPython.PyDict_GetItem(@pystruct, key).to_ruby
      end
    end

    def []=(key, value)
      value = value.to_python
      case key
      when String, Symbol
        LibPython.PyDict_SetItemString(@pystruct, key.to_s, value)
      else
        key = key.to_python
        LibPython.PyDict_SetItem(@pystruct, key, value)
      end
      value
    end

    def delete(key)
      case key
      when String, Symbol
        value = LibPython.PyDict_GetItemString(@pystruct, key).to_ruby
        LibPython.PyDict_DelItemString(@pystruct, key.to_s)
      else
        key = key.to_python
        value = LibPython.PyDict_GetItem(@pystruct, key).to_ruby
        LibPython.PyDict_DelItem(@pystruct, key)
      end
      value
    end

    def size
      LibPython.PyDict_Size(@pystruct)
    end

    def keys
      LibPython.PyDict_Keys(@pystruct).to_ruby
    end

    def values
      LibPython.PyDict_Values(@pystruct).to_ruby
    end

    def has_key?(key)
      key = key.to_python
      value = LibPython.PyDict_Contains(@pystruct, key)
      raise PyError.fetch if value == -1
      value == 1
    end

    def to_a
      LibPython.PyDict_Items(@pystruct).to_ruby
    end

    def to_hash
      Hash[to_a]
    end

    def each
      return enum_for unless block_given?
      keys.each do |key|
        yield key, self[key]
      end
      self
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
pybind-0.1.0 lib/pybind/types/dict.rb