@@ -9,7 +9,7 @@ pub const BYTE_LEN: usize = 8;
9
9
const FRAGMENT_SIZE : u64 = 16 * 1024 ;
10
10
const MAX_FRAGMENTS : u8 = 4 /* 11.9.3.8, NOTE */ ;
11
11
const MIN_FRAGMENT_SIZE : u64 = FRAGMENT_SIZE ;
12
- const MAX_FRAGMENT_SIZE : u64 = FRAGMENT_SIZE * MAX_FRAGMENTS as u64 ;
12
+ const MAX_FRAGMENTS_SIZE : u64 = FRAGMENT_SIZE * MAX_FRAGMENTS as u64 ;
13
13
14
14
const LENGTH_127 : u64 = 127 ;
15
15
const LENGTH_16K : u64 = 16 * 1024 ;
@@ -519,7 +519,7 @@ impl<T: BitWrite> PackedWrite for T {
519
519
lower_bound : Option < u64 > ,
520
520
upper_bound : Option < u64 > ,
521
521
value : u64 ,
522
- ) -> Result < ( ) , Error > {
522
+ ) -> Result < Option < u64 > , Error > {
523
523
let lower_bound_unwrapped = const_unwrap_or ! ( lower_bound, 0 ) ;
524
524
let upper_bound_unwrapped = const_unwrap_or ! ( upper_bound, i64 :: MAX as u64 ) ;
525
525
@@ -528,7 +528,7 @@ impl<T: BitWrite> PackedWrite for T {
528
528
{
529
529
// 11.9.4.2
530
530
if lower_bound == upper_bound {
531
- Ok ( ( ) )
531
+ Ok ( None )
532
532
} else if value < lower_bound_unwrapped {
533
533
Err ( Error :: ValueNotInRange (
534
534
value as i64 ,
@@ -540,29 +540,33 @@ impl<T: BitWrite> PackedWrite for T {
540
540
lower_bound,
541
541
upper_bound,
542
542
value - lower_bound_unwrapped,
543
- )
543
+ ) ?;
544
+ Ok ( None )
544
545
}
545
546
} else if const_is_some ! ( upper_bound) && upper_bound_unwrapped <= LENGTH_64K {
546
547
// 11.9.4.1 -> 11.9.3.4 -> 11.6.1
547
- self . write_non_negative_binary_integer ( lower_bound, upper_bound, value)
548
+ self . write_non_negative_binary_integer ( lower_bound, upper_bound, value) ?;
549
+ Ok ( None )
548
550
} else {
549
551
// 11.9.4.1 -> 11.9.3.5
550
552
if value <= LENGTH_127 {
551
553
// 11.9.3.6: less than or equal to 127
552
554
self . write_bit ( false ) ?;
553
- self . write_non_negative_binary_integer ( None , Some ( LENGTH_127 ) , value)
555
+ self . write_non_negative_binary_integer ( None , Some ( LENGTH_127 ) , value) ?;
556
+ Ok ( None )
554
557
} else if value < LENGTH_16K {
555
558
// 11.9.3.7: greater than 127 and less than or equal to 16K
556
559
self . write_bit ( true ) ?;
557
560
self . write_bit ( false ) ?;
558
- self . write_non_negative_binary_integer ( None , Some ( LENGTH_16K - 1 ) , value)
561
+ self . write_non_negative_binary_integer ( None , Some ( LENGTH_16K - 1 ) , value) ?;
562
+ Ok ( None )
559
563
} else {
560
564
// 11.9.3.8: chunks of 16k multiples
561
565
self . write_bit ( true ) ?;
562
566
self . write_bit ( true ) ?;
563
- let multiple = ( ( value / LENGTH_16K ) as u8 ) . max ( MAX_FRAGMENTS ) ;
567
+ let multiple = ( ( value / LENGTH_16K ) as u8 ) . min ( MAX_FRAGMENTS ) ;
564
568
self . write_bits_with_offset ( & [ multiple] , 2 ) ?;
565
- Ok ( ( ) )
569
+ Ok ( Some ( u64 :: from ( multiple ) * LENGTH_16K ) )
566
570
}
567
571
}
568
572
}
@@ -583,7 +587,7 @@ impl<T: BitWrite> PackedWrite for T {
583
587
let lower_bound = const_unwrap_or ! ( lower_bound_size, 0 ) ;
584
588
let upper_bound = const_unwrap_or ! ( upper_bound_size, i64 :: MAX as u64 ) ;
585
589
let length = len;
586
- let fragmented = length > MAX_FRAGMENT_SIZE ;
590
+ let fragmented = length > MAX_FRAGMENTS_SIZE ;
587
591
let out_of_range = length < lower_bound || length > upper_bound;
588
592
589
593
if extensible {
@@ -619,13 +623,13 @@ impl<T: BitWrite> PackedWrite for T {
619
623
self . write_bits_with_offset_len (
620
624
src,
621
625
offset as usize ,
622
- MAX_FRAGMENT_SIZE . min ( length) as usize ,
626
+ MAX_FRAGMENTS_SIZE . min ( length) as usize ,
623
627
) ?;
624
628
625
629
if fragmented {
626
- let mut written_bits = MAX_FRAGMENT_SIZE ;
630
+ let mut written_bits = MAX_FRAGMENTS_SIZE ;
627
631
loop {
628
- let fragment_size = ( length - written_bits) . min ( MAX_FRAGMENT_SIZE ) ;
632
+ let fragment_size = ( length - written_bits) . min ( MAX_FRAGMENTS_SIZE ) ;
629
633
let fragment_size = fragment_size - ( fragment_size % MIN_FRAGMENT_SIZE ) ;
630
634
self . write_length_determinant ( None , None , fragment_size) ?;
631
635
self . write_bits_with_offset_len (
@@ -658,19 +662,18 @@ impl<T: BitWrite> PackedWrite for T {
658
662
let lower_bound = const_unwrap_or ! ( lower_bound_size, 0 ) ;
659
663
let upper_bound = const_unwrap_or ! ( upper_bound_size, i64 :: MAX as u64 ) ;
660
664
let length = src. len ( ) as u64 ;
661
- let fragmented = length > MAX_FRAGMENT_SIZE ;
662
665
let out_of_range = length < lower_bound || length > upper_bound;
663
666
664
667
if extensible {
665
668
self . write_bit ( out_of_range) ?;
666
669
}
667
670
668
- if out_of_range {
671
+ let fragment_size = if out_of_range {
669
672
if extensible {
670
673
// 17.3
671
674
// self.read_semi_constrained_whole_number(0)
672
675
// self.read_non_negative_binary_integer(0, MAX) + lb | lb=0=>MIN for unsigned
673
- self . write_length_determinant ( None , None , length) ?;
676
+ self . write_length_determinant ( None , None , length) ?
674
677
} else {
675
678
return Err ( Error :: SizeNotInRange ( length, lower_bound, upper_bound) ) ;
676
679
}
@@ -689,27 +692,30 @@ impl<T: BitWrite> PackedWrite for T {
689
692
&& upper_bound < LENGTH_64K
690
693
{
691
694
// 17.7
695
+ None
692
696
} else {
693
697
// 17.8
694
- self . write_length_determinant ( lower_bound_size, upper_bound_size, length) ?;
695
- }
698
+ self . write_length_determinant ( lower_bound_size, upper_bound_size, length) ?
699
+ } ;
696
700
697
- self . write_bits ( & src[ ..MAX_FRAGMENT_SIZE . min ( length) as usize ] ) ?;
701
+ self . write_bits ( & src[ ..fragment_size . unwrap_or ( length) as usize ] ) ?;
698
702
699
- if fragmented {
700
- let mut written_bytes = MAX_FRAGMENT_SIZE ;
703
+ if let Some ( mut written_bytes) = fragment_size {
701
704
loop {
702
- let fragment_size = ( length - written_bytes) . min ( MAX_FRAGMENT_SIZE ) ;
703
- let fragment_size = fragment_size - ( fragment_size % MIN_FRAGMENT_SIZE ) ;
704
- self . write_length_determinant ( None , None , fragment_size) ?;
705
+ let remaining = length - written_bytes;
706
+ let fragment_size = self
707
+ . write_length_determinant ( None , None , remaining) ?
708
+ . unwrap_or ( remaining) ;
709
+
705
710
self . write_bits (
706
711
& src[ written_bytes as usize ..( written_bytes + fragment_size) as usize ] ,
707
712
) ?;
708
- written_bytes += fragment_size;
709
713
710
714
if fragment_size < MIN_FRAGMENT_SIZE {
711
715
break ;
712
716
}
717
+
718
+ written_bytes += fragment_size;
713
719
}
714
720
}
715
721
0 commit comments