1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//! This crate implements [canonical Huffman] functionality for handling [HPACK]
//! format in [HTTP/2]. It exposes a simple API for performing the encoding and
//! decoding of [HTTP/2] header string literals according to the [HPACK] spec.
//! 
//! Header Compression format for [HTTP/2], known as [HPACK], foresees the use
//! of the Huffman algorithm for encoding header literal values. This
//! contributes to the additional decrease in the quantity of data, transferred
//! with each web request and response.
//! 
//! A [Huffman code] is a particular type of optimal prefix code that is
//! commonly used for lossless data compression. The process of finding or using
//! such a code proceeds by means of Huffman coding, an algorithm developed by
//! David A. Huffman. The output from Huffman's algorithm can be viewed as a
//! variable-length code table for encoding a source symbol (such as a character
//! in a file). The algorithm derives this table from the estimated probability
//! or frequency of occurrence (weight) for each possible value of the source
//! symbol. As in other entropy encoding methods, more common symbols are
//! generally represented using fewer bits than less common symbols. Huffman's
//! method can be efficiently implemented, finding a code in time linear to the
//! number of input weights if these weights are sorted.
//! 
//! [HPACK] compression entails a pre-created [canonical Huffman] code table
//! for encoding [ASCII] characters to the Huffman sequence. A
//! [canonical Huffman] code is a particular type of [Huffman code] with unique
//! properties that allow it to be described in a very compact manner. The
//! advantage of a [canonical Huffman] tree is that one can encode data in fewer
//! bits than with a fully described tree. In the aforementioned table are the
//! Huffman codes for each [ASCII] character with a length up to 32 bits (4x by
//! 8 fields with value 0 or 1), in the form of base-2 integer, aligned on the
//! most significant bit (MSB is the bit farthest to the left).
//! 
//! Each module covers this topic in more details so check the rest of the code
//! to learn more.
//! 
//! ## Usage
//!
//! Encoding:
//! 
//! ```rs
//! use httlib_huffman::encode;
//! 
//! let mut sequence = Vec::new();
//! let text = "Hello world!".as_bytes();
//! match encode(&text, &mut sequence)?;
//! ```
//! 
//! Decoding:
//! 
//! ```rs
//! use httlib_huffman::decode;
//!
//! let mut text = Vec::new();
//! let speed = 3;
//! let sequence = vec![168, 209, ...];
//! decode(&sequence, &mut text, speed).unwrap();
//! ```
//! 
//! ## Features
//! 
//! This crate splits functionalities into features so you can manually enable
//! or disable them as needed.
//! 
//! * `encode`: Enables encoding features (default).
//! * `decode1`: Enables decoding features for reading 1 bit at a time.
//! * `decode2`: Enables decoding features for reading 2 bits at a time.
//! * `decode3`: Enables decoding features for reading 3 bits at a time.
//! * `decode4`: Enables decoding features for reading 4 bits at a time (default).
//! * `decode5`: Enables decoding features for reading 5 bits at a time.
//! * `flatten`: Enables features for flattening Huffman table (default).
//! * `parse`: Enables features for parsing Huffman table (default).
//! 
//! ```toml
//! [dependencies.httlib-huffman]
//! default-features = false
//! features = ["encode", "decode4"]
//! ```
//! 
//! [ASCII]: https://en.wikipedia.org/wiki/ASCII
//! [HPACK]: https://tools.ietf.org/html/rfc7541
//! [HTTP/2]: https://tools.ietf.org/html/rfc7540
//! [Huffman code]: https://en.wikipedia.org/wiki/Huffman_coding
//! [canonical Huffman]: https://en.wikipedia.org/wiki/Canonical_Huffman_code

pub mod decode;
#[cfg(feature = "encode")]
pub mod encode;
#[cfg(feature = "flatten")]
pub mod flatten;
#[cfg(feature = "parse")]
pub mod parse;

pub use decode::*;
#[cfg(feature = "encode")]
pub use encode::*;
#[cfg(feature = "flatten")]
pub use flatten::*;
#[cfg(feature = "parse")]
pub use parse::*;