@@ -16,15 +16,15 @@ let write_fixed64 ~f v =
1616let write_fixed32 ~f v =
1717 Writer. write_fixed32_value (f v)
1818
19- let zigzag_encoding v =
19+ let encode_zigzag v =
2020 let open Infix.Int64 in
2121 let v = match v < 0L with
2222 | true -> v lsl 1 lxor (- 1L )
2323 | false -> v lsl 1
2424 in
2525 v
2626
27- let zigzag_encoding_unboxed v =
27+ let encode_zigzag_unboxed v =
2828 let v = match v < 0 with
2929 | true -> v lsl 1 lxor (- 1 )
3030 | false -> v lsl 1
@@ -55,16 +55,16 @@ let write_value : type a b. (a, b) spec -> a -> Writer.t -> unit = function
5555 | SFixed32_int -> write_fixed32 ~f: Int32. of_int
5656 | Int64 -> Writer. write_varint_value
5757 | UInt64 -> Writer. write_varint_value
58- | SInt64 -> write_varint ~f: zigzag_encoding
58+ | SInt64 -> write_varint ~f: encode_zigzag
5959 | Int32 -> write_varint_unboxed ~f: Int32. to_int
6060 | UInt32 -> write_varint_unboxed ~f: Int32. to_int
61- | SInt32 -> write_varint_unboxed ~f: (Int32. to_int @@ zigzag_encoding_unboxed )
61+ | SInt32 -> write_varint_unboxed ~f: (Int32. to_int @@ encode_zigzag_unboxed )
6262 | Int64_int -> Writer. write_varint_unboxed_value
6363 | UInt64_int -> Writer. write_varint_unboxed_value
6464 | Int32_int -> Writer. write_varint_unboxed_value
6565 | UInt32_int -> Writer. write_varint_unboxed_value
66- | SInt64_int -> write_varint_unboxed ~f: zigzag_encoding_unboxed
67- | SInt32_int -> write_varint_unboxed ~f: zigzag_encoding_unboxed
66+ | SInt64_int -> write_varint_unboxed ~f: encode_zigzag_unboxed
67+ | SInt32_int -> write_varint_unboxed ~f: encode_zigzag_unboxed
6868
6969 | Bool -> write_varint_unboxed ~f: (function true -> 1 | false -> 0 )
7070 | String -> fun v -> Writer. write_length_delimited_value ~data: v ~offset: 0 ~len: (String. length v)
@@ -177,28 +177,56 @@ let rec serialize: type a. (a, unit) compound_list -> Writer.t -> a = function
177177 cont writer
178178
179179let % expect_test " zigzag encoding" =
180- let test vl =
181- let v = Int64. to_int vl in
182- Printf. printf " zigzag_encoding(%LdL) = %LdL\n " vl (zigzag_encoding vl);
183- Printf. printf " zigzag_encoding_unboxed(%d) = %d\n " v (zigzag_encoding_unboxed v);
180+ let n2l = Int64. of_int in
181+ let i2l = Int64. of_int32 in
182+ let test_values =
183+ [Int64. min_int; n2l Int. min_int; i2l Int32. min_int; - 2L ;
184+ 0L ; 3L ; i2l Int32. max_int; n2l Int. max_int; Int64. max_int]
185+ |> List. map ~f: (
186+ let open Infix.Int64 in
187+ function
188+ | v when v > 0L -> [pred v; v]
189+ | v -> [v; succ v]
190+ )
191+ |> List. concat
184192 in
185- List. iter ~f: test [0L ; - 1L ; 1L ; - 2L ; 2L ; 2147483647L ; - 2147483648L ; Int64. max_int; Int64. min_int; ];
193+ List. iter ~f: (fun vl -> Printf. printf " zigzag_encoding 0x%016Lx = 0x%016Lx\n " vl (encode_zigzag vl)) test_values;
194+ List. iter ~f: (fun v -> Printf. printf " zigzag_encoding_unboxed 0x%016x = 0x%016x\n " (Int64. to_int v) (Int64. to_int v |> encode_zigzag_unboxed)) test_values;
186195 [% expect {|
187- zigzag_encoding(0L ) = 0L
188- zigzag_encoding_unboxed(0 ) = 0
189- zigzag_encoding(- 1L ) = 1L
190- zigzag_encoding_unboxed(- 1 ) = 1
191- zigzag_encoding(1L ) = 2L
192- zigzag_encoding_unboxed(1 ) = 2
193- zigzag_encoding(- 2L ) = 3L
194- zigzag_encoding_unboxed(- 2 ) = 3
195- zigzag_encoding(2L ) = 4L
196- zigzag_encoding_unboxed(2 ) = 4
197- zigzag_encoding(2147483647L ) = 4294967294L
198- zigzag_encoding_unboxed(2147483647 ) = 4294967294
199- zigzag_encoding(- 2147483648L ) = 4294967295L
200- zigzag_encoding_unboxed(- 2147483648 ) = 4294967295
201- zigzag_encoding(9223372036854775807L ) = - 2L
202- zigzag_encoding_unboxed(- 1 ) = 1
203- zigzag_encoding(- 9223372036854775808L ) = - 1L
204- zigzag_encoding_unboxed(0 ) = 0 | }]
196+ zigzag_encoding 0x8000000000000000 = 0xffffffffffffffff
197+ zigzag_encoding 0x8000000000000001 = 0xfffffffffffffffd
198+ zigzag_encoding 0xc000000000000000 = 0x7fffffffffffffff
199+ zigzag_encoding 0xc000000000000001 = 0x7ffffffffffffffd
200+ zigzag_encoding 0xffffffff80000000 = 0x00000000ffffffff
201+ zigzag_encoding 0xffffffff80000001 = 0x00000000fffffffd
202+ zigzag_encoding 0xfffffffffffffffe = 0x0000000000000003
203+ zigzag_encoding 0xffffffffffffffff = 0x0000000000000001
204+ zigzag_encoding 0x0000000000000000 = 0x0000000000000000
205+ zigzag_encoding 0x0000000000000001 = 0x0000000000000002
206+ zigzag_encoding 0x0000000000000002 = 0x0000000000000004
207+ zigzag_encoding 0x0000000000000003 = 0x0000000000000006
208+ zigzag_encoding 0x000000007ffffffe = 0x00000000fffffffc
209+ zigzag_encoding 0x000000007fffffff = 0x00000000fffffffe
210+ zigzag_encoding 0x3ffffffffffffffe = 0x7ffffffffffffffc
211+ zigzag_encoding 0x3fffffffffffffff = 0x7ffffffffffffffe
212+ zigzag_encoding 0x7ffffffffffffffe = 0xfffffffffffffffc
213+ zigzag_encoding 0x7fffffffffffffff = 0xfffffffffffffffe
214+ zigzag_encoding_unboxed 0x0000000000000000 = 0x0000000000000000
215+ zigzag_encoding_unboxed 0x0000000000000001 = 0x0000000000000002
216+ zigzag_encoding_unboxed 0x4000000000000000 = 0x7fffffffffffffff
217+ zigzag_encoding_unboxed 0x4000000000000001 = 0x7ffffffffffffffd
218+ zigzag_encoding_unboxed 0x7fffffff80000000 = 0x00000000ffffffff
219+ zigzag_encoding_unboxed 0x7fffffff80000001 = 0x00000000fffffffd
220+ zigzag_encoding_unboxed 0x7ffffffffffffffe = 0x0000000000000003
221+ zigzag_encoding_unboxed 0x7fffffffffffffff = 0x0000000000000001
222+ zigzag_encoding_unboxed 0x0000000000000000 = 0x0000000000000000
223+ zigzag_encoding_unboxed 0x0000000000000001 = 0x0000000000000002
224+ zigzag_encoding_unboxed 0x0000000000000002 = 0x0000000000000004
225+ zigzag_encoding_unboxed 0x0000000000000003 = 0x0000000000000006
226+ zigzag_encoding_unboxed 0x000000007ffffffe = 0x00000000fffffffc
227+ zigzag_encoding_unboxed 0x000000007fffffff = 0x00000000fffffffe
228+ zigzag_encoding_unboxed 0x3ffffffffffffffe = 0x7ffffffffffffffc
229+ zigzag_encoding_unboxed 0x3fffffffffffffff = 0x7ffffffffffffffe
230+ zigzag_encoding_unboxed 0x7ffffffffffffffe = 0x0000000000000003
231+ zigzag_encoding_unboxed 0x7fffffffffffffff = 0x0000000000000001
232+ | }]
0 commit comments