#ifndef RAY_ENCW_H
#define RAY_ENCW_H
#include <rayforce.h>
#include <stdio.h>
#include "store/enc.h"
#include "store/encfmt.h"
#include "store/encidx.h"
#include "store/fsst.h"
typedef struct {
ray_enc_desc_t desc;
ray_enc_buf_t payload;
int n_nulls;
bool has_stats;
int64_t sum_hi;
uint64_t sum_lo;
uint64_t str_pooled;
uint64_t str_occ;
bool fsst_used;
} ray_encw_vec_t;
#define RAY_ENCW_SDICT_CAP (1u << 20)
typedef struct ray_encw_sdict_s {
uint32_t* slot; uint64_t mask;
uint64_t* at;
uint64_t* offs; uint32_t* lens; uint32_t n, cap;
char* bytes; uint64_t blen, bcap;
uint64_t pooled;
bool abandoned, used;
} ray_encw_sdict_t;
typedef struct {
const ray_enc_dict_t* dict;
const ray_enc_alp_cands_t* alp;
const ray_fsst_table_t* fsst;
const ray_fsst_index_t* fsst_ix;
ray_encw_sdict_t* sdict;
} ray_encw_side_t;
void ray_encw_vec_init(ray_encw_vec_t* v);
void ray_encw_vec_free(ray_encw_vec_t* v);
ray_err_t ray_encw_vec_side(int8_t type, uint8_t attrs, const void* data, const char* str_pool,
int64_t start, int n, const ray_encw_side_t* side, ray_encw_vec_t* out);
ray_err_t ray_encw_vec(int8_t type, uint8_t attrs, const void* data, const char* str_pool,
int64_t start, int n, const ray_enc_dict_t* dict, ray_encw_vec_t* out);
bool ray_encw_type_has_dict(int8_t type);
bool ray_encw_type_summable(int8_t type);
bool ray_encw_type_supported(int8_t type);
void ray_encw_test_force(int enc);
void ray_encw_test_force_float(int enc);
void ray_encw_test_force_str(int enc);
typedef struct {
FILE* f;
int8_t type;
uint8_t attrs;
int64_t len;
uint32_t sym_count;
uint8_t index_kind;
uint8_t col_flags;
int64_t n_chunks, chunk_i;
ray_enc_dirent_t* dir;
uint64_t pos;
uint64_t str_pool_bytes;
bool any_bitmap_null;
uint64_t* dict_v; uint32_t dict_n; bool dict_used;
ray_enc_buf_t chunk;
ray_encw_vec_t vec;
ray_enc_idx_src_t idx; bool has_idx;
const uint8_t* idx_copy; uint64_t idx_copy_len;
ray_enc_alp_cands_t alp;
ray_encw_sdict_t sdict;
ray_fsst_table_t* fsst;
ray_fsst_index_t* fsst_ix;
bool fsst_used;
uint64_t str_occ_bytes;
struct ray_dict_acc_s* idict;
} ray_encw_t;
ray_err_t ray_encw_begin(ray_encw_t* w, FILE* f, int8_t type, uint8_t attrs, int64_t len,
uint32_t sym_count, uint8_t index_kind, uint8_t col_flags);
ray_err_t ray_encw_chunk(ray_encw_t* w, const void* data, const char* str_pool, int64_t n);
ray_err_t ray_encw_finish(ray_encw_t* w);
void ray_encw_free(ray_encw_t* w);
void ray_encw_set_index(ray_encw_t* w, const ray_enc_idx_src_t* s);
void ray_encw_set_index_copy(ray_encw_t* w, uint8_t kind, const uint8_t* region, uint64_t len);
ray_err_t ray_encw_null_image(int8_t type, uint8_t attrs, int64_t len, uint32_t sym_count,
const void* fill, void** out, size_t* out_size);
#endif