# File lib/ffi/struct.rb, line 117 117: def self.align 118: @layout.alignment 119: end
# File lib/ffi/struct.rb, line 113 113: def self.alignment 114: @layout.alignment 115: end
# File lib/ffi/struct.rb, line 141 141: def self.by_value 142: ::FFI::StructByValue.new(self) 143: end
# File lib/ffi/struct.rb, line 133 133: def self.in 134: :buffer_in 135: end
# File lib/ffi/struct.rb, line 150 150: def layout(*spec) 151: return @layout if spec.size == 0 152: 153: builder = FFI::StructLayoutBuilder.new 154: builder.union = self < Union 155: if spec[0].kind_of?(Hash) 156: hash_layout(builder, spec) 157: else 158: array_layout(builder, spec) 159: end 160: builder.size = @size if defined?(@size) && @size > builder.size 161: cspec = builder.build 162: @layout = cspec unless self == FFI::Struct 163: @size = cspec.size 164: return cspec 165: end
# File lib/ffi/struct.rb, line 121 121: def self.members 122: @layout.members 123: end
# File lib/ffi/struct.rb, line 129 129: def self.offset_of(name) 130: @layout.offset_of(name) 131: end
# File lib/ffi/struct.rb, line 125 125: def self.offsets 126: @layout.offsets 127: end
# File lib/ffi/struct.rb, line 137 137: def self.out 138: :buffer_out 139: end
# File lib/ffi/struct.rb, line 170 170: def callback(params, ret) 171: mod = enclosing_module 172: FFI::CallbackInfo.new(find_type(ret, mod), params.map { |e| find_type(e, mod) }) 173: end
# File lib/ffi/struct.rb, line 176 176: def enclosing_module 177: begin 178: mod = self.name.split("::")[0..2].inject(Object) { |obj, c| obj.const_get(c) } 179: mod.respond_to?(:find_type) ? mod : nil 180: rescue Exception => ex 181: nil 182: end 183: end
# File lib/ffi/struct.rb, line 185 185: def find_type(type, mod = nil) 186: if type.kind_of?(Class) && type < FFI::Struct 187: FFI::Type::Struct.new(type) 188: elsif type.is_a?(::Array) 189: type 190: elsif mod 191: mod.find_type(type) 192: end || FFI.find_type(type) 193: end
# File lib/ffi/struct.rb, line 212 212: def array_layout(builder, spec) 213: mod = enclosing_module 214: i = 0 215: while i < spec.size 216: name, type = spec[i, 2] 217: i += 2 218: 219: # If the next param is a Integer, it specifies the offset 220: if spec[i].kind_of?(Integer) 221: offset = spec[i] 222: i += 1 223: else 224: offset = nil 225: end 226: if type.kind_of?(Class) && type < Struct 227: builder.add_struct(name, type, offset) 228: elsif type.kind_of?(::Array) 229: builder.add_array(name, find_type(type[0], mod), type[1], offset) 230: else 231: builder.add_field(name, find_type(type, mod), offset) 232: end 233: end 234: end
# File lib/ffi/struct.rb, line 198 198: def hash_layout(builder, spec) 199: raise "Ruby version not supported" if RUBY_VERSION =~ /1.8.*/ 200: mod = enclosing_module 201: spec[0].each do |name,type| 202: if type.kind_of?(Class) && type < Struct 203: builder.add_struct(name, type) 204: elsif type.kind_of?(::Array) 205: builder.add_array(name, find_type(type[0], mod), type[1]) 206: else 207: builder.add_field(name, find_type(type, mod)) 208: end 209: end 210: end
# File lib/ffi/struct.rb, line 74 74: def alignment 75: self.class.alignment 76: end
# File lib/ffi/struct.rb, line 95 95: def clear 96: pointer.clear 97: self 98: end
# File lib/ffi/struct.rb, line 83 83: def members 84: self.class.members 85: end
# File lib/ffi/struct.rb, line 79 79: def offset_of(name) 80: self.class.offset_of(name) 81: end
# File lib/ffi/struct.rb, line 91 91: def offsets 92: self.class.offsets 93: end
# File lib/ffi/struct.rb, line 70 70: def size 71: self.class.size 72: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.