* This file is part of the oGRAC project.
* Copyright (c) 2024 Huawei Technologies Co.,Ltd.
*
* oGRAC is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*
* ogsql_bitmap.h
*
*
* IDENTIFICATION
* src/ogsql/plan/ogsql_bitmap.h
*
* -------------------------------------------------------------------------
*/
#ifndef __OGSQL_BITMAP_H__
#define __OGSQL_BITMAP_H__
#include "cm_defs.h"
#include "cm_hash.h"
#ifdef __cplusplus
extern "C" {
#endif
#define BITMAP_WORD_SIZE (sizeof(uint32) * 8)
#define BITMAP_WORD_COUNT (OG_MAX_JOIN_JTABLES / BITMAP_WORD_SIZE)
#define BITMAP_RIGHTMOST_ONE(w) ((int32)(w) & -((int32)(w)))
#define BITMAP_HAS_MULTI(w) ((uint32)BITMAP_RIGHTMOST_ONE(w)!= (w))
typedef struct st_join_tbl_bitmap {
uint32 words[BITMAP_WORD_COUNT];
} join_tbl_bitmap_t;
void sql_bitmap_init(join_tbl_bitmap_t *result);
void sql_bitmap_setbit(uint32 id, join_tbl_bitmap_t* bms);
void sql_bitmap_make_singleton(uint32 table_id, join_tbl_bitmap_t* tables_bms);
void sql_bitmap_copy(join_tbl_bitmap_t *a, join_tbl_bitmap_t *result);
void sql_bitmap_union_singleton(uint32 a, uint32 b, join_tbl_bitmap_t* result);
void sql_bitmap_union(join_tbl_bitmap_t *a, join_tbl_bitmap_t *b, join_tbl_bitmap_t* result);
bool8 sql_bitmap_overlap(join_tbl_bitmap_t* a, join_tbl_bitmap_t* b);
bool8 sql_bitmap_empty(const join_tbl_bitmap_t* a);
bool8 sql_bitmap_subset(const join_tbl_bitmap_t* a, const join_tbl_bitmap_t* b);
bool8 sql_bitmap_same(const join_tbl_bitmap_t* a, const join_tbl_bitmap_t* b);
uint32 sql_hash_bitmap(join_tbl_bitmap_t* bms);
bool32 sql_oamap_bitmap_compare(void *key1, void *key2);
void sql_bitmap_add_member(uint32 id, join_tbl_bitmap_t* bms);
void sql_bitmap_delete_member(uint32 id, join_tbl_bitmap_t* bms);
void sql_bitmap_delete_members(join_tbl_bitmap_t* a, join_tbl_bitmap_t* b);
void sql_bitmap_intersect(join_tbl_bitmap_t *a, join_tbl_bitmap_t *b, join_tbl_bitmap_t* result);
bool32 sql_bitmap_exist_member(uint32 id, join_tbl_bitmap_t* bms);
int sql_bitmap_next_member(join_tbl_bitmap_t* bms, uint32 id_from_and_include);
bool8 sql_bitmap_is_multi(const join_tbl_bitmap_t* a);
uint32 sql_bitmap_number_count(join_tbl_bitmap_t *bms);
bool32 sql_bitmap_same_as_any(join_tbl_bitmap_t *table_ids, galist_t *table_ids_list);
#define BITMAP_FOREACH(i, bms_ptr) \
for ((i) = sql_bitmap_next_member((bms_ptr), 0); \
(i) < OG_MAX_JOIN_TABLES; \
(i) = sql_bitmap_next_member((bms_ptr), (i) + 1))
#ifdef __cplusplus
}
#endif
#endif