Daniele Lacamera / PicoTCP-Experimental_CDC_ECM_Branch

Fork of PicoTCP by Daniele Lacamera

Committer:
tass
Date:
Fri May 17 12:09:59 2013 +0000
Revision:
1:cfe8984a32b4
Parent:
libraries/picotcp/include/pico_tree.h@0:d7f2341ab245
Update for smaller SOCKETQ

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 0:d7f2341ab245 1 /*********************************************************************
daniele 0:d7f2341ab245 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 0:d7f2341ab245 3 See LICENSE and COPYING for usage.
daniele 0:d7f2341ab245 4
daniele 0:d7f2341ab245 5 Author: Andrei Carp <andrei.carp@tass.be>
daniele 0:d7f2341ab245 6 *********************************************************************/
daniele 0:d7f2341ab245 7
daniele 0:d7f2341ab245 8 #ifndef __PICO_RBTREE_H__
daniele 0:d7f2341ab245 9 #define __PICO_RBTREE_H__
daniele 0:d7f2341ab245 10
daniele 0:d7f2341ab245 11 #include <stdint.h>
daniele 0:d7f2341ab245 12 #include "pico_config.h"
daniele 0:d7f2341ab245 13
daniele 0:d7f2341ab245 14 // This is used to declare a new tree, leaf root by default
daniele 0:d7f2341ab245 15 #define PICO_TREE_DECLARE(name,compareFunction) \
daniele 0:d7f2341ab245 16 struct pico_tree name =\
daniele 0:d7f2341ab245 17 { \
daniele 0:d7f2341ab245 18 &LEAF, \
daniele 0:d7f2341ab245 19 compareFunction \
daniele 0:d7f2341ab245 20 }
daniele 0:d7f2341ab245 21
daniele 0:d7f2341ab245 22
daniele 0:d7f2341ab245 23 struct pico_tree_node
daniele 0:d7f2341ab245 24 {
daniele 0:d7f2341ab245 25 void* keyValue; // generic key
daniele 0:d7f2341ab245 26 struct pico_tree_node* parent;
daniele 0:d7f2341ab245 27 struct pico_tree_node* leftChild;
daniele 0:d7f2341ab245 28 struct pico_tree_node* rightChild;
daniele 0:d7f2341ab245 29 uint8_t color;
daniele 0:d7f2341ab245 30 };
daniele 0:d7f2341ab245 31
daniele 0:d7f2341ab245 32 struct pico_tree
daniele 0:d7f2341ab245 33 {
daniele 0:d7f2341ab245 34 struct pico_tree_node * root; // root of the tree
daniele 0:d7f2341ab245 35
daniele 0:d7f2341ab245 36 // this function directly provides the keys as parameters not the nodes.
daniele 0:d7f2341ab245 37 int (*compare)(void* keyA, void* keyB);
daniele 0:d7f2341ab245 38 };
daniele 0:d7f2341ab245 39
daniele 0:d7f2341ab245 40 extern struct pico_tree_node LEAF; // generic leaf node
daniele 0:d7f2341ab245 41 /*
daniele 0:d7f2341ab245 42 * Manipulation functions
daniele 0:d7f2341ab245 43 */
daniele 0:d7f2341ab245 44 void * pico_tree_insert(struct pico_tree * tree, void * key);
daniele 0:d7f2341ab245 45 void * pico_tree_delete(struct pico_tree * tree, void * key);
daniele 0:d7f2341ab245 46 void * pico_tree_findKey(struct pico_tree * tree, void * key);
daniele 0:d7f2341ab245 47 void pico_tree_drop(struct pico_tree * tree);
daniele 0:d7f2341ab245 48 int pico_tree_empty(struct pico_tree * tree);
daniele 0:d7f2341ab245 49 struct pico_tree_node * pico_tree_findNode(struct pico_tree * tree, void * key);
daniele 0:d7f2341ab245 50
daniele 0:d7f2341ab245 51 void * pico_tree_first(struct pico_tree * tree);
daniele 0:d7f2341ab245 52 void * pico_tree_last(struct pico_tree * tree);
daniele 0:d7f2341ab245 53 /*
daniele 0:d7f2341ab245 54 * Traverse functions
daniele 0:d7f2341ab245 55 */
daniele 0:d7f2341ab245 56 struct pico_tree_node * pico_tree_lastNode(struct pico_tree_node * node);
daniele 0:d7f2341ab245 57 struct pico_tree_node * pico_tree_firstNode(struct pico_tree_node * node);
daniele 0:d7f2341ab245 58 struct pico_tree_node * pico_tree_next(struct pico_tree_node * node);
daniele 0:d7f2341ab245 59 struct pico_tree_node * pico_tree_prev(struct pico_tree_node * node);
daniele 0:d7f2341ab245 60
daniele 0:d7f2341ab245 61 /*
daniele 0:d7f2341ab245 62 * For each macros
daniele 0:d7f2341ab245 63 */
daniele 0:d7f2341ab245 64
daniele 0:d7f2341ab245 65 #define pico_tree_foreach(idx,tree) \
daniele 0:d7f2341ab245 66 for ((idx) = pico_tree_firstNode((tree)->root); \
daniele 0:d7f2341ab245 67 (idx) != &LEAF; \
daniele 0:d7f2341ab245 68 (idx) = pico_tree_next(idx))
daniele 0:d7f2341ab245 69
daniele 0:d7f2341ab245 70 #define pico_tree_foreach_reverse(idx,tree) \
daniele 0:d7f2341ab245 71 for ((idx) = pico_tree_lastNode((tree)->root); \
daniele 0:d7f2341ab245 72 (idx) != &LEAF; \
daniele 0:d7f2341ab245 73 (idx) = pico_tree_prev(idx))
daniele 0:d7f2341ab245 74
daniele 0:d7f2341ab245 75 #define pico_tree_foreach_safe(idx,tree,idx2) \
daniele 0:d7f2341ab245 76 for ((idx) = pico_tree_firstNode((tree)->root); \
daniele 0:d7f2341ab245 77 ((idx) != &LEAF) && ((idx2) = pico_tree_next(idx), 1); \
daniele 0:d7f2341ab245 78 (idx) = (idx2))
daniele 0:d7f2341ab245 79
daniele 0:d7f2341ab245 80 #define pico_tree_foreach_reverse_safe(idx,tree,idx2) \
daniele 0:d7f2341ab245 81 for ((idx) = pico_tree_lastNode((tree)->root); \
daniele 0:d7f2341ab245 82 ((idx) != &LEAF) && ((idx2) = pico_tree_prev(idx), 1); \
daniele 0:d7f2341ab245 83 (idx) = (idx2))
daniele 0:d7f2341ab245 84
daniele 0:d7f2341ab245 85 #endif