Class | DL::CStructEntity
In: | dl/lib/dl/struct.rb
Parent: | CPtr

### Methods

[] []= assign_names malloc new set_ctypes size to_s

### Included Modules

PackInfo ValueUtil

### Public Class methods

malloc(types, func = nil)

[Source]

    # File dl/lib/dl/struct.rb, line 51
        def CStructEntity.malloc(types, func = nil)
          addr = DL.malloc(CStructEntity.size(types))
          CStructEntity.new(addr, types, func)
        end

new(addr, types, func = nil)

[Source]

    # File dl/lib/dl/struct.rb, line 74
        def initialize(addr, types, func = nil)
          set_ctypes(types)
          super(addr, @size, func)
        end

size(types)

[Source]

    # File dl/lib/dl/struct.rb, line 56
        def CStructEntity.size(types)
          offset = 0
          types.each_with_index{|t,i|
            orig_offset = offset
            if( t.is_a?(Array) )
              offset = PackInfo.align(orig_offset, PackInfo::ALIGN_MAP[TYPE_VOIDP])
              size = offset - orig_offset
              offset += (PackInfo::SIZE_MAP[t[0]] * t[1])
            else
              offset = PackInfo.align(orig_offset, PackInfo::ALIGN_MAP[t])
              size = offset - orig_offset
              offset += PackInfo::SIZE_MAP[t]
            end
          }
          offset = PackInfo.align(offset, PackInfo::ALIGN_MAP[TYPE_VOIDP])
          offset
        end

### Public Instance methods

[](name)

[Source]

    # File dl/lib/dl/struct.rb, line 106
        def [](name)
          idx = @members.index(name)
          if( idx.nil? )
            raise(ArgumentError, "no such member: #{name}")
          end
          ty = @ctypes[idx]
          if( ty.is_a?(Array) )
            r = super(@offset[idx], SIZE_MAP[ty[0]] * ty[1])
          else
            r = super(@offset[idx], SIZE_MAP[ty.abs])
          end
          packer = Packer.new([ty])
          val = packer.unpack([r])
          case ty
          when Array
            case ty[0]
            when TYPE_VOIDP
              val = val.collect{|v| CPtr.new(v)}
            end
          when TYPE_VOIDP
            val = CPtr.new(val[0])
          else
            val = val[0]
          end
          if( ty.is_a?(Integer) && (ty < 0) )
            return unsigned_value(val, ty)
          elsif( ty.is_a?(Array) && (ty[0] < 0) )
            return val.collect{|v| unsigned_value(v,ty[0])}
          else
            return val
          end
        end

[]=(name, val)

[Source]

    # File dl/lib/dl/struct.rb, line 139
        def []=(name, val)
          idx = @members.index(name)
          if( idx.nil? )
            raise(ArgumentError, "no such member: #{name}")
          end
          ty  = @ctypes[idx]
          packer = Packer.new([ty])
          val = wrap_arg(val, ty, [])
          buff = packer.pack([val].flatten())
          super(@offset[idx], buff.size, buff)
          if( ty.is_a?(Integer) && (ty < 0) )
            return unsigned_value(val, ty)
          elsif( ty.is_a?(Array) && (ty[0] < 0) )
            return val.collect{|v| unsigned_value(v,ty[0])}
          else
            return val
          end
        end

assign_names(members)

[Source]

    # File dl/lib/dl/struct.rb, line 79
        def assign_names(members)
          @members = members
        end

set_ctypes(types)

[Source]

    # File dl/lib/dl/struct.rb, line 83
        def set_ctypes(types)
          @ctypes = types
          @offset = []
          offset = 0
          types.each_with_index{|t,i|
            orig_offset = offset
            if( t.is_a?(Array) )
              offset = align(orig_offset, ALIGN_MAP[TYPE_VOIDP])
            else
              offset = align(orig_offset, ALIGN_MAP[t])
            end
            size = offset - orig_offset
            @offset[i] = offset
            if( t.is_a?(Array) )
              offset += (SIZE_MAP[t[0]] * t[1])
            else
              offset += SIZE_MAP[t]
            end
          }
          offset = align(offset, ALIGN_MAP[TYPE_VOIDP])
          @size = offset
        end

to_s()

[Source]

    # File dl/lib/dl/struct.rb, line 158
        def to_s()
          super(@size)
        end

[Validate]