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, #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

#dataObject



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) }
	#array[:data_bytes].read_array_of_char(array[:length]) #.pack('c*').clone()
	@data = array[:pointer].read_string(array[:length]).clone()
end

#formatObject



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

#inspectObject



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

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

#json_deserializeObject

Raises:



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_serializeObject



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_agoObject



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

#versionObject



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

#with_format(format) ⇒ Object



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_pointerObject



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