Files
cKit/Search/c_TreeSet.h
T

81 lines
2.6 KiB
C
Raw Normal View History

2026-08-29 01:58:00 +08:00
#ifndef INCLUDED_C_TREESET_H
#define INCLUDED_C_TREESET_H
#ifndef INCLUDED_C_TYPES_H
#include <c_Types.h>
#endif /*INCLUDED_C_TYPES_H*/
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
// Link Color Definitions
typedef enum {
C_TS_BLACK = 0,
C_TS_RED = 1
} c_TSColor_t;
// TreeSet Inlined Node Layout Configuration
typedef struct c_TSNode {
struct c_TSNode* left;
struct c_TSNode* right;
c_TSColor_t color;
// Payload layout: element block resides immediately after this structure in memory
} c_TSNode_t;
// TreeSet Context Structure
typedef struct {
c_TSNode_t* root;
c_size_t element_size; // Size of each unified unique element in bytes
c_size_t size; // Total number of unique nodes inside the set
int (*compar)(const void*, const void*); // Key comparison rule pointer
} c_TreeSet_t;
typedef struct {
c_TreeSet_t* set; // Modified to non-const to allow operations on the set
c_TSNode_t** stack;
long long stack_top;
c_size_t max_depth;
void* last_returned; // Pointer tracking the key returned by the most recent Next() call
} c_TreeSetIter_t;
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
// --- Internal Helper Accessors ---
C_STATIC_FORCE_INLINE
void* c_TreeSet_NodeKey(c_TSNode_t* node) {
if (node == NULL) return NULL;
return (void*)((char*)node + sizeof(c_TSNode_t));
}
C_STATIC_FORCE_INLINE
c_bool_t c_TreeSet_IsRed(c_TSNode_t* node) {
if (node == NULL) return C_FALSE;
return node->color == C_TS_RED;
}
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
c_err_t c_TreeSet_Init(c_TreeSet_t* set, c_size_t element_size, int (*compar)(const void*, const void*));
void c_TreeSet_Destroy(c_TreeSet_t* set);
c_bool_t c_TreeSet_Contains(const c_TreeSet_t* set, const void* element);
c_err_t c_TreeSet_Add(c_TreeSet_t* set, const void* element);
c_err_t c_TreeSet_Remove(c_TreeSet_t* set, const void* element);
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
c_err_t c_TreeSetIter_Init(c_TreeSetIter_t* iter, const c_TreeSet_t* set);
void c_TreeSetIter_Destroy(c_TreeSetIter_t* iter);
c_bool_t c_TreeSetIter_HasNext(const c_TreeSetIter_t* iter);
void* c_TreeSetIter_Next(c_TreeSetIter_t* iter);
void* c_TreeSetIter_Get(c_TreeSetIter_t* iter);
c_err_t c_TreeSetIter_Remove(c_TreeSetIter_t* iter);
#endif /*INCLUDED_C_TREESET_H*/