capnp 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/capnpc-ruby +15 -0
- data/lib/capnp/generator/generator.rb +568 -0
- data/lib/capnp/generator/schema.capnp.rb +1327 -0
- data/lib/capnp/generator.rb +4 -0
- data/lib/capnp/runtime/buffer/buffer.rb +62 -0
- data/lib/capnp/runtime/buffer/io_buffer.rb +85 -0
- data/lib/capnp/runtime/buffer/sliceable_buffer.rb +16 -0
- data/lib/capnp/runtime/buffer/string_buffer.rb +88 -0
- data/lib/capnp/runtime/list/buffer/data.rb +19 -0
- data/lib/capnp/runtime/list/buffer/list.rb +100 -0
- data/lib/capnp/runtime/list/buffer/numeric.rb +103 -0
- data/lib/capnp/runtime/list/buffer/string.rb +19 -0
- data/lib/capnp/runtime/list/buffer/struct.rb +47 -0
- data/lib/capnp/runtime/list/list.rb +42 -0
- data/lib/capnp/runtime/list/object/list.rb +26 -0
- data/lib/capnp/runtime/list/object/string.rb +26 -0
- data/lib/capnp/runtime/list/string.rb +22 -0
- data/lib/capnp/runtime/message/flat_message.rb +21 -0
- data/lib/capnp/runtime/message/message.rb +62 -0
- data/lib/capnp/runtime/message/stream_message.rb +50 -0
- data/lib/capnp/runtime/reference.rb +100 -0
- data/lib/capnp/runtime/segment.rb +89 -0
- data/lib/capnp/runtime/struct.rb +159 -0
- data/lib/capnp/runtime.rb +3 -0
- data/lib/capnp/version.rb +5 -0
- data/lib/capnp.rb +14 -0
- metadata +200 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
module Capnp::Buffer
|
7
|
+
extend T::Sig
|
8
|
+
extend T::Helpers
|
9
|
+
interface!
|
10
|
+
|
11
|
+
sig { abstract.params(offset: Integer, length: Integer).returns(String) }
|
12
|
+
def read_string(offset, length)
|
13
|
+
end
|
14
|
+
|
15
|
+
sig { abstract.params(offset: Integer, length: Integer).returns(String) }
|
16
|
+
def read_bytes(offset, length)
|
17
|
+
end
|
18
|
+
|
19
|
+
sig { abstract.params(offset: Integer).returns(Integer) }
|
20
|
+
def read_u8(offset)
|
21
|
+
end
|
22
|
+
|
23
|
+
sig { abstract.params(offset: Integer).returns(Integer) }
|
24
|
+
def read_u16(offset)
|
25
|
+
end
|
26
|
+
|
27
|
+
sig { abstract.params(offset: Integer).returns(Integer) }
|
28
|
+
def read_u32(offset)
|
29
|
+
end
|
30
|
+
|
31
|
+
sig { abstract.params(offset: Integer).returns(Integer) }
|
32
|
+
def read_u64(offset)
|
33
|
+
end
|
34
|
+
|
35
|
+
sig { abstract.params(offset: Integer).returns(Integer) }
|
36
|
+
def read_s8(offset)
|
37
|
+
end
|
38
|
+
|
39
|
+
sig { abstract.params(offset: Integer).returns(Integer) }
|
40
|
+
def read_s16(offset)
|
41
|
+
end
|
42
|
+
|
43
|
+
sig { abstract.params(offset: Integer).returns(Integer) }
|
44
|
+
def read_s32(offset)
|
45
|
+
end
|
46
|
+
|
47
|
+
sig { abstract.params(offset: Integer).returns(Integer) }
|
48
|
+
def read_s64(offset)
|
49
|
+
end
|
50
|
+
|
51
|
+
sig { abstract.params(offset: Integer).returns(Float) }
|
52
|
+
def read_f32(offset)
|
53
|
+
end
|
54
|
+
|
55
|
+
sig { abstract.params(offset: Integer).returns(Float) }
|
56
|
+
def read_f64(offset)
|
57
|
+
end
|
58
|
+
|
59
|
+
sig { abstract.returns(Integer) }
|
60
|
+
def size
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
require_relative "sliceable_buffer"
|
6
|
+
|
7
|
+
class Capnp::IOBuffer
|
8
|
+
extend T::Sig
|
9
|
+
include Capnp::SliceableBuffer
|
10
|
+
|
11
|
+
sig { params(buffer: IO::Buffer).void }
|
12
|
+
def initialize(buffer)
|
13
|
+
@buffer = buffer
|
14
|
+
end
|
15
|
+
|
16
|
+
sig { override.params(offset: Integer, length: Integer).returns(T.self_type) }
|
17
|
+
def slice(offset, length)
|
18
|
+
self.class.new(@buffer.slice(offset, length))
|
19
|
+
end
|
20
|
+
|
21
|
+
sig { override.params(offset: Integer, length: Integer).returns(String) }
|
22
|
+
def read_string(offset, length)
|
23
|
+
@buffer.get_string(offset, length, Encoding::UTF_8)
|
24
|
+
end
|
25
|
+
|
26
|
+
sig { override.params(offset: Integer, length: Integer).returns(String) }
|
27
|
+
def read_bytes(offset, length)
|
28
|
+
@buffer.get_string(offset, length, Encoding::BINARY)
|
29
|
+
end
|
30
|
+
|
31
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
32
|
+
def read_u8(offset)
|
33
|
+
T.cast(@buffer.get_value(:U8, offset), Integer)
|
34
|
+
end
|
35
|
+
|
36
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
37
|
+
def read_u16(offset)
|
38
|
+
T.cast(@buffer.get_value(:u16, offset), Integer)
|
39
|
+
end
|
40
|
+
|
41
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
42
|
+
def read_u32(offset)
|
43
|
+
T.cast(@buffer.get_value(:u32, offset), Integer)
|
44
|
+
end
|
45
|
+
|
46
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
47
|
+
def read_u64(offset)
|
48
|
+
T.cast(@buffer.get_value(:u64, offset), Integer)
|
49
|
+
end
|
50
|
+
|
51
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
52
|
+
def read_s8(offset)
|
53
|
+
T.cast(@buffer.get_value(:S8, offset), Integer)
|
54
|
+
end
|
55
|
+
|
56
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
57
|
+
def read_s16(offset)
|
58
|
+
T.cast(@buffer.get_value(:s16, offset), Integer)
|
59
|
+
end
|
60
|
+
|
61
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
62
|
+
def read_s32(offset)
|
63
|
+
T.cast(@buffer.get_value(:s32, offset), Integer)
|
64
|
+
end
|
65
|
+
|
66
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
67
|
+
def read_s64(offset)
|
68
|
+
T.cast(@buffer.get_value(:s64, offset), Integer)
|
69
|
+
end
|
70
|
+
|
71
|
+
sig { override.params(offset: Integer).returns(Float) }
|
72
|
+
def read_f32(offset)
|
73
|
+
T.cast(@buffer.get_value(:f32, offset), Float)
|
74
|
+
end
|
75
|
+
|
76
|
+
sig { override.params(offset: Integer).returns(Float) }
|
77
|
+
def read_f64(offset)
|
78
|
+
T.cast(@buffer.get_value(:f64, offset), Float)
|
79
|
+
end
|
80
|
+
|
81
|
+
sig { override.returns(Integer) }
|
82
|
+
def size
|
83
|
+
@buffer.size
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
|
6
|
+
module Capnp::SliceableBuffer
|
7
|
+
extend T::Sig
|
8
|
+
extend T::Helpers
|
9
|
+
interface!
|
10
|
+
|
11
|
+
include Capnp::Buffer
|
12
|
+
|
13
|
+
sig { abstract.params(offset: Integer, length: Integer).returns(T.self_type) }
|
14
|
+
def slice(offset, length)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
require_relative "sliceable_buffer"
|
6
|
+
|
7
|
+
class Capnp::StringBuffer
|
8
|
+
extend T::Sig
|
9
|
+
|
10
|
+
include Capnp::SliceableBuffer
|
11
|
+
|
12
|
+
sig { params(buffer: String).void }
|
13
|
+
def initialize(buffer)
|
14
|
+
@buffer = T.let(buffer.encode(Encoding::BINARY), String)
|
15
|
+
end
|
16
|
+
|
17
|
+
sig { override.params(offset: Integer, length: Integer).returns(T.self_type) }
|
18
|
+
def slice(offset, length)
|
19
|
+
self.class.new(read_bytes(offset, length))
|
20
|
+
end
|
21
|
+
|
22
|
+
sig { override.returns(Integer) }
|
23
|
+
def size
|
24
|
+
@buffer.bytesize
|
25
|
+
end
|
26
|
+
|
27
|
+
sig { override.params(offset: Integer, length: Integer).returns(String) }
|
28
|
+
def read_string(offset, length)
|
29
|
+
read_bytes(offset, length).encode!(Encoding::UTF_8)
|
30
|
+
end
|
31
|
+
|
32
|
+
sig { override.params(offset: Integer, length: Integer).returns(String) }
|
33
|
+
def read_bytes(offset, length)
|
34
|
+
slice = @buffer.byteslice(offset, length)
|
35
|
+
raise Capnp::Error.new("Offset+length exceeds data size") if slice.nil? || slice.bytesize != length
|
36
|
+
slice
|
37
|
+
end
|
38
|
+
|
39
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
40
|
+
def read_u8(offset)
|
41
|
+
T.cast(read_bytes(offset, 1).unpack1("C"), Integer)
|
42
|
+
end
|
43
|
+
|
44
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
45
|
+
def read_u16(offset)
|
46
|
+
T.cast(read_bytes(offset, 2).unpack1("S<"), Integer)
|
47
|
+
end
|
48
|
+
|
49
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
50
|
+
def read_u32(offset)
|
51
|
+
T.cast(read_bytes(offset, 4).unpack1("L<"), Integer)
|
52
|
+
end
|
53
|
+
|
54
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
55
|
+
def read_u64(offset)
|
56
|
+
T.cast(read_bytes(offset, 8).unpack1("Q<"), Integer)
|
57
|
+
end
|
58
|
+
|
59
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
60
|
+
def read_s8(offset)
|
61
|
+
T.cast(read_bytes(offset, 1).unpack1("c"), Integer)
|
62
|
+
end
|
63
|
+
|
64
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
65
|
+
def read_s16(offset)
|
66
|
+
T.cast(read_bytes(offset, 2).unpack1("s<"), Integer)
|
67
|
+
end
|
68
|
+
|
69
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
70
|
+
def read_s32(offset)
|
71
|
+
T.cast(read_bytes(offset, 4).unpack1("l<"), Integer)
|
72
|
+
end
|
73
|
+
|
74
|
+
sig { override.params(offset: Integer).returns(Integer) }
|
75
|
+
def read_s64(offset)
|
76
|
+
T.cast(read_bytes(offset, 8).unpack1("q<"), Integer)
|
77
|
+
end
|
78
|
+
|
79
|
+
sig { override.params(offset: Integer).returns(Float) }
|
80
|
+
def read_f32(offset)
|
81
|
+
T.cast(read_bytes(offset, 4).unpack1("e"), Float)
|
82
|
+
end
|
83
|
+
|
84
|
+
sig { override.params(offset: Integer).returns(Float) }
|
85
|
+
def read_f64(offset)
|
86
|
+
T.cast(read_bytes(offset, 8).unpack1("E"), Float)
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "sorbet-runtime"
|
4
|
+
require_relative "list"
|
5
|
+
|
6
|
+
class Capnp::Data < Capnp::BufferList
|
7
|
+
Elem = type_member { {fixed: Integer} }
|
8
|
+
|
9
|
+
sig { returns(String) }
|
10
|
+
def value = @data.read_bytes(0, @length)
|
11
|
+
|
12
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
13
|
+
private def get(ix)
|
14
|
+
@data.read_u8(ix)
|
15
|
+
end
|
16
|
+
|
17
|
+
sig { override.returns(Object) }
|
18
|
+
def to_obj = value
|
19
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "sorbet-runtime"
|
4
|
+
require_relative "../list"
|
5
|
+
|
6
|
+
class Capnp::BufferList
|
7
|
+
include Capnp::List
|
8
|
+
extend T::Sig
|
9
|
+
extend T::Generic
|
10
|
+
extend T::Helpers
|
11
|
+
|
12
|
+
abstract!
|
13
|
+
|
14
|
+
Elem = type_member(:out)
|
15
|
+
|
16
|
+
private_class_method :new
|
17
|
+
|
18
|
+
sig do
|
19
|
+
params(
|
20
|
+
data: Capnp::Reference,
|
21
|
+
length: Integer,
|
22
|
+
element_type: Integer,
|
23
|
+
element_size: Integer,
|
24
|
+
data_words: Integer,
|
25
|
+
pointer_words: Integer
|
26
|
+
).void
|
27
|
+
end
|
28
|
+
def initialize(data, length, element_type, element_size, data_words, pointer_words)
|
29
|
+
@data = data
|
30
|
+
@length = length
|
31
|
+
@element_type = element_type
|
32
|
+
@element_size = element_size
|
33
|
+
@data_words = data_words
|
34
|
+
@pointer_words = pointer_words
|
35
|
+
end
|
36
|
+
|
37
|
+
sig { params(pointer_ref: Capnp::Reference).returns(T.nilable(T.attached_class)) }
|
38
|
+
def self.from_pointer(pointer_ref)
|
39
|
+
# Process far pointers
|
40
|
+
pointer_ref, content_ref = pointer_ref.segment.message.dereference_pointer(pointer_ref)
|
41
|
+
|
42
|
+
# Grab lower 32 bits as offset and upper 32 bits as size
|
43
|
+
pointer_data = pointer_ref.read_bytes(0, Capnp::WORD_SIZE)
|
44
|
+
offset_part, size_part = T.cast(pointer_data.unpack("l<L<"), [Integer, Integer])
|
45
|
+
|
46
|
+
# Check for NULL pointer
|
47
|
+
return nil if offset_part.zero? && size_part.zero?
|
48
|
+
|
49
|
+
# Check this is a list pointer
|
50
|
+
pointer_type = offset_part & 0b11
|
51
|
+
raise Capnp::Error.new("List pointer has type #{pointer_type}") unless pointer_type == 1
|
52
|
+
|
53
|
+
# Determine the length of the list
|
54
|
+
length = size_part >> 3
|
55
|
+
|
56
|
+
# Determine the size of the data section and individual elements
|
57
|
+
element_type = size_part & 0b111
|
58
|
+
element_size = case element_type
|
59
|
+
# Void type elements
|
60
|
+
when 0 then 0
|
61
|
+
# Bit type elements
|
62
|
+
when 1 then 1
|
63
|
+
# Integer type elements
|
64
|
+
when 2, 3, 4, 5 then 1 << (element_type - 2)
|
65
|
+
# Pointer type elements
|
66
|
+
when 6 then Capnp::WORD_SIZE
|
67
|
+
# Composite type elements
|
68
|
+
else
|
69
|
+
0 # (Set below)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Extract data section
|
73
|
+
if content_ref.nil?
|
74
|
+
data_offset = ((offset_part >> 2) + 1) * Capnp::WORD_SIZE
|
75
|
+
data_ref = pointer_ref.offset_position(data_offset)
|
76
|
+
else
|
77
|
+
data_ref = content_ref
|
78
|
+
end
|
79
|
+
|
80
|
+
# Fetch tag for composite type elements
|
81
|
+
data_words = 0
|
82
|
+
pointers_words = 0
|
83
|
+
if element_type == 7
|
84
|
+
# Decode tag as a struct pointer
|
85
|
+
length, data_words, pointers_words = Capnp::Struct.decode_pointer(data_ref)
|
86
|
+
data_ref = data_ref.offset_position(Capnp::WORD_SIZE)
|
87
|
+
|
88
|
+
# Calculate element size
|
89
|
+
element_size = (data_words + pointers_words) * Capnp::WORD_SIZE
|
90
|
+
end
|
91
|
+
|
92
|
+
new(data_ref, length, element_type, element_size, data_words, pointers_words)
|
93
|
+
end
|
94
|
+
|
95
|
+
sig { override.returns(Integer) }
|
96
|
+
attr_reader :length
|
97
|
+
|
98
|
+
sig { returns(Integer) }
|
99
|
+
attr_reader :element_type
|
100
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "sorbet-runtime"
|
4
|
+
require_relative "list"
|
5
|
+
|
6
|
+
class Capnp::NumericList < Capnp::BufferList
|
7
|
+
abstract!
|
8
|
+
|
9
|
+
Elem = type_member(:out)
|
10
|
+
|
11
|
+
sig { override.returns(Object) }
|
12
|
+
def to_obj = to_a
|
13
|
+
end
|
14
|
+
|
15
|
+
class Capnp::U8List < Capnp::NumericList
|
16
|
+
Elem = type_member { {fixed: Integer} }
|
17
|
+
|
18
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
19
|
+
private def get(ix)
|
20
|
+
@data.read_u8(ix)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Capnp::U16List < Capnp::NumericList
|
25
|
+
Elem = type_member { {fixed: Integer} }
|
26
|
+
|
27
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
28
|
+
private def get(ix)
|
29
|
+
@data.read_u16(ix * 2)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Capnp::U32List < Capnp::NumericList
|
34
|
+
Elem = type_member { {fixed: Integer} }
|
35
|
+
|
36
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
37
|
+
private def get(ix)
|
38
|
+
@data.read_u32(ix * 4)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Capnp::U64List < Capnp::NumericList
|
43
|
+
Elem = type_member { {fixed: Integer} }
|
44
|
+
|
45
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
46
|
+
private def get(ix)
|
47
|
+
@data.read_u64(ix * 8)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class Capnp::S8List < Capnp::NumericList
|
52
|
+
Elem = type_member { {fixed: Integer} }
|
53
|
+
|
54
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
55
|
+
private def get(ix)
|
56
|
+
@data.read_s8(ix)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Capnp::S16List < Capnp::NumericList
|
61
|
+
Elem = type_member { {fixed: Integer} }
|
62
|
+
|
63
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
64
|
+
private def get(ix)
|
65
|
+
@data.read_s16(ix * 2)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class Capnp::S32List < Capnp::NumericList
|
70
|
+
Elem = type_member { {fixed: Integer} }
|
71
|
+
|
72
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
73
|
+
private def get(ix)
|
74
|
+
@data.read_s32(ix * 4)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class Capnp::S64List < Capnp::NumericList
|
79
|
+
Elem = type_member { {fixed: Integer} }
|
80
|
+
|
81
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
82
|
+
private def get(ix)
|
83
|
+
@data.read_s64(ix * 8)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class Capnp::F32List < Capnp::NumericList
|
88
|
+
Elem = type_member { {fixed: Float} }
|
89
|
+
|
90
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
91
|
+
private def get(ix)
|
92
|
+
@data.read_f32(ix * 4)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class Capnp::F64List < Capnp::NumericList
|
97
|
+
Elem = type_member { {fixed: Float} }
|
98
|
+
|
99
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
100
|
+
private def get(ix)
|
101
|
+
@data.read_f64(ix * 8)
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "sorbet-runtime"
|
4
|
+
require_relative "list"
|
5
|
+
require_relative "../string"
|
6
|
+
|
7
|
+
class Capnp::BufferString < Capnp::BufferList
|
8
|
+
include Capnp::String
|
9
|
+
|
10
|
+
Elem = type_member { {fixed: String} }
|
11
|
+
|
12
|
+
sig { override.returns(String) }
|
13
|
+
def to_s = @data.read_string(0, @length - 1)
|
14
|
+
|
15
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
16
|
+
private def get(ix)
|
17
|
+
@data.read_string(ix, 1)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "sorbet-runtime"
|
4
|
+
require_relative "list"
|
5
|
+
|
6
|
+
class Capnp::StructList < Capnp::BufferList
|
7
|
+
abstract!
|
8
|
+
|
9
|
+
Elem = type_member { {upper: Capnp::Struct} }
|
10
|
+
|
11
|
+
sig { abstract.returns(T::Class[Elem]) }
|
12
|
+
def element_class
|
13
|
+
end
|
14
|
+
|
15
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
16
|
+
private def get(ix)
|
17
|
+
case @element_type
|
18
|
+
# Void type elements
|
19
|
+
when 0 then element_class.new(Capnp::Reference::EMPTY, 0, Capnp::Reference::EMPTY, 0)
|
20
|
+
|
21
|
+
# Bit type elements
|
22
|
+
when 1 then raise "Bit lists may not be decoded as structs"
|
23
|
+
|
24
|
+
# Integer type elements
|
25
|
+
when 2, 3, 4, 5
|
26
|
+
data_offset = ix * @element_size
|
27
|
+
element_class.new(@data.offset_position(data_offset), @element_size, Capnp::Reference::EMPTY, 0)
|
28
|
+
|
29
|
+
# Pointer type elements
|
30
|
+
when 6
|
31
|
+
data_offset = ix * @element_size
|
32
|
+
element_class.new(Capnp::Reference::EMPTY, 0, @data.offset_position(data_offset), @element_size)
|
33
|
+
|
34
|
+
# Composite type elements
|
35
|
+
else
|
36
|
+
data_offset = ix * @element_size
|
37
|
+
data_size = @data_words * Capnp::WORD_SIZE
|
38
|
+
data_ref = @data.offset_position(data_offset)
|
39
|
+
pointers_size = @pointer_words * Capnp::WORD_SIZE
|
40
|
+
pointers_ref = @data.offset_position(data_offset + data_size)
|
41
|
+
element_class.new(data_ref, data_size, pointers_ref, pointers_size)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
sig { override.returns(Object) }
|
46
|
+
def to_obj = map(&:to_obj)
|
47
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "sorbet-runtime"
|
4
|
+
|
5
|
+
module Capnp::List
|
6
|
+
include Kernel
|
7
|
+
include Enumerable
|
8
|
+
extend T::Sig
|
9
|
+
extend T::Generic
|
10
|
+
extend T::Helpers
|
11
|
+
|
12
|
+
abstract!
|
13
|
+
|
14
|
+
Elem = type_member(:out)
|
15
|
+
|
16
|
+
sig { abstract.returns(Integer) }
|
17
|
+
def length
|
18
|
+
end
|
19
|
+
|
20
|
+
# Get a single element at the given index
|
21
|
+
# THE INDEX MUST BE IN RANGE.
|
22
|
+
sig { abstract.params(ix: Integer).returns(Elem) }
|
23
|
+
private def get(ix)
|
24
|
+
end
|
25
|
+
|
26
|
+
sig { params(ix: Integer).returns(T.nilable(Elem)) }
|
27
|
+
def [](ix)
|
28
|
+
return if ix < 0 || ix >= length
|
29
|
+
get(ix)
|
30
|
+
end
|
31
|
+
|
32
|
+
sig { override.params(blk: T.proc.params(arg0: Elem).returns(BasicObject)).void }
|
33
|
+
def each(&blk)
|
34
|
+
length.times do |ix|
|
35
|
+
blk.call(get(ix))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
sig { abstract.returns(Object) }
|
40
|
+
def to_obj
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "sorbet-runtime"
|
4
|
+
require_relative "../list"
|
5
|
+
|
6
|
+
class Capnp::ObjectList
|
7
|
+
include Capnp::List
|
8
|
+
extend T::Sig
|
9
|
+
extend T::Generic
|
10
|
+
|
11
|
+
Elem = type_member(:out)
|
12
|
+
|
13
|
+
sig { params(array: T::Array[Elem]).void }
|
14
|
+
def initialize(array)
|
15
|
+
@array = array
|
16
|
+
end
|
17
|
+
|
18
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
19
|
+
private def get(ix) = @array.fetch(ix)
|
20
|
+
|
21
|
+
sig { override.returns(Integer) }
|
22
|
+
def length = @array.length
|
23
|
+
|
24
|
+
sig { override.returns(Object) }
|
25
|
+
def to_obj = @array
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "sorbet-runtime"
|
4
|
+
require_relative "../string"
|
5
|
+
|
6
|
+
class Capnp::ObjectString
|
7
|
+
include Capnp::String
|
8
|
+
extend T::Sig
|
9
|
+
extend T::Generic
|
10
|
+
|
11
|
+
Elem = type_member { {fixed: String} }
|
12
|
+
|
13
|
+
sig { params(string: String).void }
|
14
|
+
def initialize(string)
|
15
|
+
@string = T.let(string.freeze, String)
|
16
|
+
end
|
17
|
+
|
18
|
+
sig { override.returns(String) }
|
19
|
+
def to_s = @string
|
20
|
+
|
21
|
+
sig { override.params(ix: Integer).returns(Elem) }
|
22
|
+
private def get(ix) = T.must(@string[ix])
|
23
|
+
|
24
|
+
sig { override.returns(Integer) }
|
25
|
+
def length = @string.length
|
26
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# typed: strict
|
2
|
+
|
3
|
+
require "sorbet-runtime"
|
4
|
+
require_relative "list"
|
5
|
+
|
6
|
+
module Capnp::String
|
7
|
+
include Capnp::List
|
8
|
+
extend T::Sig
|
9
|
+
extend T::Generic
|
10
|
+
extend T::Helpers
|
11
|
+
|
12
|
+
abstract!
|
13
|
+
|
14
|
+
Elem = type_member { {fixed: String} }
|
15
|
+
|
16
|
+
sig { abstract.returns(String) }
|
17
|
+
def to_s
|
18
|
+
end
|
19
|
+
|
20
|
+
sig { override.returns(Object) }
|
21
|
+
def to_obj = to_s
|
22
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# typed: strong
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "sorbet-runtime"
|
5
|
+
require_relative "message"
|
6
|
+
require_relative "../segment"
|
7
|
+
|
8
|
+
class Capnp::FlatMessage < Capnp::Message
|
9
|
+
extend T::Sig
|
10
|
+
|
11
|
+
sig { params(segment: Capnp::Buffer).void }
|
12
|
+
def initialize(segment)
|
13
|
+
@segment = T.let(Capnp::Segment.new(self, segment), Capnp::Segment)
|
14
|
+
end
|
15
|
+
|
16
|
+
sig { override.params(id: Integer).returns(Capnp::Segment) }
|
17
|
+
def segment(id)
|
18
|
+
raise Capnp::Error.new("Unknown Segment ID #{id}") unless id.zero?
|
19
|
+
@segment
|
20
|
+
end
|
21
|
+
end
|