changeset 4932:f38f3f11a93f HEAD

Added seq_range_array_remove_range()
author Timo Sirainen <tss@iki.fi>
date Wed, 20 Dec 2006 16:44:40 +0200
parents 59ce1d6c0b8c
children 44a0e7606f7a
files src/lib/seq-range-array.c src/lib/seq-range-array.h
diffstat 2 files changed, 37 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/seq-range-array.c	Wed Dec 20 15:59:16 2006 +0200
+++ b/src/lib/seq-range-array.c	Wed Dec 20 16:44:40 2006 +0200
@@ -171,6 +171,41 @@
 	}
 }
 
+void seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array,
+				  uint32_t seq1, uint32_t seq2)
+{
+	const struct seq_range *data;
+	unsigned int idx, idx2, count;
+
+	/* remove first and last. this makes sure that everything between
+	   can simply be deleted with array_delete().
+
+	   FIXME: it would be faster if we did only one binary lookup here
+	   and handled the splitting ourself.. */
+	seq_range_array_remove(array, seq1++);
+	if (seq1 > seq2)
+		return;
+	seq_range_array_remove(array, seq2--);
+	if (seq1 == seq2)
+		return;
+
+	/* find the beginning */
+	data = array_get(array, &count);
+	(void)seq_range_lookup(array, seq1, &idx);
+	if (idx < count && data[idx].seq2 < seq1)
+		idx++;
+
+	if (idx == count)
+		return;
+
+	i_assert(data[idx].seq1 >= seq1);
+	for (idx2 = idx; idx2 < count; idx2++) {
+		if (data[idx2].seq1 > seq2)
+			break;
+	}
+	array_delete(array, idx, idx2-idx);
+}
+
 bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq)
 {
 	unsigned int idx;
--- a/src/lib/seq-range-array.h	Wed Dec 20 15:59:16 2006 +0200
+++ b/src/lib/seq-range-array.h	Wed Dec 20 16:44:40 2006 +0200
@@ -10,6 +10,8 @@
 void seq_range_array_add(ARRAY_TYPE(seq_range) *array, unsigned int init_count,
 			 uint32_t seq);
 void seq_range_array_remove(ARRAY_TYPE(seq_range) *array, uint32_t seq);
+void seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array,
+				  uint32_t seq1, uint32_t seq2);
 bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq);
 
 #endif