@@ -232,7 +232,7 @@ impl Decoder {
232232}
233233
234234pub trait HuffmanCodec {
235- fn build ( & self , symbols : & [ Symbol ] ) -> Encoder ;
235+ fn build ( & self , symbols : & [ Symbol ] ) -> io :: Result < Encoder > ;
236236 fn save < W > ( & self , writer : & mut bit:: BitWriter < W > , codec : & Encoder ) -> io:: Result < ( ) >
237237 where
238238 W : io:: Write ;
@@ -245,27 +245,27 @@ pub trait HuffmanCodec {
245245pub struct FixedHuffmanCodec ;
246246impl HuffmanCodec for FixedHuffmanCodec {
247247 #[ allow( unused_variables) ]
248- fn build ( & self , symbols : & [ Symbol ] ) -> Encoder {
248+ fn build ( & self , symbols : & [ Symbol ] ) -> io :: Result < Encoder > {
249249 let mut literal_builder = huffman:: EncoderBuilder :: new ( 288 ) ;
250250 for & ( bitwidth, ref symbols, code_base) in & FIXED_LITERAL_OR_LENGTH_CODE_TABLE {
251251 for ( code, symbol) in symbols
252252 . clone ( )
253253 . enumerate ( )
254254 . map ( |( i, s) | ( code_base + i as u16 , s) )
255255 {
256- literal_builder. set_mapping ( symbol, huffman:: Code :: new ( bitwidth, code) ) ;
256+ literal_builder. set_mapping ( symbol, huffman:: Code :: new ( bitwidth, code) ) ? ;
257257 }
258258 }
259259
260260 let mut distance_builder = huffman:: EncoderBuilder :: new ( 30 ) ;
261261 for i in 0 ..30 {
262- distance_builder. set_mapping ( i, huffman:: Code :: new ( 5 , i) ) ;
262+ distance_builder. set_mapping ( i, huffman:: Code :: new ( 5 , i) ) ? ;
263263 }
264264
265- Encoder {
265+ Ok ( Encoder {
266266 literal : literal_builder. finish ( ) ,
267267 distance : distance_builder. finish ( ) ,
268- }
268+ } )
269269 }
270270 #[ allow( unused_variables) ]
271271 fn save < W > ( & self , writer : & mut bit:: BitWriter < W > , codec : & Encoder ) -> io:: Result < ( ) >
@@ -286,13 +286,13 @@ impl HuffmanCodec for FixedHuffmanCodec {
286286 . enumerate ( )
287287 . map ( |( i, s) | ( code_base + i as u16 , s) )
288288 {
289- literal_builder. set_mapping ( symbol, huffman:: Code :: new ( bitwidth, code) ) ;
289+ literal_builder. set_mapping ( symbol, huffman:: Code :: new ( bitwidth, code) ) ? ;
290290 }
291291 }
292292
293293 let mut distance_builder = huffman:: DecoderBuilder :: new ( 5 , None ) ;
294294 for i in 0 ..30 {
295- distance_builder. set_mapping ( i, huffman:: Code :: new ( 5 , i) ) ;
295+ distance_builder. set_mapping ( i, huffman:: Code :: new ( 5 , i) ) ? ;
296296 }
297297
298298 Ok ( Decoder {
@@ -305,7 +305,7 @@ impl HuffmanCodec for FixedHuffmanCodec {
305305#[ derive( Debug ) ]
306306pub struct DynamicHuffmanCodec ;
307307impl HuffmanCodec for DynamicHuffmanCodec {
308- fn build ( & self , symbols : & [ Symbol ] ) -> Encoder {
308+ fn build ( & self , symbols : & [ Symbol ] ) -> io :: Result < Encoder > {
309309 let mut literal_counts = [ 0 ; 286 ] ;
310310 let mut distance_counts = [ 0 ; 30 ] ;
311311 for s in symbols {
@@ -314,10 +314,10 @@ impl HuffmanCodec for DynamicHuffmanCodec {
314314 distance_counts[ d as usize ] += 1 ;
315315 }
316316 }
317- Encoder {
318- literal : huffman:: EncoderBuilder :: from_frequencies ( & literal_counts, 15 ) ,
319- distance : huffman:: EncoderBuilder :: from_frequencies ( & distance_counts, 15 ) ,
320- }
317+ Ok ( Encoder {
318+ literal : huffman:: EncoderBuilder :: from_frequencies ( & literal_counts, 15 ) ? ,
319+ distance : huffman:: EncoderBuilder :: from_frequencies ( & distance_counts, 15 ) ? ,
320+ } )
321321 }
322322 fn save < W > ( & self , writer : & mut bit:: BitWriter < W > , codec : & Encoder ) -> io:: Result < ( ) >
323323 where
@@ -331,7 +331,7 @@ impl HuffmanCodec for DynamicHuffmanCodec {
331331 for x in & codes {
332332 code_counts[ x. 0 as usize ] += 1 ;
333333 }
334- let bitwidth_encoder = huffman:: EncoderBuilder :: from_frequencies ( & code_counts, 7 ) ;
334+ let bitwidth_encoder = huffman:: EncoderBuilder :: from_frequencies ( & code_counts, 7 ) ? ;
335335
336336 let bitwidth_code_count = cmp:: max (
337337 4 ,
@@ -379,7 +379,7 @@ impl HuffmanCodec for DynamicHuffmanCodec {
379379 bitwidth_code_bitwidthes[ i] = reader. read_bits ( 3 ) ? as u8 ;
380380 }
381381 let bitwidth_decoder =
382- huffman:: DecoderBuilder :: from_bitwidthes ( & bitwidth_code_bitwidthes, None ) ;
382+ huffman:: DecoderBuilder :: from_bitwidthes ( & bitwidth_code_bitwidthes, None ) ? ;
383383
384384 let mut literal_code_bitwidthes = Vec :: with_capacity ( literal_code_count as usize ) ;
385385 while literal_code_bitwidthes. len ( ) < literal_code_count as usize {
@@ -412,8 +412,8 @@ impl HuffmanCodec for DynamicHuffmanCodec {
412412 literal : huffman:: DecoderBuilder :: from_bitwidthes (
413413 & literal_code_bitwidthes,
414414 Some ( END_OF_BLOCK ) ,
415- ) ,
416- distance : huffman:: DecoderBuilder :: from_bitwidthes ( & distance_code_bitwidthes, None ) ,
415+ ) ? ,
416+ distance : huffman:: DecoderBuilder :: from_bitwidthes ( & distance_code_bitwidthes, None ) ? ,
417417 } )
418418 }
419419}
0 commit comments