#ifndef IGZIP_LEVEL_BUF_STRUCTS_H
#define IGZIP_LEVEL_BUF_STRUCTS_H

#include "igzip_lib.h"
#include "huff_codes.h"
#include "encode_df.h"

#define MATCH_BUF_SIZE (4 * 1024)

struct hash8k_buf {
	uint16_t hash_table[IGZIP_HASH8K_HASH_SIZE];
};

struct hash_hist_buf {
	uint16_t hash_table[IGZIP_HASH_HIST_SIZE];
};

struct hash_map_buf {
	uint16_t hash_table[IGZIP_HASH_MAP_HASH_SIZE];
	struct deflate_icf *matches_next;
	struct deflate_icf *matches_end;
	struct deflate_icf matches[MATCH_BUF_SIZE];
	struct deflate_icf overflow[ISAL_LOOK_AHEAD];
};

#define MAX_LVL_BUF_SIZE sizeof(struct hash_map_buf)

struct level_buf {
	struct hufftables_icf encode_tables;
	struct isal_mod_hist hist;
	uint32_t deflate_hdr_count;
	uint32_t deflate_hdr_extra_bits;
	uint8_t deflate_hdr[ISAL_DEF_MAX_HDR_SIZE];
	struct deflate_icf *icf_buf_next;
	uint64_t icf_buf_avail_out;
	struct deflate_icf *icf_buf_start;
	union {
		struct hash8k_buf hash8k;
		struct hash_hist_buf hash_hist;
		struct hash_map_buf hash_map;

		struct hash8k_buf lvl1;
		struct hash_hist_buf lvl2;
		struct hash_map_buf lvl3;
	};
};

#endif