changeset 6897:0a3186f44dff HEAD

Added seq_range_array_remove_seq_range() and seq_range_array_remove_invert_range().
author Timo Sirainen <tss@iki.fi>
date Sun, 02 Dec 2007 23:22:28 +0200
parents 139bd6094de6
children e739cffd05ef
files src/lib/seq-range-array.c src/lib/seq-range-array.h
diffstat 2 files changed, 44 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/seq-range-array.c	Sun Dec 02 16:22:44 2007 +0200
+++ b/src/lib/seq-range-array.c	Sun Dec 02 23:22:28 2007 +0200
@@ -213,6 +213,44 @@
 	return remove_count;
 }
 
+unsigned int seq_range_array_remove_seq_range(ARRAY_TYPE(seq_range) *dest,
+					      const ARRAY_TYPE(seq_range) *src)
+{
+	unsigned int ret = 0;
+	const struct seq_range *src_range;
+	unsigned int i, count;
+
+	src_range = array_get(src, &count);
+	for (i = 0; i < count; i++) {
+		ret += seq_range_array_remove_range(dest, src_range[i].seq1,
+						    src_range[i].seq2);
+	}
+	return ret;
+}
+
+unsigned int
+seq_range_array_remove_invert_range(ARRAY_TYPE(seq_range) *dest,
+				    const ARRAY_TYPE(seq_range) *src)
+{
+	const struct seq_range *src_range;
+	unsigned int i, count, ret = 0;
+	uint32_t last_seq = 0;
+
+	src_range = array_get(src, &count);
+	for (i = 0; i < count; i++) {
+		if (last_seq + 1 < src_range[i].seq1) {
+			ret += seq_range_array_remove_range(dest, last_seq + 1,
+							src_range[i].seq1 - 1);
+		}
+		last_seq = src_range[i].seq2;
+	}
+	if (last_seq != (uint32_t)-1) {
+		ret += seq_range_array_remove_range(dest, last_seq + 1,
+						    (uint32_t)-1);
+	}
+	return ret;
+}
+
 bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq)
 {
 	unsigned int idx;
--- a/src/lib/seq-range-array.h	Sun Dec 02 16:22:44 2007 +0200
+++ b/src/lib/seq-range-array.h	Sun Dec 02 23:22:28 2007 +0200
@@ -16,6 +16,12 @@
 /* Remove a sequence range. Returns number of sequences actually removed. */
 unsigned int seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array,
 					  uint32_t seq1, uint32_t seq2);
+unsigned int seq_range_array_remove_seq_range(ARRAY_TYPE(seq_range) *dest,
+					      const ARRAY_TYPE(seq_range) *src);
+/* Remove sequences from dest that don't exist in src. */
+unsigned int
+seq_range_array_remove_invert_range(ARRAY_TYPE(seq_range) *dest,
+				    const ARRAY_TYPE(seq_range) *src);
 /* Returns TRUE if sequence exists in the range. */
 bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq);