File: i_base_info.rb

package info (click to toggle)
ruby-gir-ffi 0.16.1-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 924 kB
  • sloc: ruby: 6,849; makefile: 4
file content (143 lines) | stat: -rw-r--r-- 4,441 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# frozen_string_literal: true

module GObjectIntrospection
  # Wraps GIBaseInfo struct, the base \type for all info types.
  # Decendant types will be implemented as needed.
  class IBaseInfo
    def initialize(ptr)
      raise ArgumentError, "ptr must not be null" if ptr.null?

      ObjectSpace.define_finalizer self, self.class.make_finalizer(ptr)

      @pointer = ptr
    end

    attr_reader :pointer

    def self.make_finalizer(ptr)
      proc { finalize ptr }
    end

    class << self
      protected

      def finalize(ptr)
        Lib.g_base_info_unref ptr
      end
    end

    def to_ptr
      @pointer
    end

    # This is a helper method to construct a method returning an array, out
    # of the methods returning their number and the individual elements.
    #
    # For example, given the methods +n_foos+ and +foo+(+i+), this method
    # will create an additional method +foos+ returning all foos.
    #
    # Provide the second parameter if the plural is not trivially
    # constructed by adding +s+ to the singular.
    #
    # Examples:
    #
    #   build_array_method :fields
    #   build_array_method :properties, :property
    #   build_array_method :get_methods
    #
    def self.build_array_method(method, single = nil)
      method = method.to_s
      cache_ivar = "@#{method}_cache"
      single ||= method[0..-2]
      count = method.sub(/^(get_)?/, "\\1n_")
      class_eval <<-CODE, __FILE__, __LINE__ + 1
        def #{method}                       # def fields
          #{cache_ivar} ||=                 #   @fields_cache ||=
            (0..(#{count} - 1)).map do |i|  #     (0..(n_fields - 1)).map do |i|
              #{single} i                   #       field i
            end                             #     end
        end                                 # end
      CODE
    end

    # This is a helper method to construct a method for finding an element, out
    # of the methods returning their number and the individual elements.
    #
    # For example, given the methods +n_foos+ and +foo+(+i+), this method will
    # create an additional method +find_foo+ returning the foo with the
    # matching name.
    #
    # Optionally provide counter and fetcher methods if they cannot be
    # trivially derived from the finder method.
    #
    # Examples:
    #
    #   build_finder_method :find_field
    #   build_finder_method :find_property, :n_properties
    #   build_finder_method :find_method, :get_n_methods, :get_method
    #
    def self.build_finder_method(method, counter = nil, fetcher = nil)
      method = method.to_s
      cache_ivar = "@#{method}_cache"
      single = method.sub(/^find_/, "")
      counter ||= "n_#{single}s"
      fetcher ||= single
      class_eval <<-CODE, __FILE__, __LINE__ + 1
        def #{method}(name)           # def find_field(name)
          #{cache_ivar} ||= begin     #   @find_field_cache ||= begin
              hash = {}               #       hash = {}
              #{counter}.times do |i| #       n_fields.times do |i|
                it = #{fetcher}(i)    #         it = field(i)
                hash[it.name] = it    #         hash[it.name] = it
              end                     #       end
              hash                    #       hash
            end                       #     end
          name = name.to_s            #   name = name.to_s
          #{cache_ivar}[name]         #   @find_field_cache[name]
        end                           # end
      CODE
    end

    def name
      @name ||= Lib.g_base_info_get_name self
    end

    def info_type
      @info_type ||= Lib.g_base_info_get_type self
    end

    def namespace
      @namespace ||= Lib.g_base_info_get_namespace self
    end

    def safe_namespace
      namespace.sub(/^[a-z]/, &:upcase)
    end

    def container
      @container ||= begin
                       ptr = Lib.g_base_info_get_container self
                       unless ptr.null?
                         Lib.g_base_info_ref ptr
                         IRepository.wrap_ibaseinfo_pointer ptr
                       end
                     end
    end

    def deprecated?
      Lib.g_base_info_is_deprecated self
    end

    def attribute(name)
      Lib.g_base_info_get_attribute self, name
    end

    def self.wrap(ptr)
      new ptr unless ptr.null?
    end

    def ==(other)
      other.is_a?(IBaseInfo) && Lib.g_base_info_equal(self, other)
    end
  end
end