Skip to content

Instantly share code, notes, and snippets.

@vaiorabbit
Created February 11, 2014 13:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vaiorabbit/8935140 to your computer and use it in GitHub Desktop.
Save vaiorabbit/8935140 to your computer and use it in GitHub Desktop.
Arrayはすげ替えつつFiddle::Pointerは使い回すクラス・PackedData
# -*- coding: utf-8 -*-
require 'fiddle'
# Array -> Fiddle::Pointer conversion
class PackedData
attr_reader :data, :pointer
def initialize( src )
@source = src # Array or String built from packed Array
@data = nil # String
@pointer = nil # Fiddle::Pointer
end
def set_source( src )
if @source.is_a?(Array) || @source.is_a?(String)
@source = src
else
raise ArgumentError
end
@data = nil
end
def build( template_string = nil )
# Prepare data
if @source.is_a?(Array)
raise ArgumentError if template_string == nil
@data = @source.pack( template_string )
elsif @source.is_a?(String)
@data = @source
else
raise RuntimeError
end
# Build pointer
if @pointer == nil || @pointer.size < @data.size
@pointer = Fiddle::Pointer[@data]
else
@pointer[0, @data.size] = @data
end
end
def to_ptr
return @pointer
end
def release
@source = nil
@data = nil
@pointer = nil
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment