]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added seq_range_array_have_common().
authorTimo Sirainen <tss@iki.fi>
Fri, 20 Jun 2008 01:41:03 +0000 (04:41 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 20 Jun 2008 01:41:03 +0000 (04:41 +0300)
--HG--
branch : HEAD

src/lib/seq-range-array.c
src/lib/seq-range-array.h
src/tests/test-lib.c

index f952f7fc5032a9eac78af5629b054d6a96cc3551..17892d129636711c2def32274ada8cf54654eedf 100644 (file)
@@ -310,6 +310,27 @@ bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq)
        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;
index fe5d154254e1a853d162e6c46d32fd2c77d2b408..6d1846b08c61dbed7e771d073400380092c1a220 100644 (file)
@@ -33,6 +33,9 @@ seq_range_array_intersect(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);
+/* 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);
 
index 4ef592b4a786dfd1fcf51602b0b5f7036554bcd6..7e83f332654bc534d4b5835aa8f69700ab121cf2 100644 (file)
@@ -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();
 }