@@ -9,21 +9,19 @@ use super::bitpacked_encode;
99pub fn encode_u32 < W : Write , I : Iterator < Item = u32 > > (
1010 writer : & mut W ,
1111 iterator : I ,
12+ length : usize ,
1213 num_bits : u32 ,
1314) -> std:: io:: Result < ( ) > {
1415 let num_bits = num_bits as u8 ;
15- encode_header ( writer, & iterator ) ?;
16- bitpacked_encode_u32 ( writer, iterator, num_bits as usize ) ?;
16+ encode_header ( writer, length ) ?;
17+ bitpacked_encode_u32 ( writer, iterator, length , num_bits as usize ) ?;
1718 Ok ( ( ) )
1819}
1920
20- fn encode_header < W : Write , T , I : Iterator < Item = T > > (
21+ fn encode_header < W : Write > (
2122 writer : & mut W ,
22- iterator : & I ,
23+ length : usize ,
2324) -> std:: io:: Result < ( ) > {
24- // the length of the iterator.
25- let length = iterator. size_hint ( ) . 1 . unwrap ( ) ;
26-
2725 // write the length + indicator
2826 let mut header = ceil8 ( length) as u64 ;
2927 header <<= 1 ;
@@ -39,11 +37,9 @@ const U32_BLOCK_LEN: usize = 32;
3937fn bitpacked_encode_u32 < W : Write , I : Iterator < Item = u32 > > (
4038 writer : & mut W ,
4139 mut iterator : I ,
40+ length : usize ,
4241 num_bits : usize ,
4342) -> std:: io:: Result < ( ) > {
44- // the length of the iterator.
45- let length = iterator. size_hint ( ) . 1 . unwrap ( ) ;
46-
4743 let chunks = length / U32_BLOCK_LEN ;
4844 let remainder = length - chunks * U32_BLOCK_LEN ;
4945 let mut buffer = [ 0u32 ; U32_BLOCK_LEN ] ;
@@ -81,11 +77,11 @@ fn bitpacked_encode_u32<W: Write, I: Iterator<Item = u32>>(
8177pub fn encode_bool < W : Write , I : Iterator < Item = bool > > (
8278 writer : & mut W ,
8379 iterator : I ,
80+ length : usize ,
8481) -> std:: io:: Result < ( ) > {
85- encode_header ( writer, & iterator) ?;
86-
82+ encode_header ( writer, length) ?;
8783 // encode the iterator
88- bitpacked_encode ( writer, iterator)
84+ bitpacked_encode ( writer, iterator, length )
8985}
9086
9187#[ cfg( test) ]
@@ -99,7 +95,8 @@ mod tests {
9995
10096 let mut vec = vec ! [ ] ;
10197
102- encode_bool ( & mut vec, iter) ?;
98+ let len = iter. size_hint ( ) . 1 . unwrap ( ) ;
99+ encode_bool ( & mut vec, iter, len) ?;
103100
104101 assert_eq ! ( vec, vec![ ( 2 << 1 | 1 ) , 0b10011101u8 , 0b00011101 ] ) ;
105102
@@ -110,9 +107,12 @@ mod tests {
110107 fn bool_from_iter ( ) -> std:: io:: Result < ( ) > {
111108 let mut vec = vec ! [ ] ;
112109
110+ let values = vec ! [ true , true , true , true , true , true , true , true ] ;
111+ let iter = values. into_iter ( ) ;
113112 encode_bool (
114113 & mut vec,
115- vec ! [ true , true , true , true , true , true , true , true ] . into_iter ( ) ,
114+ iter,
115+ values. len ( ) ,
116116 ) ?;
117117
118118 assert_eq ! ( vec, vec![ ( 1 << 1 | 1 ) , 0b11111111 ] ) ;
@@ -123,7 +123,8 @@ mod tests {
123123 fn test_encode_u32 ( ) -> std:: io:: Result < ( ) > {
124124 let mut vec = vec ! [ ] ;
125125
126- encode_u32 ( & mut vec, vec ! [ 0 , 1 , 2 , 1 , 2 , 1 , 1 , 0 , 3 ] . into_iter ( ) , 2 ) ?;
126+ let values = vec ! [ 0 , 1 , 2 , 1 , 2 , 1 , 1 , 0 , 3 ] ;
127+ encode_u32 ( & mut vec, values. into_iter ( ) , values. len ( ) , 2 ) ?;
127128
128129 assert_eq ! (
129130 vec,
@@ -136,9 +137,9 @@ mod tests {
136137 fn test_encode_u32_large ( ) -> std:: io:: Result < ( ) > {
137138 let mut vec = vec ! [ ] ;
138139
139- let values = ( 0 ..128 ) . map ( |x| x % 4 ) ;
140+ let values: Vec < _ > = ( 0 ..128 ) . map ( |x| x % 4 ) . collect ( ) ;
140141
141- encode_u32 ( & mut vec, values, 2 ) ?;
142+ encode_u32 ( & mut vec, values. into_iter ( ) , values . len ( ) , 2 ) ?;
142143
143144 let length = 128 ;
144145 let expected = 0b11_10_01_00u8 ;
@@ -152,10 +153,10 @@ mod tests {
152153
153154 #[ test]
154155 fn test_u32_other ( ) -> std:: io:: Result < ( ) > {
155- let values = vec ! [ 3 , 3 , 0 , 3 , 2 , 3 , 3 , 3 , 3 , 1 , 3 , 3 , 3 , 0 , 3 ] . into_iter ( ) ;
156+ let values = vec ! [ 3 , 3 , 0 , 3 , 2 , 3 , 3 , 3 , 3 , 1 , 3 , 3 , 3 , 0 , 3 ] ;
156157
157158 let mut vec = vec ! [ ] ;
158- encode_u32 ( & mut vec, values, 2 ) ?;
159+ encode_u32 ( & mut vec, values. into_iter ( ) , values . len ( ) , 2 ) ?;
159160
160161 let expected = vec ! [ 5 , 207 , 254 , 247 , 51 ] ;
161162 assert_eq ! ( expected, vec) ;
0 commit comments