From: Timo Sirainen Date: Thu, 1 Oct 2020 08:18:04 +0000 (+0300) Subject: lib: seq-range-array - Split off seq_range_array_add_slow_path() X-Git-Tag: 2.3.13~93 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1c7ae79d9742baa190f41e0da776049315b14827;p=thirdparty%2Fdovecot%2Fcore.git lib: seq-range-array - Split off seq_range_array_add_slow_path() --- diff --git a/src/lib/seq-range-array.c b/src/lib/seq-range-array.c index de06e38d1c..598ddd9292 100644 --- a/src/lib/seq-range-array.c +++ b/src/lib/seq-range-array.c @@ -35,38 +35,14 @@ seq_range_lookup(const ARRAY_TYPE(seq_range) *array, return FALSE; } -bool seq_range_array_add(ARRAY_TYPE(seq_range) *array, uint32_t seq) +static bool +seq_range_array_add_slow_path(ARRAY_TYPE(seq_range) *array, uint32_t seq) { struct seq_range *data, value; unsigned int idx, count; value.seq1 = value.seq2 = seq; - data = array_get_modifiable(array, &count); - if (count == 0) { - array_push_back(array, &value); - return FALSE; - } - - /* quick checks */ - if (data[count-1].seq2 < seq) { - if (data[count-1].seq2 == seq-1) { - /* grow last range */ - data[count-1].seq2 = seq; - } else { - array_push_back(array, &value); - } - return FALSE; - } - if (data[0].seq1 > seq) { - if (data[0].seq1-1 == seq) { - /* grow down first range */ - data[0].seq1 = seq; - } else { - array_push_front(array, &value); - } - return FALSE; - } /* somewhere in the middle, array is sorted so find it with binary search */ @@ -102,6 +78,42 @@ bool seq_range_array_add(ARRAY_TYPE(seq_range) *array, uint32_t seq) return FALSE; } +bool seq_range_array_add(ARRAY_TYPE(seq_range) *array, uint32_t seq) +{ + struct seq_range *data, value; + unsigned int count; + + value.seq1 = value.seq2 = seq; + + data = array_get_modifiable(array, &count); + if (count == 0) { + array_push_back(array, &value); + return FALSE; + } + + /* quick checks */ + if (data[count-1].seq2 < seq) { + if (data[count-1].seq2 == seq-1) { + /* grow last range */ + data[count-1].seq2 = seq; + } else { + array_push_back(array, &value); + } + return FALSE; + } + if (data[0].seq1 > seq) { + if (data[0].seq1-1 == seq) { + /* grow down first range */ + data[0].seq1 = seq; + } else { + array_push_front(array, &value); + } + return FALSE; + } + + return seq_range_array_add_slow_path(array, seq); +} + void seq_range_array_add_with_init(ARRAY_TYPE(seq_range) *array, unsigned int init_count, uint32_t seq) {