slow_blink 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/slow_blink/ext_schema_parser/lexer.c +2793 -839
- data/ext/slow_blink/ext_schema_parser/lexer.h +14 -137
- data/ext/slow_blink/ext_schema_parser/parser.c +616 -670
- data/ext/slow_blink/ext_schema_parser/parser.h +6 -4
- data/ext/slow_blink/message/ext_compact_encoder/blink_compact.c +642 -0
- data/ext/slow_blink/message/ext_compact_encoder/blink_compact.h +411 -0
- data/ext/slow_blink/message/ext_compact_encoder/blink_debug.h +46 -0
- data/ext/slow_blink/message/ext_compact_encoder/blink_stream.c +314 -0
- data/ext/slow_blink/message/ext_compact_encoder/blink_stream.h +185 -0
- data/ext/slow_blink/message/ext_compact_encoder/ext_compact_encoder.c +382 -269
- data/lib/slow_blink/definition.rb +18 -53
- data/lib/slow_blink/dynamic_group.rb +8 -0
- data/lib/slow_blink/enum.rb +101 -0
- data/lib/slow_blink/field.rb +63 -33
- data/lib/slow_blink/generate_c/model.rb +89 -0
- data/lib/slow_blink/group.rb +119 -100
- data/lib/slow_blink/message/binary.rb +3 -4
- data/lib/slow_blink/message/boolean.rb +3 -4
- data/lib/slow_blink/message/date.rb +3 -4
- data/lib/slow_blink/message/decimal.rb +3 -5
- data/lib/slow_blink/message/{enumeration.rb → enum.rb} +17 -17
- data/lib/slow_blink/message/field.rb +77 -27
- data/lib/slow_blink/message/fixed.rb +5 -21
- data/lib/slow_blink/message/floating_point.rb +3 -4
- data/lib/slow_blink/message/group.rb +90 -161
- data/lib/slow_blink/message/integer.rb +24 -32
- data/lib/slow_blink/message/model.rb +50 -110
- data/lib/slow_blink/message/string.rb +3 -4
- data/lib/slow_blink/message/time.rb +5 -5
- data/lib/slow_blink/message/time_of_day.rb +5 -12
- data/lib/slow_blink/ref.rb +22 -71
- data/lib/slow_blink/schema.rb +64 -85
- data/lib/slow_blink/schema_buffer.rb +1 -4
- data/lib/slow_blink/static_group.rb +37 -0
- data/lib/slow_blink/string.rb +4 -5
- data/lib/slow_blink/sym.rb +8 -28
- data/lib/slow_blink/type.rb +10 -19
- data/lib/slow_blink/version.rb +1 -1
- data/lib/slow_blink.rb +1 -0
- data/test/tc_compact_encoder.rb +114 -147
- data/test/tc_inputs.rb +2 -4
- data/test/tc_model_string.rb +29 -0
- data/test/tc_schema_new.rb +212 -0
- metadata +17 -26
- data/ext/slow_blink/ext_schema_parser/common.h +0 -27
- data/ext/slow_blink/message/ext_compact_encoder/compact_encoder.c +0 -258
- data/ext/slow_blink/message/ext_compact_encoder/compact_encoder.h +0 -92
- data/lib/slow_blink/annotatable.rb +0 -48
- data/lib/slow_blink/annotation.rb +0 -47
- data/lib/slow_blink/enumeration.rb +0 -90
- data/lib/slow_blink/incremental_annotation.rb +0 -151
- data/lib/slow_blink/log.rb +0 -51
- data/lib/slow_blink/message/sequence.rb +0 -98
- data/lib/slow_blink/name_with_id.rb +0 -49
- data/lib/slow_blink/namespace.rb +0 -143
- data/lib/slow_blink/sequence.rb +0 -57
- data/test/tc_field.rb +0 -94
- data/test/tc_group.rb +0 -114
- data/test/tc_incr_annote.rb +0 -22
- data/test/tc_namespace.rb +0 -8
- data/test/tc_types.rb +0 -218
@@ -25,12 +25,11 @@ module SlowBlink::Message
|
|
25
25
|
class BOOLEAN
|
26
26
|
|
27
27
|
# @private
|
28
|
-
def self.from_compact
|
29
|
-
value = input.getBool
|
30
|
-
if value
|
28
|
+
def self.from_compact(input, stack)
|
29
|
+
if value = input.getBool
|
31
30
|
self.new(value)
|
32
31
|
else
|
33
|
-
|
32
|
+
nil
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|
@@ -25,12 +25,11 @@ module SlowBlink::Message
|
|
25
25
|
class DATE
|
26
26
|
|
27
27
|
# @private
|
28
|
-
def self.from_compact
|
29
|
-
value = input.getI32
|
30
|
-
if value
|
28
|
+
def self.from_compact(input, stack)
|
29
|
+
if value = input.getI32
|
31
30
|
self.new(value)
|
32
31
|
else
|
33
|
-
|
32
|
+
nil
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|
@@ -27,11 +27,9 @@ module SlowBlink::Message
|
|
27
27
|
class DECIMAL
|
28
28
|
|
29
29
|
# @private
|
30
|
-
def self.from_compact
|
31
|
-
e = input.getI8
|
32
|
-
|
33
|
-
m = input.getI64!
|
34
|
-
if m
|
30
|
+
def self.from_compact(input, stack)
|
31
|
+
if e = input.getI8
|
32
|
+
if m = input.getI64
|
35
33
|
self.new("#{m}E#{e}")
|
36
34
|
else
|
37
35
|
raise NullMantissa
|
@@ -22,25 +22,22 @@
|
|
22
22
|
module SlowBlink::Message
|
23
23
|
|
24
24
|
# @abstract
|
25
|
-
class
|
25
|
+
class ENUM
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
@symbols
|
27
|
+
def self.type
|
28
|
+
@type
|
30
29
|
end
|
31
30
|
|
32
31
|
# @private
|
33
|
-
def self.from_compact
|
34
|
-
value = input.getI32
|
35
|
-
|
36
|
-
|
37
|
-
if symbol
|
38
|
-
self.new(symbol)
|
32
|
+
def self.from_compact(input, stack)
|
33
|
+
if value = input.getI32
|
34
|
+
if symbol = type.symbol(value)
|
35
|
+
self.new(symbol.name)
|
39
36
|
else
|
40
37
|
raise WeakError10.new "W10: value '#{value}' does not correspond to any symbol in enumeration"
|
41
38
|
end
|
42
39
|
else
|
43
|
-
|
40
|
+
nil
|
44
41
|
end
|
45
42
|
end
|
46
43
|
|
@@ -53,22 +50,25 @@ module SlowBlink::Message
|
|
53
50
|
# @param value [String] symbol in enumeration
|
54
51
|
# @raise [RangeError] value is not valid symbol
|
55
52
|
def set(value)
|
56
|
-
if
|
57
|
-
|
53
|
+
if value.kind_of? String
|
54
|
+
if self.class.type.symbol(value)
|
55
|
+
@value = value.to_s
|
56
|
+
else
|
57
|
+
raise RangeError.new "symbol '#{value}' not defined in enumeration"
|
58
|
+
end
|
58
59
|
else
|
59
|
-
raise
|
60
|
-
end
|
60
|
+
raise TypeError.new "value must be a String"
|
61
|
+
end
|
61
62
|
end
|
62
63
|
|
63
64
|
# @note calls {#set}(value)
|
64
65
|
def initialize(value)
|
65
|
-
@symbols = self.class.symbols
|
66
66
|
set(value)
|
67
67
|
end
|
68
68
|
|
69
69
|
# @private
|
70
70
|
def to_compact(out)
|
71
|
-
out.putI32(@
|
71
|
+
out.putI32(self.class.type.symbol(@value).value)
|
72
72
|
end
|
73
73
|
|
74
74
|
end
|
@@ -25,13 +25,13 @@ module SlowBlink::Message
|
|
25
25
|
class Field
|
26
26
|
|
27
27
|
# @return [true,false] field is optional?
|
28
|
-
def self.
|
29
|
-
@
|
28
|
+
def self.optional?
|
29
|
+
@optional
|
30
30
|
end
|
31
31
|
|
32
32
|
# @return [String] field name
|
33
33
|
def self.name
|
34
|
-
@name
|
34
|
+
@name.to_s
|
35
35
|
end
|
36
36
|
|
37
37
|
# @return [Integer,nil] field ID
|
@@ -44,66 +44,116 @@ module SlowBlink::Message
|
|
44
44
|
@type
|
45
45
|
end
|
46
46
|
|
47
|
+
# @return [true,false] true if this field contains a sequence type
|
48
|
+
def self.sequence?
|
49
|
+
@sequence
|
50
|
+
end
|
51
|
+
|
47
52
|
# @private
|
48
53
|
# @param input [String] Blink compact form
|
49
54
|
# @param stack [Array]
|
50
55
|
# @return [Field] instance of anonymous subclass of Field
|
51
|
-
def self.from_compact
|
52
|
-
|
56
|
+
def self.from_compact(input, stack)
|
57
|
+
if sequence?
|
58
|
+
if size = input.getU32
|
59
|
+
value = []
|
60
|
+
while value.size < size do
|
61
|
+
value << @type.from_compact(input, stack).get
|
62
|
+
end
|
63
|
+
self.new(value)
|
64
|
+
else
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
elsif optional? and (type.kind_of? StaticGroup or type.kind_of? FIXED)
|
68
|
+
if input.get_present(input)
|
69
|
+
self.new(@type.from_compact(input, stack).get)
|
70
|
+
else
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
else
|
74
|
+
self.new(@type.from_compact(input, stack).get)
|
75
|
+
end
|
53
76
|
end
|
54
77
|
|
55
78
|
# @note calls {#set}(value)
|
56
79
|
def initialize(value)
|
57
|
-
|
80
|
+
|
81
|
+
@optional = self.class.optional?
|
82
|
+
@sequence = self.class.sequence?
|
58
83
|
@type = self.class.type
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
@value = self.class.type.new(value)
|
84
|
+
|
85
|
+
if value
|
86
|
+
set(value)
|
63
87
|
else
|
64
88
|
@value = nil
|
65
89
|
end
|
90
|
+
|
66
91
|
end
|
67
|
-
|
68
92
|
|
69
93
|
def set(value)
|
70
|
-
if value
|
71
|
-
if
|
72
|
-
@value =
|
73
|
-
|
74
|
-
|
94
|
+
if value.nil?
|
95
|
+
if optional?
|
96
|
+
@value = nil
|
97
|
+
else
|
98
|
+
raise ArgumentError.new "field is not optional, value cannot be nil"
|
99
|
+
end
|
100
|
+
elsif self.class.sequence?
|
101
|
+
if value.kind_of? Array
|
102
|
+
@value = []
|
103
|
+
value.each do |v|
|
104
|
+
@value << @type.new(v)
|
105
|
+
end
|
75
106
|
else
|
76
|
-
|
107
|
+
raise ArgumentError.new "field value must be an array of type"
|
77
108
|
end
|
78
|
-
elsif @opt
|
79
|
-
@value = nil
|
80
109
|
else
|
81
|
-
|
82
|
-
end
|
110
|
+
@value = @type.new(value)
|
111
|
+
end
|
83
112
|
end
|
84
113
|
|
85
114
|
# @return field value or nil
|
86
115
|
def get
|
87
116
|
if @value
|
88
|
-
|
117
|
+
if self.class.sequence?
|
118
|
+
@value.map{|v|v.get}
|
119
|
+
else
|
120
|
+
@value.get
|
121
|
+
end
|
89
122
|
else
|
90
123
|
nil
|
91
124
|
end
|
92
125
|
end
|
93
126
|
|
94
127
|
# @private
|
95
|
-
# @param out [
|
96
|
-
# @return [
|
128
|
+
# @param out [StringIO]
|
129
|
+
# @return [StringIO]
|
97
130
|
def to_compact(out)
|
98
131
|
if @value
|
99
|
-
|
100
|
-
|
132
|
+
if self.class.sequence?
|
133
|
+
out.putU32(@value.size)
|
134
|
+
@value.each do |v|
|
135
|
+
v.to_compact(out)
|
136
|
+
end
|
137
|
+
else
|
138
|
+
if self.class.optional? and (self.type.kind_of? StaticGroup or self.type.kind_of? FIXED)
|
139
|
+
out.putPresent
|
140
|
+
end
|
141
|
+
@value.to_compact(out)
|
142
|
+
end
|
143
|
+
elsif @optional
|
101
144
|
out.putNull
|
102
145
|
else
|
103
|
-
raise IncompleteGroup.new "
|
146
|
+
raise IncompleteGroup.new "'#{self.name}' must not be null"
|
104
147
|
end
|
105
148
|
end
|
106
149
|
|
150
|
+
private
|
151
|
+
|
152
|
+
def sequenceOfSameType(value)
|
153
|
+
value.each do ||
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
107
157
|
end
|
108
158
|
|
109
159
|
end
|
@@ -24,27 +24,16 @@ module SlowBlink::Message
|
|
24
24
|
# @abstract
|
25
25
|
class FIXED
|
26
26
|
|
27
|
-
# @note optionality affects how instances of this type are encoded
|
28
|
-
# @return [true,false] is optional
|
29
|
-
def self.opt?
|
30
|
-
@opt
|
31
|
-
end
|
32
|
-
|
33
27
|
# @private
|
34
|
-
def self.from_compact
|
35
|
-
if
|
36
|
-
value = input.getFixedOptional!
|
37
|
-
else
|
38
|
-
value = input.getFixed!
|
39
|
-
end
|
40
|
-
if value
|
28
|
+
def self.from_compact(input, stack)
|
29
|
+
if value = input.getFixed(size)
|
41
30
|
self.new(value)
|
42
31
|
else
|
43
|
-
|
32
|
+
nil
|
44
33
|
end
|
45
34
|
end
|
46
35
|
|
47
|
-
# @return [Integer
|
36
|
+
# @return [Integer] size of fixed type in bytes
|
48
37
|
def self.size
|
49
38
|
@type.size
|
50
39
|
end
|
@@ -72,17 +61,12 @@ module SlowBlink::Message
|
|
72
61
|
|
73
62
|
# @note calls {#set}(value)
|
74
63
|
def initialize(value)
|
75
|
-
@opt = self.class.opt?
|
76
64
|
set(value)
|
77
65
|
end
|
78
66
|
|
79
67
|
# @private
|
80
68
|
def to_compact(out)
|
81
|
-
|
82
|
-
out.putFixedOptional(@value)
|
83
|
-
else
|
84
|
-
out.putFixed(@value)
|
85
|
-
end
|
69
|
+
out.putFixed(@value)
|
86
70
|
end
|
87
71
|
|
88
72
|
end
|
@@ -25,12 +25,11 @@ module SlowBlink::Message
|
|
25
25
|
class FLOATING_POINT
|
26
26
|
|
27
27
|
# @private
|
28
|
-
def self.from_compact
|
29
|
-
value = input.getF64
|
30
|
-
if value
|
28
|
+
def self.from_compact(input, stack)
|
29
|
+
if value = input.getF64
|
31
30
|
self.new(value)
|
32
31
|
else
|
33
|
-
|
32
|
+
nil
|
34
33
|
end
|
35
34
|
end
|
36
35
|
|