capnp 0.0.1
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 +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
|