IETree.xcc
Benoit Dupont de Dinechin (Benoit.Dupont-de-Dinechin@st.com)
Copyright 2007 STMicroelectronics. Copyright 1995 - 1998 Commissariat a l'Energie Atomique.
This program is free software; you can redistribute it and/or modify it under the terms of either (at your option): the GNU General Public License (GPL) version 2; the GNU Lesser General Public License (LGPL) version 2.1; any later version of these licences as published by the Free Software Foundation.
The IETree implements set of integers as interval trees, see Martin Erwing ``Diets for Fat Sets'', J. Functional Programming, 1, (http://cs.oregonstate.edu/~erwig/diet/).
IETreeMember_SUCC— Successor of this IETreeMember.
IETreeMember_PRED— Predecessor of this IETreeMember.
// typedef intptr_t IETreeMember; #define IETreeMember_SUCC(this) ((IETreeMember)(this) + 1) #define IETreeMember_PRED(this) ((IETreeMember)(this) - 1)
IETreeMember_GT— Compare two IETreeMembers for less than.
IETreeMember_LT— Compare two IETreeMembers for greater than.
IETreeMember_GE— Compare two IETreeMembers for less than or equal.
IETreeMember_LE— Compare two IETreeMembers for greater than or equal.
IETreeMember_EQ— Compare two IETreeMembers for equality
IETreeMember_NE— Compare two IETreeMembers for non-equality
#define IETreeMember_GT(a, b) ((IETreeMember)(a) > (IETreeMember)(b)) #define IETreeMember_LT(a, b) ((IETreeMember)(a) < (IETreeMember)(b)) #define IETreeMember_GE(a, b) ((IETreeMember)(a) >= (IETreeMember)(b)) #define IETreeMember_LE(a, b) ((IETreeMember)(a) <= (IETreeMember)(b)) #define IETreeMember_EQ(a, b) ((IETreeMember)(a) == (IETreeMember)(b)) #define IETreeMember_NE(a, b) ((IETreeMember)(a) != (IETreeMember)(b))
The IETreeNode_ structure implements the IETree tree nodes.
struct IETreeNode_ { //@args IETreeMember low, IETreeMember high IETreeMember LOW; IETreeMember HIGH; struct IETreeNode_ *LEFT; struct IETreeNode_ *RIGHT; };
IETree— Interval Encoding Tree.
struct IETree_ { //@args Memory memory // memory: The Memory where the IETreeMembers are allocated. Memory MEMORY; IETreeNode ROOT; IETreeMember LOW; IETreeMember HIGH; int32_t COUNT; int32_t ORDER; };
IETree_isEmpty— True iff this IETree is empty.
static inline bool IETree_isEmpty(const_IETree this) { return IETree_ROOT(this) == NULL; }
IETree_isSingle— True iff this IETree contains a single member.
static inline bool IETree_isSingle(const_IETree this) { IETreeNode root = IETree_ROOT(this); return root != NULL && IETreeNode_LEFT(root) == NULL && IETreeNode_RIGHT(root) == NULL && IETreeNode_LOW(root) == IETreeNode_HIGH(root); }
IETree_root— For use by IETree_FOREACH.
static inline IETreeNode IETree_root(const_IETree this) { return IETree_ROOT(this); }
IETree_order— For use by IETree_FOREACH.
static inline int32_t IETree_order(const_IETree this) { return IETree_ORDER(this); }
IETree_count— Count members contained in the IETree.
- Return
- The count of members in this IETree.
int32_t IETree_count(const_IETree this);
IETree_choose— Choose and remove a member of the IETree.
IETreeMember IETree_choose(IETree this);
IETree_contains— Test a member for containment.
- Return
- True if this IETree contains member.
bool IETree_contains(const_IETree this, IETreeMember member);
IETree_insert— Insert a member in this IETree.
- Return
- False iff member was already contained in this IETree.
bool IETree_insert(IETree this, IETreeMember member);
IETree_remove— Remove a member from this IETree.
- Return
- False iff member was not contained in this IETree.
bool IETree_remove(IETree this, IETreeMember member);
IETree_equals— Test for IETree equality.
bool IETree_equals(const_IETree this, const_IETree that);
IETree_union— Union of this IETree with that IETree.
bool IETree_union(IETree this, IETree that);
IETree_inter— Intersect this IETree with that IETree.
bool IETree_inter(IETree this, IETree that);
IETree_diff— Remove that IETree members from this IETree.
bool IETree_diff(IETree this, IETree that);
IETree_FOREACH— Iterates over the IETree members.
#define IETree_FOREACH(this, iter) { \ int32_t IETree_ORDER = IETree_order(this); \ IETreeNode IETree_NODEARRAY[128]; \ IETreeNode *IETree_NODES = IETree_ORDER > 128? \ Memory_alloc(Memory_Root, sizeof(IETreeNode)*IETree_ORDER): \ IETree_NODEARRAY; \ IETreeNode *IETree_LAST = IETree_NODES; \ IETreeNode IETree_NODE = IETree_root(this); \ for (;;) { \ while (IETree_NODE != NULL) { \ *IETree_LAST++ = IETree_NODE; \ IETree_NODE = IETreeNode_LEFT(IETree_NODE); \ } \ if (IETree_LAST-- != IETree_NODES) { \ IETreeMember IETree_ITER = IETreeNode_LOW(*IETree_LAST); \ IETreeMember IETree_HIGH = IETreeNode_HIGH(*IETree_LAST); \ IETree_NODE = IETreeNode_RIGHT(*IETree_LAST); \ for (; IETreeMember_LE(IETree_ITER, IETree_HIGH); \ IETree_ITER = IETreeMember_SUCC(IETree_ITER)) { \ IETreeMember iter = IETree_ITER; #define IETree_ENDEACH \ } \ if (IETreeMember_LE(IETree_ITER, IETree_HIGH)) break; \ } else break; \ } \ if (IETree_ORDER > 128) Memory_free_(Memory_Root, IETree_NODES); \ }