Class: Hakuban::ObjectState

Inherits:
FFIObject show all
Defined in:
lib/hakuban/object_state.rb

Defined Under Namespace

Classes: WrongFormatError

Instance Method Summary collapse

Methods inherited from FFIObject

#do_and_drop_or_return, #drop, #dropped?, from_ffi_pointer, generate_finalizer, #initialize_copy, with_pointers

Constructor Details

#initialize(data, version: nil, format: nil, synchronized_us_ago: 0, &block) ⇒ ObjectState

Returns a new instance of ObjectState.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/hakuban/object_state.rb', line 11

def initialize(data, version: nil, format: nil, synchronized_us_ago: 0, &block)
  super()
  if version.nil?
    timestamp = Time.new
    version = [0, timestamp.to_i, timestamp.nsec]
  end
  @version = version
  @format = [format || []].flatten
  @synchronized_us_ago = synchronized_us_ago
  @data = data
  @pointer = false
  Thread.handle_interrupt(Object => :never) {
    self.do_and_drop_or_return(&block)
  }
end

Instance Method Details

#dataObject



50
51
52
53
54
55
# File 'lib/hakuban/object_state.rb', line 50

def data
  return @data  if defined? @data
  array = with_pointer { |pointer| FFI::hakuban_object_state_data(pointer) }
  #array[:data_bytes].read_array_of_char(array[:length]) #.pack('c*').clone()
  @data = array[:pointer].read_string(array[:length]).clone()
end

#formatObject



57
58
59
60
61
# File 'lib/hakuban/object_state.rb', line 57

def format
  return @format  if defined? @format
  array = with_pointer { |pointer| FFI::hakuban_object_state_format(pointer) }
  @format = array[:pointer].read_array_of_pointer(array[:length]).map { |string| string.read_string().clone() }
end

#initialize_from_ffi_pointer(pointer) ⇒ Object



27
28
29
# File 'lib/hakuban/object_state.rb', line 27

def initialize_from_ffi_pointer(pointer)
  super(pointer, :hakuban_object_state_drop, :hakuban_object_state_clone)
end

#inspectObject



99
100
101
# File 'lib/hakuban/object_state.rb', line 99

def inspect
  "#<ObjectState @synchronized=%p @version=%p>"%[synchronized_us_ago, version]
end

#json_deserializeObject

Raises:



90
91
92
93
# File 'lib/hakuban/object_state.rb', line 90

def json_deserialize
  raise WrongFormatError  if format[-1] != "JSON"
  ObjectState.new(JSON.parse(data), version: version, format: format[0...-1], synchronized_us_ago: synchronized_us_ago)
end

#json_serializeObject



95
96
97
# File 'lib/hakuban/object_state.rb', line 95

def json_serialize
  ObjectState.new(data.to_json, version: version, format: format+["JSON"], synchronized_us_ago: synchronized_us_ago)
end

#synchronized_us_agoObject



69
70
71
72
# File 'lib/hakuban/object_state.rb', line 69

def synchronized_us_ago
  return @synchronized_us_ago  if defined? @synchronized_us_ago
  @synchronized_us_ago = with_pointer { |pointer| FFI::hakuban_object_state_synchronized_ago(pointer) }
end

#versionObject



63
64
65
66
67
# File 'lib/hakuban/object_state.rb', line 63

def version
  return @version  if defined? @version
  array = with_pointer { |pointer| FFI::hakuban_object_state_version(pointer) }
  @version = array[:pointer].read_array_of_int64(array[:length])
end

#with_data(data) ⇒ Object



74
75
76
# File 'lib/hakuban/object_state.rb', line 74

def with_data(data)
  ObjectState.new(data, version: version, format: format, synchronized_us_ago: synchronized_us_ago)
end

#with_format(format) ⇒ Object



82
83
84
# File 'lib/hakuban/object_state.rb', line 82

def with_format(format)
  ObjectState.new(data, version: version, format: format, synchronized_us_ago: synchronized_us_ago)
end

#with_pointerObject



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/hakuban/object_state.rb', line 33

def with_pointer
  @pointer_mutex.synchronize {
    if @pointer == false
      Hakuban::hakuban_initialize
      version_pointer = ::FFI::MemoryPointer.new(:int64, @version.size)
      version_pointer.write_array_of_int64(@version)
      format_pointer = ::FFI::MemoryPointer.new(:pointer, @format.size)
      format_strings = format.map {|string| ::FFI::MemoryPointer.from_string(string)}
      format_pointer.write_array_of_pointer(format_strings)
      data_pointer = ::FFI::MemoryPointer.from_string(@data)
      pointer = FFI::hakuban_object_state_new(@version.size, version_pointer, @format.size, format_pointer, @data.bytesize, data_pointer, @synchronized_us_ago).unwrap
      initialize_pointer(pointer, :hakuban_object_state_drop, :hakuban_object_state_clone)
    end
    yield ::FFI::Pointer.new(@pointer)
  }
end

#with_synchronized_us_ago(synchronized_us_ago) ⇒ Object



86
87
88
# File 'lib/hakuban/object_state.rb', line 86

def with_synchronized_us_ago(synchronized_us_ago)
  ObjectState.new(data, version: version, format: format, synchronized_us_ago: synchronized_us_ago)
end

#with_version(version) ⇒ Object



78
79
80
# File 'lib/hakuban/object_state.rb', line 78

def with_version(version)
  ObjectState.new(data, version: version, format: format, synchronized_us_ago: synchronized_us_ago)
end