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