@@ -7,8 +7,8 @@ use std::mem;
7
7
#[ derive( Debug , Copy , Clone , Ord , PartialOrd , Eq , PartialEq , Hash ) ]
8
8
pub enum VersionstampOffset {
9
9
None { size : u32 } ,
10
- One { offset : u32 } ,
11
- Multiple ,
10
+ OneIncomplete { offset : u32 } ,
11
+ MultipleIncomplete ,
12
12
}
13
13
impl std:: ops:: AddAssign < u32 > for VersionstampOffset {
14
14
fn add_assign ( & mut self , r : u32 ) {
@@ -23,14 +23,18 @@ impl std::ops::AddAssign for VersionstampOffset {
23
23
( VersionstampOffset :: None { size } , VersionstampOffset :: None { size : r } ) => {
24
24
* size += r;
25
25
}
26
- ( VersionstampOffset :: None { size } , VersionstampOffset :: One { offset } ) => {
27
- * self = VersionstampOffset :: One {
26
+ ( VersionstampOffset :: None { size } , VersionstampOffset :: OneIncomplete { offset } ) => {
27
+ * self = VersionstampOffset :: OneIncomplete {
28
28
offset : * size + offset,
29
29
} ;
30
30
}
31
- ( VersionstampOffset :: One { .. } , VersionstampOffset :: One { .. } )
32
- | ( VersionstampOffset :: One { .. } , VersionstampOffset :: Multiple ) => {
33
- * self = VersionstampOffset :: Multiple ;
31
+ (
32
+ VersionstampOffset :: OneIncomplete { .. } ,
33
+ VersionstampOffset :: OneIncomplete { .. } ,
34
+ )
35
+ | ( VersionstampOffset :: None { .. } , VersionstampOffset :: MultipleIncomplete )
36
+ | ( VersionstampOffset :: OneIncomplete { .. } , VersionstampOffset :: MultipleIncomplete ) => {
37
+ * self = VersionstampOffset :: MultipleIncomplete ;
34
38
}
35
39
_ => { }
36
40
}
@@ -69,7 +73,10 @@ pub trait TuplePack {
69
73
/// Panics if there is multiple versionstamp present or if the encoded data size doesn't fit in `u32`.
70
74
fn pack_to_vec_with_versionstamp ( & self ) -> Vec < u8 > {
71
75
let mut vec = Vec :: new ( ) ;
72
- self . pack_into_vec_with_versionstamp ( & mut vec) ;
76
+ let offset = self . pack_into_vec_with_versionstamp ( & mut vec) ;
77
+ if let VersionstampOffset :: MultipleIncomplete = offset {
78
+ panic ! ( "pack_to_vec_with_versionstamp does not allow multiple versionstamps" ) ;
79
+ }
73
80
vec
74
81
}
75
82
@@ -86,21 +93,16 @@ pub trait TuplePack {
86
93
///
87
94
/// # Panics
88
95
///
89
- /// Panics if there is multiple versionstamp present or if the encoded data size doesn't fit in `u32`.
90
- fn pack_into_vec_with_versionstamp ( & self , output : & mut Vec < u8 > ) {
96
+ /// Panics if the encoded data size doesn't fit in `u32`.
97
+ fn pack_into_vec_with_versionstamp ( & self , output : & mut Vec < u8 > ) -> VersionstampOffset {
91
98
let mut offset = VersionstampOffset :: None {
92
99
size : u32:: try_from ( output. len ( ) ) . expect ( PACK_ERR_MSG ) ,
93
100
} ;
94
101
offset += self . pack_root ( output) . expect ( PACK_ERR_MSG ) ;
95
- match offset {
96
- VersionstampOffset :: None { size : _ } => { }
97
- VersionstampOffset :: One { offset } => {
98
- output. extend_from_slice ( & offset. to_le_bytes ( ) ) ;
99
- }
100
- VersionstampOffset :: Multiple => {
101
- panic ! ( "pack_into_with_versionstamp does not allow multiple versionstamps" ) ;
102
- }
102
+ if let VersionstampOffset :: OneIncomplete { offset } = offset {
103
+ output. extend_from_slice ( & offset. to_le_bytes ( ) ) ;
103
104
}
105
+ offset
104
106
}
105
107
}
106
108
@@ -342,14 +344,16 @@ macro_rules! impl_ux {
342
344
const SZ : usize = mem:: size_of:: <$ux>( ) ;
343
345
let u = * self ;
344
346
let n = SZ - ( u. leading_zeros( ) as usize ) / 8 ;
347
+ let mut offset = VersionstampOffset :: None { size: n as u32 + 1 } ;
345
348
if SZ <= MAX_SZ || n <= MAX_SZ {
346
349
w. write_all( & [ INTZERO + n as u8 ] ) ?;
347
350
} else {
348
351
w. write_all( & [ POSINTEND , n as u8 ] ) ?;
349
- }
352
+ offset += 1 ;
353
+ } ;
350
354
w. write_all( & u. to_be_bytes( ) [ SZ - n..] ) ?;
351
355
352
- Ok ( VersionstampOffset :: None { size : n as u32 + 1 } )
356
+ Ok ( offset )
353
357
}
354
358
}
355
359
@@ -393,24 +397,27 @@ macro_rules! impl_ix {
393
397
let i = * self ;
394
398
let u = self . wrapping_abs( ) as $ux;
395
399
let n = SZ - ( u. leading_zeros( ) as usize ) / 8 ;
400
+ let mut offset = VersionstampOffset :: None { size: n as u32 + 1 } ;
396
401
let arr = if i >= 0 {
397
402
if SZ <= MAX_SZ || n <= MAX_SZ {
398
403
w. write_all( & [ INTZERO + n as u8 ] ) ?;
399
404
} else {
400
405
w. write_all( & [ POSINTEND , n as u8 ] ) ?;
406
+ offset += 1 ;
401
407
}
402
408
( u. to_be_bytes( ) )
403
409
} else {
404
410
if SZ <= MAX_SZ || n <= MAX_SZ {
405
411
w. write_all( & [ INTZERO - n as u8 ] ) ?;
406
412
} else {
407
413
w. write_all( & [ NEGINTSTART , n as u8 ^ 0xff ] ) ?;
414
+ offset += 1 ;
408
415
}
409
416
( i. wrapping_sub( 1 ) . to_be_bytes( ) )
410
417
} ;
411
418
w. write_all( & arr[ SZ - n..] ) ?;
412
419
413
- Ok ( VersionstampOffset :: None { size : n as u32 + 1 } )
420
+ Ok ( offset )
414
421
}
415
422
}
416
423
@@ -470,7 +477,7 @@ macro_rules! impl_fx {
470
477
w. write_all( & [ $code] ) ?;
471
478
w. write_all( & bytes) ?;
472
479
Ok ( VersionstampOffset :: None {
473
- size: std:: mem:: size_of:: <$fx>( ) as u32 / 8 + 1 ,
480
+ size: std:: mem:: size_of:: <$fx>( ) as u32 + 1 ,
474
481
} )
475
482
}
476
483
}
@@ -558,12 +565,14 @@ mod bigint {
558
565
}
559
566
let ( sign, mut bytes) = self . to_bytes_be ( ) ;
560
567
let n = bytes. len ( ) ;
568
+ let mut offset = VersionstampOffset :: None { size : n as u32 + 1 } ;
561
569
match sign {
562
570
Sign :: Minus => {
563
571
if n <= MAX_SZ {
564
572
w. write_all ( & [ INTZERO - n as u8 ] ) ?;
565
573
} else {
566
574
w. write_all ( & [ NEGINTSTART , bigint_n ( n) ? ^ 0xff ] ) ?;
575
+ offset += 1 ;
567
576
}
568
577
invert ( & mut bytes) ;
569
578
w. write_all ( & bytes) ?;
@@ -574,12 +583,13 @@ mod bigint {
574
583
w. write_all ( & [ INTZERO + n as u8 ] ) ?;
575
584
} else {
576
585
w. write_all ( & [ POSINTEND , bigint_n ( n) ?] ) ?;
586
+ offset += 1 ;
577
587
}
578
588
w. write_all ( & bytes) ?;
579
589
}
580
- } ;
590
+ }
581
591
582
- Ok ( VersionstampOffset :: None { size : n as u32 + 1 } )
592
+ Ok ( offset )
583
593
}
584
594
}
585
595
@@ -626,14 +636,16 @@ mod bigint {
626
636
}
627
637
let bytes = self . to_bytes_be ( ) ;
628
638
let n = bytes. len ( ) ;
639
+ let mut offset = VersionstampOffset :: None { size : n as u32 + 1 } ;
629
640
if n <= MAX_SZ {
630
641
w. write_all ( & [ INTZERO + n as u8 ] ) ?;
631
642
} else {
632
643
w. write_all ( & [ POSINTEND , bigint_n ( n) ?] ) ?;
644
+ offset += 1 ;
633
645
}
634
646
w. write_all ( & bytes) ?;
635
647
636
- Ok ( VersionstampOffset :: None { size : n as u32 + 1 } )
648
+ Ok ( offset )
637
649
}
638
650
}
639
651
@@ -995,10 +1007,11 @@ impl<'de> TupleUnpack<'de> for Element<'de> {
995
1007
( input, Element :: Uuid ( v) )
996
1008
}
997
1009
found => {
1010
+ dbg ! ( Bytes :: from( input) ) ;
998
1011
return Err ( PackError :: BadCode {
999
1012
found,
1000
1013
expected : None ,
1001
- } )
1014
+ } ) ;
1002
1015
}
1003
1016
} ;
1004
1017
@@ -1025,7 +1038,11 @@ impl TuplePack for Versionstamp {
1025
1038
) -> io:: Result < VersionstampOffset > {
1026
1039
w. write_all ( & [ VERSIONSTAMP ] ) ?;
1027
1040
w. write_all ( self . as_bytes ( ) ) ?;
1028
- Ok ( VersionstampOffset :: One { offset : 1 } )
1041
+ if self . is_complete ( ) {
1042
+ Ok ( VersionstampOffset :: None { size : 1 + 12 } )
1043
+ } else {
1044
+ Ok ( VersionstampOffset :: OneIncomplete { offset : 1 } )
1045
+ }
1029
1046
}
1030
1047
}
1031
1048
0 commit comments