Class: Depix::ArrayField
Overview
Wrapper for an array structure
Instance Attribute Summary collapse
Attributes inherited from Field
#desc, #name, #req
Instance Method Summary
collapse
Methods inherited from Field
#clean, emit_char, emit_r32, emit_u16, emit_u32, emit_u8, #initialize
Constructor Details
This class inherits a constructor from Depix::Field
Instance Attribute Details
#members ⇒ Object
Returns the value of attribute members.
257
258
259
|
# File 'lib/depix/dict.rb', line 257
def members
@members
end
|
Instance Method Details
#consume!(stack) ⇒ Object
268
269
270
|
# File 'lib/depix/dict.rb', line 268
def consume!(stack)
members.map{|m| m.consume!(stack)}
end
|
#explain ⇒ Object
276
277
278
279
280
281
|
# File 'lib/depix/dict.rb', line 276
def explain
return 'Empty array' if (!members || members.empty?)
tpl = "(Array of %d %s fields)" % [ members.length, members[0].rtype]
r = (req? ? "- required" : nil)
[tpl, desc, r].compact.join(' ')
end
|
#length ⇒ Object
260
261
262
|
# File 'lib/depix/dict.rb', line 260
def length
members.inject(0){|_, s| _ + s.length }
end
|
#pack(values) ⇒ Object
291
292
293
294
295
296
297
298
299
300
301
302
|
# File 'lib/depix/dict.rb', line 291
def pack(values)
members.zip(values).map do |m, v|
if !m.req? && v.nil?
raise "#{m} needs to provide length" unless m.length
"\377" * m.length
else
v.respond_to?(:pack) ? v.pack : m.pack(v)
end
end.join
end
|
#pattern ⇒ Object
264
265
266
|
# File 'lib/depix/dict.rb', line 264
def pattern
members.inject(''){|_, s| _ + s.pattern }
end
|
#rtype ⇒ Object
272
273
274
|
# File 'lib/depix/dict.rb', line 272
def rtype
Array
end
|
#validate!(array) ⇒ Object
283
284
285
286
287
288
289
|
# File 'lib/depix/dict.rb', line 283
def validate!(array)
raise "This value would overflow, #{array.length} elements passed but only #{members.length} fit" unless array.length <= members.length
raise "This value is required, but the array is empty" if req? && array.empty?
array.zip(members).map do | v, m |
m.validate!(v) unless (v.nil? && !m.req?)
end
end
|