#ifndef TIDBITMAP_H
#define TIDBITMAP_H
#include "access/htup_details.h"
#include "storage/itemptr.h"
#include "utils/dsa.h"
#define TBM_MAX_TUPLES_PER_PAGE MaxHeapTuplesPerPage
typedef struct TIDBitmap TIDBitmap;
typedef struct TBMPrivateIterator TBMPrivateIterator;
typedef struct TBMSharedIterator TBMSharedIterator;
typedef struct TBMIterator
{
bool shared;
union
{
TBMPrivateIterator *private_iterator;
TBMSharedIterator *shared_iterator;
} i;
} TBMIterator;
typedef struct TBMIterateResult
{
BlockNumber blockno;
bool lossy;
bool recheck;
void *internal_page;
} TBMIterateResult;
extern TIDBitmap *tbm_create(Size maxbytes, dsa_area *dsa);
extern void tbm_free(TIDBitmap *tbm);
extern void tbm_free_shared_area(dsa_area *dsa, dsa_pointer dp);
extern void tbm_add_tuples(TIDBitmap *tbm,
const ItemPointer tids, int ntids,
bool recheck);
extern void tbm_add_page(TIDBitmap *tbm, BlockNumber pageno);
extern void tbm_union(TIDBitmap *a, const TIDBitmap *b);
extern void tbm_intersect(TIDBitmap *a, const TIDBitmap *b);
extern int tbm_extract_page_tuple(TBMIterateResult *iteritem,
OffsetNumber *offsets,
uint32 max_offsets);
extern bool tbm_is_empty(const TIDBitmap *tbm);
extern TBMPrivateIterator *tbm_begin_private_iterate(TIDBitmap *tbm);
extern dsa_pointer tbm_prepare_shared_iterate(TIDBitmap *tbm);
extern bool tbm_private_iterate(TBMPrivateIterator *iterator, TBMIterateResult *tbmres);
extern bool tbm_shared_iterate(TBMSharedIterator *iterator, TBMIterateResult *tbmres);
extern void tbm_end_private_iterate(TBMPrivateIterator *iterator);
extern void tbm_end_shared_iterate(TBMSharedIterator *iterator);
extern TBMSharedIterator *tbm_attach_shared_iterate(dsa_area *dsa,
dsa_pointer dp);
extern int tbm_calculate_entries(Size maxbytes);
extern TBMIterator tbm_begin_iterate(TIDBitmap *tbm,
dsa_area *dsa, dsa_pointer dsp);
extern void tbm_end_iterate(TBMIterator *iterator);
extern bool tbm_iterate(TBMIterator *iterator, TBMIterateResult *tbmres);
static inline bool
tbm_exhausted(TBMIterator *iterator)
{
return !iterator->i.private_iterator;
}
#endif