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); \
}