cdcontainers  0.1.1
Library of data containers and collections for C programming language.
splay-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_SPLAY_TREE_H
27 #define CDCONTAINERS_INCLUDE_CDCONTAINERS_SPLAY_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 };
53 
61  size_t size;
63 };
64 
74 };
75 
77  struct cdc_splay_tree_iter first;
78  bool second;
79 };
80 
81 // Base
94  struct cdc_data_info *info);
95 
117  struct cdc_data_info *info, ...);
118 
128  struct cdc_data_info *info, va_list args);
129 
134 void cdc_splay_tree_dtor(struct cdc_splay_tree *t);
137 // Lookup
150 enum cdc_stat cdc_splay_tree_get(struct cdc_splay_tree *t, void *key,
151  void **value);
152 
161 size_t cdc_splay_tree_count(struct cdc_splay_tree *t, void *key);
162 
171 void cdc_splay_tree_find(struct cdc_splay_tree *t, void *key,
172  struct cdc_splay_tree_iter *it);
175 // Capacity
185 static inline size_t cdc_splay_tree_size(struct cdc_splay_tree *t)
186 {
187  assert(t != NULL);
188 
189  return t->size;
190 }
191 
197 static inline bool cdc_splay_tree_empty(struct cdc_splay_tree *t)
198 {
199  assert(t != NULL);
200 
201  return t->size == 0;
202 }
205 // Modifiers
214 void cdc_splay_tree_clear(struct cdc_splay_tree *t);
215 
228 enum cdc_stat cdc_splay_tree_insert(struct cdc_splay_tree *t, void *key,
229  void *value,
230  struct cdc_pair_splay_tree_iter_bool *ret);
231 
245 enum cdc_stat cdc_splay_tree_insert1(struct cdc_splay_tree *t, void *key,
246  void *value,
247  struct cdc_splay_tree_iter *it,
248  bool *inserted);
249 
263  struct cdc_splay_tree *t, void *key, void *value,
264  struct cdc_pair_splay_tree_iter_bool *ret);
265 
280  void *key, void *value,
281  struct cdc_splay_tree_iter *it,
282  bool *inserted);
283 
290 size_t cdc_splay_tree_erase(struct cdc_splay_tree *t, void *key);
291 
297 void cdc_splay_tree_swap(struct cdc_splay_tree *a, struct cdc_splay_tree *b);
300 // Iterators
310 void cdc_splay_tree_begin(struct cdc_splay_tree *t,
311  struct cdc_splay_tree_iter *it);
312 
318 void cdc_splay_tree_end(struct cdc_splay_tree *t,
319  struct cdc_splay_tree_iter *it);
322 // Iterators
333 
339 
347 static inline bool cdc_splay_tree_iter_has_next(struct cdc_splay_tree_iter *it)
348 {
349  assert(it != NULL);
350 
351  return it->current != NULL;
352 }
353 
361 static inline bool cdc_splay_tree_iter_has_prev(struct cdc_splay_tree_iter *it)
362 {
363  assert(it != NULL);
364 
365  return it->prev != NULL;
366 }
367 
373 static inline void *cdc_splay_tree_iter_key(struct cdc_splay_tree_iter *it)
374 {
375  assert(it != NULL);
376 
377  return it->current->key;
378 }
379 
385 static inline void *cdc_splay_tree_iter_value(struct cdc_splay_tree_iter *it)
386 {
387  assert(it != NULL);
388 
389  return it->current->value;
390 }
391 
398  struct cdc_splay_tree_iter *it)
399 {
400  assert(it != NULL);
401 
402  struct cdc_pair pair = {it->prev->key, it->prev->value};
403  return pair;
404 }
405 
414 static inline bool cdc_splay_tree_iter_is_eq(struct cdc_splay_tree_iter *it1,
415  struct cdc_splay_tree_iter *it2)
416 {
417  assert(it1 != NULL);
418  assert(it2 != NULL);
419 
420  return it1->container == it2->container && it1->prev == it2->prev &&
421  it1->current == it2->current;
422 }
425 // Short names
426 #ifdef CDC_USE_SHORT_NAMES
427 typedef struct cdc_splay_tree splay_tree_t;
428 typedef struct cdc_splay_tree_iter splay_tree_iter_t;
429 typedef struct cdc_pair_splay_tree_iter pair_splay_tree_iter_t;
430 typedef struct cdc_pair_splay_tree_iter_bool pair_splay_tree_iter_bool_t;
431 
432 // Base
433 #define splay_tree_ctor(...) cdc_splay_tree_ctor(__VA_ARGS__)
434 #define splay_tree_ctorv(...) cdc_splay_tree_ctorv(__VA_ARGS__)
435 #define splay_tree_ctorl(...) cdc_splay_tree_ctorl(__VA_ARGS__)
436 #define splay_tree_dtor(...) cdc_splay_tree_dtor(__VA_ARGS__)
437 
438 // Lookup
439 #define splay_tree_get(...) cdc_splay_tree_get(__VA_ARGS__)
440 #define splay_tree_count(...) cdc_splay_tree_count(__VA_ARGS__)
441 #define splay_tree_find(...) cdc_splay_tree_find(__VA_ARGS__)
442 
443 // Capacity
444 #define splay_tree_size(...) cdc_splay_tree_size(__VA_ARGS__)
445 #define splay_tree_empty(...) cdc_splay_tree_empty(__VA_ARGS__)
446 
447 // Modifiers
448 #define splay_tree_clear(...) cdc_splay_tree_clear(__VA_ARGS__)
449 #define splay_tree_insert(...) cdc_splay_tree_insert(__VA_ARGS__)
450 #define splay_tree_insert1(...) cdc_splay_tree_insert1(__VA_ARGS__)
451 #define splay_tree_insert_or_assign(...) \
452  cdc_splay_tree_insert_or_assign(__VA_ARGS__)
453 #define splay_tree_insert_or_assign1(...) \
454  cdc_splay_tree_insert_or_assign1(__VA_ARGS__)
455 #define splay_tree_erase(...) cdc_splay_tree_erase(__VA_ARGS__)
456 #define splay_tree_swap(...) cdc_splay_tree_swap(__VA_ARGS__)
457 
458 // Iterators
459 #define splay_tree_begin(...) cdc_splay_tree_begin(__VA_ARGS__)
460 #define splay_tree_end(...) cdc_splay_tree_end(__VA_ARGS__)
461 
462 // Iterators
463 #define splay_tree_iter_next(...) cdc_splay_tree_iter_next(__VA_ARGS__)
464 #define splay_tree_iter_has_next(...) cdc_splay_tree_iter_has_next(__VA_ARGS__)
465 #define splay_tree_iter_key(...) cdc_splay_tree_iter_key(__VA_ARGS__)
466 #define splay_tree_iter_value(...) cdc_splay_tree_iter_value(__VA_ARGS__)
467 #define splay_tree_iter_key_value(...) \
468  cdc_splay_tree_iter_key_value(__VA_ARGS__)
469 #define splay_tree_iter_is_eq(...) cdc_splay_tree_iter_is_eq(__VA_ARGS__)
470 #endif
471 
472 #endif // CDCONTAINERS_INCLUDE_CDCONTAINERS_SPLAY_TREE_H
void * value
Definition: splay-tree.h:51
enum cdc_stat cdc_splay_tree_insert_or_assign(struct cdc_splay_tree *t, void *key, void *value, struct cdc_pair_splay_tree_iter_bool *ret)
Inserts an element or assigns to the current element if the key already exists.
void cdc_splay_tree_iter_next(struct cdc_splay_tree_iter *it)
Advances the iterator to the next element in the splay tree.
Definition: splay-tree.h:76
struct cdc_splay_tree_node * parent
Definition: splay-tree.h:47
void * key
Definition: splay-tree.h:50
void cdc_splay_tree_iter_prev(struct cdc_splay_tree_iter *it)
Advances the iterator to the previous element in the splay tree.
static bool cdc_splay_tree_iter_has_next(struct cdc_splay_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: splay-tree.h:347
size_t size
Definition: splay-tree.h:61
size_t cdc_splay_tree_erase(struct cdc_splay_tree *t, void *key)
Removes the element (if one exists) with the key equivalent to key.
The cdc_splay_tree is service struct.
Definition: splay-tree.h:59
size_t cdc_splay_tree_count(struct cdc_splay_tree *t, void *key)
Returns the number of elements with key that compares equal to the specified argument key...
bool second
Definition: splay-tree.h:78
struct cdc_splay_tree_node * prev
Definition: splay-tree.h:72
void cdc_splay_tree_find(struct cdc_splay_tree *t, void *key, struct cdc_splay_tree_iter *it)
Finds an element with key equivalent to key.
enum cdc_stat cdc_splay_tree_get(struct cdc_splay_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...
struct cdc_splay_tree * container
Definition: splay-tree.h:71
struct cdc_splay_tree_node * current
Definition: splay-tree.h:73
void cdc_splay_tree_end(struct cdc_splay_tree *t, struct cdc_splay_tree_iter *it)
Initializes the iterator to the end.
enum cdc_stat cdc_splay_tree_ctorl(struct cdc_splay_tree **t, struct cdc_data_info *info,...)
Constructs a splay tree, initialized by an variable number of pointers on cdc_pair&#39;s(first - key...
The cdc_splay_tree_iter is service struct.
Definition: splay-tree.h:70
Definition: common.h:60
enum cdc_stat cdc_splay_tree_insert(struct cdc_splay_tree *t, void *key, void *value, struct cdc_pair_splay_tree_iter_bool *ret)
Inserts an element into the container, if the container doesn&#39;t already contain an element with an eq...
static bool cdc_splay_tree_iter_is_eq(struct cdc_splay_tree_iter *it1, struct cdc_splay_tree_iter *it2)
Returns false if the iterator |it1| equal to the iterator |it2|, otherwise returns false...
Definition: splay-tree.h:414
struct cdc_splay_tree_node * left
Definition: splay-tree.h:48
void cdc_splay_tree_swap(struct cdc_splay_tree *a, struct cdc_splay_tree *b)
Swaps splay_trees a and b. This operation is very fast and never fails.
void cdc_splay_tree_dtor(struct cdc_splay_tree *t)
Destroys the splay tree.
enum cdc_stat cdc_splay_tree_insert_or_assign1(struct cdc_splay_tree *t, void *key, void *value, struct cdc_splay_tree_iter *it, bool *inserted)
Inserts an element or assigns to the current element if the key already exists.
cdc_stat
Definition: status.h:24
struct cdc_splay_tree_node * right
Definition: splay-tree.h:49
static bool cdc_splay_tree_empty(struct cdc_splay_tree *t)
Checks if the splay tree has no elements.
Definition: splay-tree.h:197
static struct cdc_pair cdc_splay_tree_iter_key_value(struct cdc_splay_tree_iter *it)
Returns a pair, where first - key, second - value.
Definition: splay-tree.h:397
static bool cdc_splay_tree_iter_has_prev(struct cdc_splay_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: splay-tree.h:361
static void * cdc_splay_tree_iter_value(struct cdc_splay_tree_iter *it)
Returns an item&#39;s value.
Definition: splay-tree.h:385
void cdc_splay_tree_clear(struct cdc_splay_tree *t)
Removes all the elements from the splay_tree.
void cdc_splay_tree_begin(struct cdc_splay_tree *t, struct cdc_splay_tree_iter *it)
Initializes the iterator to the beginning.
struct cdc_data_info * dinfo
Definition: splay-tree.h:62
The cdc_splay_tree_node is service struct.
Definition: splay-tree.h:46
static size_t cdc_splay_tree_size(struct cdc_splay_tree *t)
Returns the number of items in the splay_tree.
Definition: splay-tree.h:185
The cdc_data_info struct used to initialize contaners.
Definition: common.h:71
enum cdc_stat cdc_splay_tree_insert1(struct cdc_splay_tree *t, void *key, void *value, struct cdc_splay_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_splay_tree_ctor(struct cdc_splay_tree **t, struct cdc_data_info *info)
Constructs an empty splay tree.
enum cdc_stat cdc_splay_tree_ctorv(struct cdc_splay_tree **t, struct cdc_data_info *info, va_list args)
Constructs a splay tree, initialized by args. The last item must be CDC_END.
struct cdc_splay_tree_node * root
Definition: splay-tree.h:60
static void * cdc_splay_tree_iter_key(struct cdc_splay_tree_iter *it)
Returns an item&#39;s key.
Definition: splay-tree.h:373