cdcontainers  0.1.1
Library of data containers and collections for C programming language.
avl-tree.h
Go to the documentation of this file.
1 // The MIT License (MIT)
2 // Copyright (c) 2018 Maksim Andrianov
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
5 // of this software and associated documentation files (the "Software"), to
6 // deal in the Software without restriction, including without limitation the
7 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
8 // sell copies of the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20 // IN THE SOFTWARE.
26 #ifndef CDCONTAINERS_INCLUDE_CDCONTAINERS_avl_tree_H
27 #define CDCONTAINERS_INCLUDE_CDCONTAINERS_avl_tree_H
28 
29 #include <cdcontainers/common.h>
30 #include <cdcontainers/status.h>
31 
32 #include <assert.h>
33 #include <stdarg.h>
34 #include <stdbool.h>
35 
50  void *key;
51  void *value;
52  unsigned char height;
53 };
54 
60 struct cdc_avl_tree {
62  size_t size;
64 };
65 
75 };
76 
78  struct cdc_avl_tree_iter first;
79  struct cdc_avl_tree_iter second;
80 };
81 
83  struct cdc_avl_tree_iter first;
84  bool second;
85 };
86 
87 // Base
100  struct cdc_data_info *info);
101 
123  struct cdc_data_info *info, ...);
124 
134  struct cdc_data_info *info, va_list args);
135 
140 void cdc_avl_tree_dtor(struct cdc_avl_tree *t);
143 // Lookup
156 enum cdc_stat cdc_avl_tree_get(struct cdc_avl_tree *t, void *key, void **value);
157 
166 size_t cdc_avl_tree_count(struct cdc_avl_tree *t, void *key);
167 
176 void cdc_avl_tree_find(struct cdc_avl_tree *t, void *key,
177  struct cdc_avl_tree_iter *it);
180 // Capacity
190 static inline size_t cdc_avl_tree_size(struct cdc_avl_tree *t)
191 {
192  assert(t != NULL);
193 
194  return t->size;
195 }
196 
202 static inline bool cdc_avl_tree_empty(struct cdc_avl_tree *t)
203 {
204  assert(t != NULL);
205 
206  return t->size == 0;
207 }
210 // Modifiers
219 void cdc_avl_tree_clear(struct cdc_avl_tree *t);
220 
233 enum cdc_stat cdc_avl_tree_insert(struct cdc_avl_tree *t, void *key,
234  void *value,
235  struct cdc_pair_avl_tree_iter_bool *ret);
236 
250 enum cdc_stat cdc_avl_tree_insert1(struct cdc_avl_tree *t, void *key,
251  void *value, struct cdc_avl_tree_iter *it,
252  bool *inserted);
253 
267  struct cdc_avl_tree *t, void *key, void *value,
268  struct cdc_pair_avl_tree_iter_bool *ret);
269 
284  void *value,
285  struct cdc_avl_tree_iter *it,
286  bool *inserted);
287 
294 size_t cdc_avl_tree_erase(struct cdc_avl_tree *t, void *key);
295 
301 void cdc_avl_tree_swap(struct cdc_avl_tree *a, struct cdc_avl_tree *b);
304 // Iterators
314 void cdc_avl_tree_begin(struct cdc_avl_tree *t, struct cdc_avl_tree_iter *it);
315 
321 void cdc_avl_tree_end(struct cdc_avl_tree *t, struct cdc_avl_tree_iter *it);
324 // Iterators
335 
341 
349 static inline bool cdc_avl_tree_iter_has_next(struct cdc_avl_tree_iter *it)
350 {
351  assert(it != NULL);
352 
353  return it->current != NULL;
354 }
355 
363 static inline bool cdc_avl_tree_iter_has_prev(struct cdc_avl_tree_iter *it)
364 {
365  assert(it != NULL);
366 
367  return it->prev != NULL;
368 }
369 
375 static inline void *cdc_avl_tree_iter_key(struct cdc_avl_tree_iter *it)
376 {
377  assert(it != NULL);
378 
379  return it->current->key;
380 }
381 
387 static inline void *cdc_avl_tree_iter_value(struct cdc_avl_tree_iter *it)
388 {
389  assert(it != NULL);
390 
391  return it->current->value;
392 }
393 
400  struct cdc_avl_tree_iter *it)
401 {
402  assert(it != NULL);
403 
404  struct cdc_pair pair = {it->prev->key, it->prev->value};
405  return pair;
406 }
407 
416 static inline bool cdc_avl_tree_iter_is_eq(struct cdc_avl_tree_iter *it1,
417  struct cdc_avl_tree_iter *it2)
418 {
419  assert(it1 != NULL);
420  assert(it2 != NULL);
421 
422  return it1->container == it2->container && it1->prev == it2->prev &&
423  it1->current == it2->current;
424 }
427 // Short names
428 #ifdef CDC_USE_SHORT_NAMES
429 typedef struct cdc_avl_tree avl_tree_t;
430 typedef struct cdc_avl_tree_iter avl_tree_iter_t;
431 typedef struct cdc_pair_avl_tree_iter pair_avl_tree_iter_t;
432 typedef struct cdc_pair_avl_tree_iter_bool pair_avl_tree_iter_bool_t;
433 
434 // Base
435 #define avl_tree_ctor(...) cdc_avl_tree_ctor(__VA_ARGS__)
436 #define avl_tree_ctorv(...) cdc_avl_tree_ctorv(__VA_ARGS__)
437 #define avl_tree_ctorl(...) cdc_avl_tree_ctorl(__VA_ARGS__)
438 #define avl_tree_dtor(...) cdc_avl_tree_dtor(__VA_ARGS__)
439 
440 // Lookup
441 #define avl_tree_get(...) cdc_avl_tree_get(__VA_ARGS__)
442 #define avl_tree_count(...) cdc_avl_tree_count(__VA_ARGS__)
443 #define avl_tree_find(...) cdc_avl_tree_find(__VA_ARGS__)
444 
445 // Capacity
446 #define avl_tree_size(...) cdc_avl_tree_size(__VA_ARGS__)
447 #define avl_tree_empty(...) cdc_avl_tree_empty(__VA_ARGS__)
448 
449 // Modifiers
450 #define avl_tree_clear(...) cdc_avl_tree_clear(__VA_ARGS__)
451 #define avl_tree_insert(...) cdc_avl_tree_insert(__VA_ARGS__)
452 #define avl_tree_insert1(...) cdc_avl_tree_insert1(__VA_ARGS__)
453 #define avl_tree_insert_or_assign(...) \
454  cdc_avl_tree_insert_or_assign(__VA_ARGS__)
455 #define avl_tree_insert_or_assign1(...) \
456  cdc_avl_tree_insert_or_assign1(__VA_ARGS__)
457 #define avl_tree_erase(...) cdc_avl_tree_erase(__VA_ARGS__)
458 #define avl_tree_swap(...) cdc_avl_tree_swap(__VA_ARGS__)
459 
460 // Iterators
461 #define avl_tree_begin(...) cdc_avl_tree_begin(__VA_ARGS__)
462 #define avl_tree_end(...) cdc_avl_tree_end(__VA_ARGS__)
463 
464 // Iterators
465 #define avl_tree_iter_next(...) cdc_avl_tree_iter_next(__VA_ARGS__)
466 #define avl_tree_iter_has_next(...) cdc_avl_tree_iter_has_next(__VA_ARGS__)
467 #define avl_tree_iter_key(...) cdc_avl_tree_iter_key(__VA_ARGS__)
468 #define avl_tree_iter_value(...) cdc_avl_tree_iter_value(__VA_ARGS__)
469 #define avl_tree_iter_key_value(...) cdc_avl_tree_iter_key_value(__VA_ARGS__)
470 #define avl_tree_iter_is_eq(...) cdc_avl_tree_iter_is_eq(__VA_ARGS__)
471 #endif
472 
473 #endif // CDCONTAINERS_INCLUDE_CDCONTAINERS_avl_tree_H
static size_t cdc_avl_tree_size(struct cdc_avl_tree *t)
Returns the number of items in the avl_tree.
Definition: avl-tree.h:190
unsigned char height
Definition: avl-tree.h:52
bool second
Definition: avl-tree.h:84
static void * cdc_avl_tree_iter_key(struct cdc_avl_tree_iter *it)
Returns an item&#39;s key.
Definition: avl-tree.h:375
struct cdc_avl_tree_node * parent
Definition: avl-tree.h:47
enum cdc_stat cdc_avl_tree_insert(struct cdc_avl_tree *t, void *key, void *value, struct cdc_pair_avl_tree_iter_bool *ret)
Inserts an element into the container, if the container doesn&#39;t already contain an element with an eq...
Definition: avl-tree.h:77
void * value
Definition: avl-tree.h:51
enum cdc_stat cdc_avl_tree_insert1(struct cdc_avl_tree *t, void *key, void *value, struct cdc_avl_tree_iter *it, bool *inserted)
Inserts an element into the container, if the container doesn&#39;t already contain an element with an eq...
enum cdc_stat cdc_avl_tree_insert_or_assign(struct cdc_avl_tree *t, void *key, void *value, struct cdc_pair_avl_tree_iter_bool *ret)
Inserts an element or assigns to the current element if the key already exists.
struct cdc_data_info * dinfo
Definition: avl-tree.h:63
The cdc_avl_tree_node is service struct.
Definition: avl-tree.h:46
void cdc_avl_tree_dtor(struct cdc_avl_tree *t)
Destroys the avl tree.
void cdc_avl_tree_end(struct cdc_avl_tree *t, struct cdc_avl_tree_iter *it)
Initializes the iterator to the end.
void cdc_avl_tree_find(struct cdc_avl_tree *t, void *key, struct cdc_avl_tree_iter *it)
Finds an element with key equivalent to key.
void * key
Definition: avl-tree.h:50
static struct cdc_pair cdc_avl_tree_iter_key_value(struct cdc_avl_tree_iter *it)
Returns a pair, where first - key, second - value.
Definition: avl-tree.h:399
enum cdc_stat cdc_avl_tree_ctorl(struct cdc_avl_tree **t, struct cdc_data_info *info,...)
Constructs an avl tree, initialized by an variable number of pointers on cdc_pair&#39;s(first - key...
struct cdc_avl_tree_node * current
Definition: avl-tree.h:74
void cdc_avl_tree_iter_prev(struct cdc_avl_tree_iter *it)
Advances the iterator to the previous element in the avl tree.
enum cdc_stat cdc_avl_tree_ctor(struct cdc_avl_tree **t, struct cdc_data_info *info)
Constructs an empty avl tree.
Definition: common.h:60
void cdc_avl_tree_clear(struct cdc_avl_tree *t)
Removes all the elements from the avl_tree.
static bool cdc_avl_tree_iter_has_next(struct cdc_avl_tree_iter *it)
Returns true if there is at least one element ahead of the iterator, i.e. the iterator is not at the ...
Definition: avl-tree.h:349
The cdc_avl_tree_iter is service struct.
Definition: avl-tree.h:71
struct cdc_avl_tree_node * right
Definition: avl-tree.h:49
static bool cdc_avl_tree_iter_is_eq(struct cdc_avl_tree_iter *it1, struct cdc_avl_tree_iter *it2)
Returns false if the iterator |it1| equal to the iterator |it2|, otherwise returns false...
Definition: avl-tree.h:416
size_t size
Definition: avl-tree.h:62
cdc_stat
Definition: status.h:24
struct cdc_avl_tree_node * left
Definition: avl-tree.h:48
struct cdc_avl_tree_node * root
Definition: avl-tree.h:61
enum cdc_stat cdc_avl_tree_insert_or_assign1(struct cdc_avl_tree *t, void *key, void *value, struct cdc_avl_tree_iter *it, bool *inserted)
Inserts an element or assigns to the current element if the key already exists.
static bool cdc_avl_tree_iter_has_prev(struct cdc_avl_tree_iter *it)
Returns true if there is at least one element behind the iterator, i.e. the iterator is not at the fr...
Definition: avl-tree.h:363
void cdc_avl_tree_iter_next(struct cdc_avl_tree_iter *it)
Advances the iterator to the next element in the avl tree.
The cdc_avl_tree is service struct.
Definition: avl-tree.h:60
enum cdc_stat cdc_avl_tree_get(struct cdc_avl_tree *t, void *key, void **value)
Returns a value that is mapped to a key. If the key does not exist, then NULL will return...
size_t cdc_avl_tree_count(struct cdc_avl_tree *t, void *key)
Returns the number of elements with key that compares equal to the specified argument key...
static void * cdc_avl_tree_iter_value(struct cdc_avl_tree_iter *it)
Returns an item&#39;s value.
Definition: avl-tree.h:387
void cdc_avl_tree_begin(struct cdc_avl_tree *t, struct cdc_avl_tree_iter *it)
Initializes the iterator to the beginning.
struct cdc_avl_tree * container
Definition: avl-tree.h:72
static bool cdc_avl_tree_empty(struct cdc_avl_tree *t)
Checks if the avl tree has no elements.
Definition: avl-tree.h:202
Definition: avl-tree.h:82
struct cdc_avl_tree_node * prev
Definition: avl-tree.h:73
The cdc_data_info struct used to initialize contaners.
Definition: common.h:71
void cdc_avl_tree_swap(struct cdc_avl_tree *a, struct cdc_avl_tree *b)
Swaps avl_trees a and b. This operation is very fast and never fails.
size_t cdc_avl_tree_erase(struct cdc_avl_tree *t, void *key)
Removes the element (if one exists) with the key equivalent to key.
enum cdc_stat cdc_avl_tree_ctorv(struct cdc_avl_tree **t, struct cdc_data_info *info, va_list args)
Constructs an avl tree, initialized by args. The last item must be CDC_END.