81 lines
2.6 KiB
C
81 lines
2.6 KiB
C
#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*/
|