Free (GPLv2) TCP/IP stack developed by TASS Belgium

Fork of PicoTCP by Daniele Lacamera

include/pico_tree.h

Committer:
daniele
Date:
2013-08-03
Revision:
51:18637a3d071f
Parent:
6:55b47464d5bc

File content as of revision 51:18637a3d071f:

/*********************************************************************
PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
See LICENSE and COPYING for usage.

Author: Andrei Carp <andrei.carp@tass.be>
*********************************************************************/

#ifndef __PICO_RBTREE_H__
#define __PICO_RBTREE_H__

#include <stdint.h>
#include "pico_config.h"

// This is used to declare a new tree, leaf root by default
#define PICO_TREE_DECLARE(name,compareFunction) \
    struct pico_tree name =\
    { \
        &LEAF, \
        compareFunction \
    }

struct pico_tree_node
{
  void* keyValue; // generic key
  struct pico_tree_node* parent;
  struct pico_tree_node* leftChild;
  struct pico_tree_node* rightChild;
  uint8_t color;
};

struct pico_tree
{
    struct pico_tree_node * root; // root of the tree

    // this function directly provides the keys as parameters not the nodes.
  int (*compare)(void* keyA, void* keyB);
};

extern struct pico_tree_node LEAF; // generic leaf node
/*
 * Manipulation functions
 */
void * pico_tree_insert(struct pico_tree * tree, void * key);
void * pico_tree_delete(struct pico_tree * tree, void * key);
void * pico_tree_findKey(struct pico_tree * tree, void * key);
void     pico_tree_drop(struct pico_tree * tree);
int     pico_tree_empty(struct pico_tree * tree);
struct pico_tree_node * pico_tree_findNode(struct pico_tree * tree, void * key);

void * pico_tree_first(struct pico_tree * tree);
void * pico_tree_last(struct pico_tree * tree);
/*
 * Traverse functions
 */
struct pico_tree_node * pico_tree_lastNode(struct pico_tree_node * node);
struct pico_tree_node * pico_tree_firstNode(struct pico_tree_node * node);
struct pico_tree_node * pico_tree_next(struct pico_tree_node * node);
struct pico_tree_node * pico_tree_prev(struct pico_tree_node * node);

/*
 * For each macros
 */

#define pico_tree_foreach(idx,tree) \
        for ((idx) = pico_tree_firstNode((tree)->root); \
             (idx) != &LEAF; \
             (idx) = pico_tree_next(idx))

#define pico_tree_foreach_reverse(idx,tree) \
        for ((idx) = pico_tree_lastNode((tree)->root); \
             (idx) != &LEAF; \
             (idx) = pico_tree_prev(idx))

#define pico_tree_foreach_safe(idx,tree,idx2) \
        for ((idx) = pico_tree_firstNode((tree)->root);    \
             ((idx) != &LEAF) && ((idx2) = pico_tree_next(idx), 1); \
              (idx) = (idx2))

#define pico_tree_foreach_reverse_safe(idx,tree,idx2) \
        for ((idx) = pico_tree_lastNode((tree)->root); \
                ((idx) != &LEAF) && ((idx2) = pico_tree_prev(idx), 1); \
                 (idx) = (idx2))

#endif