Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7905:3e8bcf4f6f5e HEAD
Added seq_range_array_have_common().
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 20 Jun 2008 04:41:03 +0300 |
parents | 34085062ad89 |
children | d987e018483b |
files | src/lib/seq-range-array.c src/lib/seq-range-array.h src/tests/test-lib.c |
diffstat | 3 files changed, 63 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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 @@ 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;
--- 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 @@ 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);
--- 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 @@ } } -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 @@ 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(); }