Sha256: 380e1f422828cad71ed75c8faf4df78b4d6a0c5810695f4ff8182ef0011658f1

Contents?: true

Size: 1.62 KB

Versions: 3

Compression:

Stored size: 1.62 KB

Contents

# frozen_string_literal: true

module GirFFI
  # Base module providing class methods for generated classes representing GLib
  # structs, unions and boxed types.
  module StructLikeBase
    def self.included(base)
      base.extend ClassMethods
    end

    # Class methods for struct-like classes.
    module ClassMethods
      def native_type
        FFI::Type::Struct.new(self::Struct)
      end

      def to_ffi_type
        self
      end

      # NOTE: Needed for JRuby's FFI
      def to_native(value, _context)
        value.struct
      end

      def get_value_from_pointer(pointer, offset)
        pointer + offset
      end

      def size
        self::Struct.size
      end

      def copy_value_to_pointer(value, pointer, offset = 0)
        bytes = value.to_ptr.read_bytes(size)
        pointer.put_bytes offset, bytes
      end

      # Create an unowned copy of the struct represented by val
      def copy_from(val)
        return unless val
        disown copy from(val)
      end

      # Wrap an owned copy of the struct represented by val
      def wrap_copy(val)
        return unless val
        own copy(val)
      end

      # Wrap value and take ownership of it
      def wrap_own(val)
        return unless val
        return if val.null?
        own wrap(val)
      end

      private

      def own(val)
        val.struct.owned = true
        val
      end

      def disown(val)
        val.struct.owned = nil
        val
      end

      # Create a copy of the struct represented by val
      def copy(val)
        new.tap do |copy|
          copy_value_to_pointer(val, copy.to_ptr)
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
gir_ffi-0.13.0 lib/gir_ffi/struct_like_base.rb
gir_ffi-0.12.1 lib/gir_ffi/struct_like_base.rb
gir_ffi-0.12.0 lib/gir_ffi/struct_like_base.rb