-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathencoder.v
More file actions
140 lines (114 loc) · 3.48 KB
/
Copy pathencoder.v
File metadata and controls
140 lines (114 loc) · 3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
module protobuf
import math
// Encoder builds a message via append-only writes. Field helpers write
// tag + value unconditionally; proto3 zero-elision is the caller's policy.
// No length backpatching: length prefixes are known up front — generated
// code sizes sub-messages via encoded_size(), hand-written code passes
// pre-encoded buffers to write_message_field / write_bytes_field.
pub struct Encoder {
pub mut:
buf []u8
}
pub fn (mut e Encoder) write_varint(v u64) {
mut x := v
for x >= 0x80 {
e.buf << u8(x & 0x7f | 0x80)
x >>= 7
}
e.buf << u8(x)
}
pub fn (mut e Encoder) write_tag(field u32, wt WireType) {
e.write_varint(u64(field) << 3 | u64(int(wt)))
}
pub fn (mut e Encoder) write_fixed32(v u32) {
e.buf << u8(v)
e.buf << u8(v >> 8)
e.buf << u8(v >> 16)
e.buf << u8(v >> 24)
}
pub fn (mut e Encoder) write_fixed64(v u64) {
e.write_fixed32(u32(v))
e.write_fixed32(u32(v >> 32))
}
// write_raw appends already-encoded wire bytes verbatim; generated code
// uses it to re-emit preserved unknown fields
pub fn (mut e Encoder) write_raw(b []u8) {
e.buf << b
}
pub fn (mut e Encoder) write_len_prefixed(b []u8) {
e.write_varint(u64(b.len))
e.buf << b
}
// untagged float writes, for packed repeated payloads
pub fn (mut e Encoder) write_f32(v f32) {
e.write_fixed32(math.f32_bits(v))
}
pub fn (mut e Encoder) write_f64(v f64) {
e.write_fixed64(math.f64_bits(v))
}
// int32/int64/enum negatives sign-extend to 64 bits: always 10 bytes on the wire.
pub fn (mut e Encoder) write_int32_field(field u32, v int) {
e.write_tag(field, .varint)
e.write_varint(int32_wire(v))
}
pub fn (mut e Encoder) write_int64_field(field u32, v i64) {
e.write_tag(field, .varint)
e.write_varint(u64(v))
}
pub fn (mut e Encoder) write_uint32_field(field u32, v u32) {
e.write_tag(field, .varint)
e.write_varint(u64(v))
}
pub fn (mut e Encoder) write_uint64_field(field u32, v u64) {
e.write_tag(field, .varint)
e.write_varint(v)
}
pub fn (mut e Encoder) write_sint32_field(field u32, v int) {
e.write_tag(field, .varint)
e.write_varint(sint32_wire(v))
}
pub fn (mut e Encoder) write_sint64_field(field u32, v i64) {
e.write_tag(field, .varint)
e.write_varint(zigzag_encode(v))
}
pub fn (mut e Encoder) write_bool_field(field u32, v bool) {
e.write_tag(field, .varint)
e.write_varint(if v { u64(1) } else { u64(0) })
}
pub fn (mut e Encoder) write_string_field(field u32, s string) {
e.write_tag(field, .len_delim)
e.write_varint(u64(s.len))
// append straight from the string's storage — s.bytes() would clone
unsafe { e.buf.push_many(s.str, s.len) }
}
pub fn (mut e Encoder) write_bytes_field(field u32, b []u8) {
e.write_tag(field, .len_delim)
e.write_len_prefixed(b)
}
pub fn (mut e Encoder) write_message_field(field u32, encoded []u8) {
e.write_bytes_field(field, encoded)
}
pub fn (mut e Encoder) write_float_field(field u32, v f32) {
e.write_tag(field, .fixed32)
e.write_fixed32(math.f32_bits(v))
}
pub fn (mut e Encoder) write_double_field(field u32, v f64) {
e.write_tag(field, .fixed64)
e.write_fixed64(math.f64_bits(v))
}
pub fn (mut e Encoder) write_fixed32_field(field u32, v u32) {
e.write_tag(field, .fixed32)
e.write_fixed32(v)
}
pub fn (mut e Encoder) write_fixed64_field(field u32, v u64) {
e.write_tag(field, .fixed64)
e.write_fixed64(v)
}
pub fn (mut e Encoder) write_sfixed32_field(field u32, v int) {
e.write_tag(field, .fixed32)
e.write_fixed32(u32(v))
}
pub fn (mut e Encoder) write_sfixed64_field(field u32, v i64) {
e.write_tag(field, .fixed64)
e.write_fixed64(u64(v))
}