squat-uidlist.h revision 1caf757864e7734345660e7d190f84e42668a6f8
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen#ifndef SQUAT_UIDLIST_H
1d4f710106fb498750456724628da6063e012e6dTimo Sirainen#define SQUAT_UIDLIST_H
46552a931924c2d743f045e95b08c3ce6beda91aTimo Sirainen
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainenstruct squat_trie;
d3d769026fae5d21c2d29614d3bc4579e8d79e81Timo Sirainenstruct squat_uidlist_build_context;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstruct squat_uidlist_rebuild_context;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstruct squat_uidlist_file_header {
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen uint32_t indexid;
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen uint32_t used_file_size;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen uint32_t block_list_offset;
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen uint32_t count, link_count;
92c49f3005f4dff1a6f576fffa8112ef6d1cae7fTimo Sirainen};
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen/*
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen uidlist file:
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
4ead43ecc06d10047998966c4dc0b142ecce4b66Timo Sirainen struct uidlist_header;
1d4f710106fb498750456724628da6063e012e6dTimo Sirainen
1d4f710106fb498750456724628da6063e012e6dTimo Sirainen // size includes both prev_offset and uidlist
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen packed (size << 2) | packed_flags; // UIDLIST_PACKED_FLAG_*
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen [packed prev_offset;] // If UIDLIST_PACKED_FLAG_BEGINS_WITH_OFFSET is set
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainen if (UIDLIST_PACKED_FLAG_BITMASK) {
ab0d9eecd85f74acae18fe88529302e0776cc500Timo Sirainen packed base_uid; // first UID in uidlist
ad004e44be109684521494b5af2ad1da39b8bb27Timo Sirainen uint8_t bitmask[]; // first bit is base_uid+1
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen } else {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen // FIXME: packed range
336b825e0321b798690351d9899b1b0cb99ec462Timo Sirainen }
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen*/
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#define UIDLIST_IS_SINGLETON(idx) \
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen (((idx) & 1) != 0 || (idx) < (0x100 << 1))
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
ad004e44be109684521494b5af2ad1da39b8bb27Timo Sirainenstruct squat_uidlist *squat_uidlist_init(struct squat_trie *trie);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenvoid squat_uidlist_deinit(struct squat_uidlist *uidlist);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenint squat_uidlist_refresh(struct squat_uidlist *uidlist);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenint squat_uidlist_build_init(struct squat_uidlist *uidlist,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct squat_uidlist_build_context **ctx_r);
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainenuint32_t squat_uidlist_build_add_uid(struct squat_uidlist_build_context *ctx,
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen uint32_t uid_list_idx, uint32_t uid);
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainenvoid squat_uidlist_build_flush(struct squat_uidlist_build_context *ctx);
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainenint squat_uidlist_build_finish(struct squat_uidlist_build_context *ctx);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenvoid squat_uidlist_build_deinit(struct squat_uidlist_build_context **ctx);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenint squat_uidlist_rebuild_init(struct squat_uidlist_build_context *build_ctx,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen bool compress,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct squat_uidlist_rebuild_context **ctx_r);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenuint32_t squat_uidlist_rebuild_next(struct squat_uidlist_rebuild_context *ctx,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen const ARRAY_TYPE(uint32_t) *uids);
46ec792dd4ccf6c34706c4774228301fafde6aa9Timo Sirainenuint32_t squat_uidlist_rebuild_nextu(struct squat_uidlist_rebuild_context *ctx,
46ec792dd4ccf6c34706c4774228301fafde6aa9Timo Sirainen const ARRAY_TYPE(seq_range) *uids);
46ec792dd4ccf6c34706c4774228301fafde6aa9Timo Sirainenint squat_uidlist_rebuild_finish(struct squat_uidlist_rebuild_context *ctx,
46ec792dd4ccf6c34706c4774228301fafde6aa9Timo Sirainen bool cancel);
4c6ddf2491104f917d00e6900e833e80ea02c7b6Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenint squat_uidlist_get(struct squat_uidlist *uidlist, uint32_t uid_list_idx,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen ARRAY_TYPE(uint32_t) *uids);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenuint32_t squat_uidlist_singleton_last_uid(uint32_t uid_list_idx);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenint squat_uidlist_get_seqrange(struct squat_uidlist *uidlist,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen uint32_t uid_list_idx,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen ARRAY_TYPE(seq_range) *seq_range_arr);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenint squat_uidlist_filter(struct squat_uidlist *uidlist, uint32_t uid_list_idx,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen ARRAY_TYPE(seq_range) *uids);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenvoid squat_uidlist_delete(struct squat_uidlist *uidlist);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainensize_t squat_uidlist_mem_used(struct squat_uidlist *uidlist,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen unsigned int *count_r);
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainen
6fdfa4d4cf14d1d7764d7faa8258f112e39c8dbeTimo Sirainen#endif
d3d769026fae5d21c2d29614d3bc4579e8d79e81Timo Sirainen