Search/Sort
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
#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*/
|
||||
Reference in New Issue
Block a user