Class: Hakuban::ObjectState
Defined Under Namespace
Classes: WrongFormatError
Instance Method Summary
collapse
Methods inherited from FFIObject
#do_and_drop, #do_and_drop_or_return, #drop, #drop_lock, #drop_release, #dropped?, 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
|
# File 'lib/hakuban/object_state.rb', line 11
def initialize(data, version: nil, format: nil, synchronized_us_ago: 0, &block)
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
@mutex = Mutex.new
self.do_and_drop_or_return(&block)
end
|
Instance Method Details
#data ⇒ Object
51
52
53
54
55
56
|
# File 'lib/hakuban/object_state.rb', line 51
def data
return @data if defined? @data
array = with_pointer { |pointer| FFI::hakuban_object_state_data(pointer) }
@data = array[:pointer].read_string(array[:length]).clone()
end
|
58
59
60
61
62
|
# File 'lib/hakuban/object_state.rb', line 58
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
|
#inspect ⇒ Object
100
101
102
|
# File 'lib/hakuban/object_state.rb', line 100
def inspect
"#<ObjectState @synchronized=%p @version=%p>"%[synchronized_us_ago, version]
end
|
#json_deserialize ⇒ Object
91
92
93
94
|
# File 'lib/hakuban/object_state.rb', line 91
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_serialize ⇒ Object
96
97
98
|
# File 'lib/hakuban/object_state.rb', line 96
def json_serialize
ObjectState.new(JSON.dump(data), version: version, format: format+["JSON"], synchronized_us_ago: synchronized_us_ago)
end
|
#synchronized_us_ago ⇒ Object
70
71
72
73
|
# File 'lib/hakuban/object_state.rb', line 70
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
|
#version ⇒ Object
64
65
66
67
68
|
# File 'lib/hakuban/object_state.rb', line 64
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
75
76
77
|
# File 'lib/hakuban/object_state.rb', line 75
def with_data(data)
ObjectState.new(data, version: version, format: format, synchronized_us_ago: synchronized_us_ago)
end
|
83
84
85
|
# File 'lib/hakuban/object_state.rb', line 83
def with_format(format)
ObjectState.new(data, version: version, format: format, synchronized_us_ago: synchronized_us_ago)
end
|
#with_pointer ⇒ Object
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
# File 'lib/hakuban/object_state.rb', line 26
def with_pointer
@mutex.synchronize {
raise PointerAlreadyDropped if dropped?
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
87
88
89
|
# File 'lib/hakuban/object_state.rb', line 87
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
79
80
81
|
# File 'lib/hakuban/object_state.rb', line 79
def with_version(version)
ObjectState.new(data, version: version, format: format, synchronized_us_ago: synchronized_us_ago)
end
|