Class: ExternObject

Inherits:
Object show all
Extended by:
BangDef, Packer, Unpacker
Defined in:
lib/white_gold/tgui-abi.rb,
lib/white_gold/tgui-abi.rb,
lib/white_gold/abi/extern_object.rb

Constant Summary collapse

@@callback_storage =
{}
@@global_callback_storage =
{}
@@data_storage =
{}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Packer

abi_packer, abi_packer_method_name

Methods included from Unpacker

abi_unpacker, abi_unpacker_method_name

Methods included from BangDef

def!

Constructor Details

#initialize(pointer:, autofree: true) ⇒ ExternObject

Returns a new instance of ExternObject.



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/white_gold/abi/extern_object.rb', line 10

def initialize pointer:, autofree: true
  @pointer = pointer
  
  if autofree
    cl = self.class
    while !cl.respond_to?(:finalizer)
      cl = cl.superclass
    end
    ObjectSpace.define_finalizer(self, cl.proc.finalizer(pointer))
  end
end

Instance Attribute Details

#pointerObject (readonly)

Returns the value of attribute pointer.



25
26
27
# File 'lib/white_gold/abi/extern_object.rb', line 25

def pointer
  @pointer
end

Class Method Details

.abi_attr(name, type = nil, original_name = nil) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/white_gold/abi/extern_object.rb', line 99

def abi_attr name, type = nil, original_name = nil
  if original_name
    if original_name.end_with? "_"
      getter = "#{original_name}#{name}".delete_suffix("?").to_sym
      setter = "set_#{name}".delete_suffix("?").to_sym
    else
      getter = "get_#{original_name}".to_sym
      setter = "set_#{original_name}".to_sym
    end
  else
    if name.end_with? "?"
      getter = "is_#{name}".delete_suffix("?").to_sym
    else 
      getter = "get_#{name}".to_sym
    end
    setter = "set_#{name}".delete_suffix("?").to_sym
  end
  type ||= Boolean if name.end_with? "?"
  abi_def "#{name.to_s.delete_suffix("?")}=".to_sym, setter, type => nil
  abi_def name, getter, nil => type
end

.abi_bit_enum(base, zero, *keywords, **indexed_keywords) ⇒ Object



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/white_gold/abi/extern_object.rb', line 137

def abi_bit_enum base, zero, *keywords, **indexed_keywords
  if base.is_a? Enum
    enum = base
  else
    enum = Enum.new zero, **(keywords.each_with_index.map{[_1, 1 << _2]}.to_h), **indexed_keywords
    const_set base, enum
    enum.name = base
  end
  abi_packer enum do |*o|
    enum.pack(*o)
  end
  abi_unpacker enum do |o|
    enum.unpack(o)
  end
end

.abi_def(name, original_name = nil, **na) ⇒ Object



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
# File 'lib/white_gold/abi/extern_object.rb', line 61

def abi_def name, original_name = nil, **na
  if original_name
    if original_name.end_with? "_"
      abi_name = "_abi_#{original_name}#{name}".delete_suffix("=").delete_suffix("?").to_sym
    else
      abi_name = "_abi_#{original_name}".to_sym
    end
  else
    if name.end_with? "?"
      abi_name = "_abi_is_#{name}".delete_suffix("?").to_sym
    elsif name.end_with? "="
      abi_name = "_abi_set_#{name}".delete_suffix("=").to_sym
    else
      abi_name = "_abi_#{name}".to_sym
    end
  end

  na = {nil => nil} if na.empty?
  interface = na.map{|k, v| Interface.from k, v }.first
  if name.to_s.end_with? "="
    self_abi_def_setter name, abi_name, interface
  else
    self_abi_def name, abi_name, interface
  end
end

.abi_enum(base, *keywords, **indexed_keywords) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/white_gold/abi/extern_object.rb', line 121

def abi_enum base, *keywords, **indexed_keywords
  if base.is_a? Enum
    enum = base
  else
    enum = Enum.new *keywords, **indexed_keywords
    const_set base, enum
    enum.name = base
  end
  abi_packer enum do |o|
    enum.sym_to_i(o)
  end
  abi_unpacker enum do |o|
    enum.i_to_sym(o)
  end
end

.abi_signal(name, signal_class = Signal, original_name = nil) ⇒ Object



153
154
155
156
157
158
159
160
161
162
163
# File 'lib/white_gold/abi/extern_object.rb', line 153

def abi_signal name, signal_class = Signal, original_name = nil
  abi_getter = "_abi_#{original_name || name}".to_sym
  define_method name do |*a, &b|
    signal_pointer = send(abi_getter, *a)
    signal = signal_class.new signal_pointer, self
    b ? signal.connect(&b) : signal
  end
  define_method "#{name}=" do |a|
    send(name, &a)
  end
end

.abi_static(name, original_name = nil) ⇒ Object



165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/white_gold/abi/extern_object.rb', line 165

def abi_static name, original_name = nil
  if original_name
    if original_name.end_with? "_"
      abi_name = "_abi_#{original_name}#{name}".delete_suffix("=").delete_suffix("?").to_sym
    else
      abi_name = "_abi_#{original_name}".delete_suffix("=").to_sym
    end
  else
    abi_name = "_abi_#{name}".delete_suffix("=").delete_suffix("?").to_sym
  end
  define_singleton_method name do |*a|
    send(abi_name, *a)
  end
end

.callback_storageObject



45
46
47
# File 'lib/white_gold/abi/extern_object.rb', line 45

def callback_storage
  @@callback_storage
end

.callback_storage=(callback_storage) ⇒ Object



41
42
43
# File 'lib/white_gold/abi/extern_object.rb', line 41

def callback_storage=(callback_storage)
  @@callback_storage = callback_storage
end

.data_storage=(data_storage) ⇒ Object



57
58
59
# File 'lib/white_gold/abi/extern_object.rb', line 57

def data_storage=(data_storage)
  @@data_storage = data_storage
end

.finalizer(pointer) ⇒ Object



83
84
85
# File 'lib/white_gold/tgui-abi.rb', line 83

def finalizer pointer
  Tgui::Util.free(pointer)
end

.global_callback_storageObject



53
54
55
# File 'lib/white_gold/abi/extern_object.rb', line 53

def global_callback_storage
  @@global_callback_storage
end

.global_callback_storage=(global_callback_storage) ⇒ Object



49
50
51
# File 'lib/white_gold/abi/extern_object.rb', line 49

def global_callback_storage=(global_callback_storage)
  @@global_callback_storage = global_callback_storage
end

.self_abi_def(name, abi_name, abi_interface, *def_attr) ⇒ Object



87
88
89
90
91
# File 'lib/white_gold/abi/extern_object.rb', line 87

def self_abi_def name, abi_name, abi_interface, *def_attr
  define_method name do |*a|
    abi_interface.call self, abi_name, *def_attr, *a
  end
end

.self_abi_def_setter(name, abi_name, abi_interface, *def_attr) ⇒ Object



93
94
95
96
97
# File 'lib/white_gold/abi/extern_object.rb', line 93

def self_abi_def_setter name, abi_name, abi_interface, *def_attr
  define_method name do |a = VOID|
    abi_interface.call self, abi_name, *def_attr, *a
  end
end

Instance Method Details

#abi_pack(type, *a) ⇒ Object



31
32
33
# File 'lib/white_gold/abi/extern_object.rb', line 31

def abi_pack type, *a
  ExternObject.abi_pack self, type, *a
end

#abi_unpack(type, object) ⇒ Object



35
36
37
# File 'lib/white_gold/abi/extern_object.rb', line 35

def abi_unpack type, object
  ExternObject.abi_unpack self, type, object
end

#initializedObject



22
23
# File 'lib/white_gold/abi/extern_object.rb', line 22

def initialized
end