Mercurial > dovecot > original-hg > dovecot-1.2
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