#ifndef INCLUDED_C_TREESET_H #define INCLUDED_C_TREESET_H #ifndef INCLUDED_C_BASE_H #include #endif /*INCLUDED_C_BASE_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*/