dovecot-1.2: Added seq_range_array_have_common().

dovecot at dovecot.org dovecot at dovecot.org
Fri Jun 20 05:37:40 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.2/rev/3e8bcf4f6f5e
changeset: 7905:3e8bcf4f6f5e
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jun 20 04:41:03 2008 +0300
description:
Added seq_range_array_have_common().

diffstat:

3 files changed, 63 insertions(+), 1 deletion(-)
src/lib/seq-range-array.c |   21 +++++++++++++++++++++
src/lib/seq-range-array.h |    3 +++
src/tests/test-lib.c      |   40 +++++++++++++++++++++++++++++++++++++++-

diffs (101 lines):

diff -r 34085062ad89 -r 3e8bcf4f6f5e src/lib/seq-range-array.c
--- a/src/lib/seq-range-array.c	Thu Jun 19 09:15:28 2008 +0300
+++ b/src/lib/seq-range-array.c	Fri Jun 20 04:41:03 2008 +0300
@@ -310,6 +310,27 @@ bool seq_range_exists(const ARRAY_TYPE(s
 	return seq_range_lookup(array, seq, &idx);
 }
 
+bool seq_range_array_have_common(const ARRAY_TYPE(seq_range) *array1,
+				 const ARRAY_TYPE(seq_range) *array2)
+{
+	const struct seq_range *range1, *range2;
+	unsigned int i1, i2, count1, count2;
+
+	range1 = array_get(array1, &count1);
+	range2 = array_get(array2, &count2);
+	for (i1 = i2 = 0; i1 < count1 && i2 < count2; ) {
+		if (range1[i1].seq1 <= range2[i2].seq2 &&
+		    range1[i1].seq2 >= range2[i2].seq1)
+			return TRUE;
+
+		if (range1[i1].seq1 < range2[i2].seq1)
+			i1++;
+		else
+			i2++;
+	}
+	return FALSE;
+}
+
 unsigned int seq_range_count(const ARRAY_TYPE(seq_range) *array)
 {
 	const struct seq_range *range;
diff -r 34085062ad89 -r 3e8bcf4f6f5e src/lib/seq-range-array.h
--- a/src/lib/seq-range-array.h	Thu Jun 19 09:15:28 2008 +0300
+++ b/src/lib/seq-range-array.h	Fri Jun 20 04:41:03 2008 +0300
@@ -33,6 +33,9 @@ seq_range_array_intersect(ARRAY_TYPE(seq
 			  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);
+/* Returns TRUE if arrays have common sequences. */
+bool seq_range_array_have_common(const ARRAY_TYPE(seq_range) *array1,
+				 const ARRAY_TYPE(seq_range) *array2);
 /* Return number of sequences in the range. */
 unsigned int seq_range_count(const ARRAY_TYPE(seq_range) *array);
 
diff -r 34085062ad89 -r 3e8bcf4f6f5e src/tests/test-lib.c
--- a/src/tests/test-lib.c	Thu Jun 19 09:15:28 2008 +0300
+++ b/src/tests/test-lib.c	Fri Jun 20 04:41:03 2008 +0300
@@ -605,7 +605,7 @@ fail:
 	}
 }
 
-static void test_seq_range_array(void)
+static void test_seq_range_array_invert(void)
 {
 	static const unsigned int input_min = 1, input_max = 5;
 	static const unsigned int input[] = {
@@ -646,6 +646,44 @@ static void test_seq_range_array(void)
 			 success);
 		array_free(&range);
 	}
+}
+
+static void test_seq_range_create(ARRAY_TYPE(seq_range) *array, uint8_t byte)
+{
+	unsigned int i;
+
+	array_clear(array);
+	for (i = 0; i < 8; i++) {
+		if ((byte & (1 << i)) != 0)
+			seq_range_array_add(array, 0, i + 1);
+	}
+}
+
+static void test_seq_range_array_have_common(void)
+{
+	ARRAY_TYPE(seq_range) arr1, arr2;
+	unsigned int i, j;
+	bool ret1, ret2, success = TRUE;
+
+	t_array_init(&arr1, 8);
+	t_array_init(&arr2, 8);
+	for (i = 0; i < 256; i++) {
+		test_seq_range_create(&arr1, i);
+		for (j = 0; j < 256; j++) {
+			test_seq_range_create(&arr2, j);
+			ret1 = seq_range_array_have_common(&arr1, &arr2);
+			ret2 = (i & j) != 0;
+			if (ret1 != ret2)
+				success = FALSE;
+		}
+	}
+	test_out("seq_range_array_have_common()", success);
+}
+
+static void test_seq_range_array(void)
+{
+	test_seq_range_array_invert();
+	test_seq_range_array_have_common();
 	test_seq_range_array_random();
 }
 


More information about the dovecot-cvs mailing list