bd8697516cb549c7b833754cedf91a387312347b kent Thu Jul 25 10:56:17 2013 -0700 Adding functions to sum up size of all ranges in tree. diff --git src/lib/rangeTree.c src/lib/rangeTree.c index de519bb..5e74778 100644 --- src/lib/rangeTree.c +++ src/lib/rangeTree.c @@ -305,29 +305,47 @@ tempR.end = overlapEnd = end; totalOverlap = 0; rbTreeTraverseRange(tree, &tempR, &tempR, addOverlap); return totalOverlap; } int rangeTreeOverlapTotalSize(struct rbTree *tree) /* Return the total size of all ranges in range tree. * Sadly not thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ { return rangeTreeOverlapSize(tree, INT_MIN, INT_MAX); } +void rangeTreeSumRangeCallback(void *item, void *context) +/* This is a callback for rbTreeTraverse with context. It just adds up + * end-start */ +{ +struct range *range = item; +long long *pSum = context; +*pSum += range->end - range->start; +} + +long long rangeTreeSumRanges(struct rbTree *tree) +/* Return sum of end-start of all items. */ +{ +long long sum = 0; +rbTreeTraverseWithContext(tree, rangeTreeSumRangeCallback, &sum); +return sum; +} + + struct rbTree *rangeTreeNew() /* Create a new, empty, rangeTree. */ { return rbTreeNew(rangeCmp); } struct rbTree *rangeTreeNewDetailed(struct lm *lm, struct rbTreeNode *stack[128]) /* Allocate rangeTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ { return rbTreeNewDetailed(rangeCmp, lm, stack); }