#ifndef AWS_COMPRESSION_HUFFMAN_H
#define AWS_COMPRESSION_HUFFMAN_H
#include <aws/compression/compression.h>
#include <aws/common/byte_buf.h>
struct aws_huffman_code {
uint32_t pattern;
uint8_t num_bits;
};
typedef struct aws_huffman_code(aws_huffman_symbol_encoder_fn)(uint8_t symbol, void *userdata);
typedef uint8_t(aws_huffman_symbol_decoder_fn)(uint32_t bits, uint8_t *symbol, void *userdata);
struct aws_huffman_symbol_coder {
aws_huffman_symbol_encoder_fn *encode;
aws_huffman_symbol_decoder_fn *decode;
void *userdata;
};
struct aws_huffman_encoder {
struct aws_huffman_symbol_coder *coder;
uint8_t eos_padding;
struct aws_huffman_code overflow_bits;
};
struct aws_huffman_decoder {
struct aws_huffman_symbol_coder *coder;
bool allow_growth;
uint64_t working_bits;
uint8_t num_bits;
};
AWS_EXTERN_C_BEGIN
AWS_COMPRESSION_API
void aws_huffman_encoder_init(struct aws_huffman_encoder *encoder, struct aws_huffman_symbol_coder *coder);
AWS_COMPRESSION_API
void aws_huffman_encoder_reset(struct aws_huffman_encoder *encoder);
AWS_COMPRESSION_API
void aws_huffman_decoder_init(struct aws_huffman_decoder *decoder, struct aws_huffman_symbol_coder *coder);
AWS_COMPRESSION_API
void aws_huffman_decoder_reset(struct aws_huffman_decoder *decoder);
AWS_COMPRESSION_API
size_t aws_huffman_get_encoded_length(struct aws_huffman_encoder *encoder, struct aws_byte_cursor to_encode);
AWS_COMPRESSION_API
int aws_huffman_encode(
struct aws_huffman_encoder *encoder,
struct aws_byte_cursor *to_encode,
struct aws_byte_buf *output);
AWS_COMPRESSION_API
int aws_huffman_decode(
struct aws_huffman_decoder *decoder,
struct aws_byte_cursor *to_decode,
struct aws_byte_buf *output);
AWS_COMPRESSION_API
void aws_huffman_decoder_allow_growth(struct aws_huffman_decoder *decoder, bool allow_growth);
AWS_EXTERN_C_END
#endif