|
|
- #ifndef __LIBS_SKEW_HEAP_H__
- #define __LIBS_SKEW_HEAP_H__
-
- struct skew_heap_entry {
- struct skew_heap_entry *parent, *left, *right;
- };
-
- typedef struct skew_heap_entry skew_heap_entry_t;
-
- typedef int(*compare_f)(void *a, void *b);
-
- static inline void skew_heap_init(skew_heap_entry_t *a) __attribute__((always_inline));
- static inline skew_heap_entry_t *skew_heap_merge(
- skew_heap_entry_t *a, skew_heap_entry_t *b,
- compare_f comp);
- static inline skew_heap_entry_t *skew_heap_insert(
- skew_heap_entry_t *a, skew_heap_entry_t *b,
- compare_f comp) __attribute__((always_inline));
- static inline skew_heap_entry_t *skew_heap_remove(
- skew_heap_entry_t *a, skew_heap_entry_t *b,
- compare_f comp) __attribute__((always_inline));
-
- static inline void
- skew_heap_init(skew_heap_entry_t *a)
- {
- a->left = a->right = a->parent = NULL;
- }
-
- static inline skew_heap_entry_t *
- skew_heap_merge(skew_heap_entry_t *a, skew_heap_entry_t *b,
- compare_f comp)
- {
- if (a == NULL) return b;
- else if (b == NULL) return a;
-
- skew_heap_entry_t *l, *r;
- if (comp(a, b) == -1)
- {
- r = a->left;
- l = skew_heap_merge(a->right, b, comp);
-
- a->left = l;
- a->right = r;
- if (l) l->parent = a;
-
- return a;
- }
- else
- {
- r = b->left;
- l = skew_heap_merge(a, b->right, comp);
-
- b->left = l;
- b->right = r;
- if (l) l->parent = b;
-
- return b;
- }
- }
-
- static inline skew_heap_entry_t *
- skew_heap_insert(skew_heap_entry_t *a, skew_heap_entry_t *b,
- compare_f comp)
- {
- skew_heap_init(b);
- return skew_heap_merge(a, b, comp);
- }
-
- static inline skew_heap_entry_t *
- skew_heap_remove(skew_heap_entry_t *a, skew_heap_entry_t *b,
- compare_f comp)
- {
- skew_heap_entry_t *p = b->parent;
- skew_heap_entry_t *rep = skew_heap_merge(b->left, b->right, comp);
- if (rep) rep->parent = p;
-
- if (p)
- {
- if (p->left == b)
- p->left = rep;
- else p->right = rep;
- return a;
- }
- else return rep;
- }
-
- #endif /* !__LIBS_SKEW_HEAP_H__ */
|