annotate src/lib/seq-range-array.c @ 6897:0a3186f44dff HEAD

Added seq_range_array_remove_seq_range() and seq_range_array_remove_invert_range().
author Timo Sirainen <tss@iki.fi>
date Sun, 02 Dec 2007 23:22:28 +0200
parents 6ed01546f211
children 7ed926ed7aa4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6429
65c69a53a7be Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents: 6102
diff changeset
1 /* Copyright (c) 2005-2007 Dovecot authors, see the included COPYING file */
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "seq-range-array.h"
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
4687
c8b565e87966 seq_range_exists() can take a const pointer to the array.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
7 static bool seq_range_lookup(const ARRAY_TYPE(seq_range) *array,
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4206
diff changeset
8 uint32_t seq, unsigned int *idx_r)
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 {
4687
c8b565e87966 seq_range_exists() can take a const pointer to the array.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
10 const struct seq_range *data;
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 unsigned int idx, left_idx, right_idx, count;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
4687
c8b565e87966 seq_range_exists() can take a const pointer to the array.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
13 data = array_get(array, &count);
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 idx = 0; left_idx = 0; right_idx = count;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 while (left_idx < right_idx) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 idx = (left_idx + right_idx) / 2;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 if (data[idx].seq1 <= seq) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 if (data[idx].seq2 >= seq) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 /* it's already in the range */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 *idx_r = idx;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 return TRUE;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 left_idx = idx+1;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 } else {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 right_idx = idx;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 *idx_r = idx;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 return FALSE;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4206
diff changeset
34 void seq_range_array_add(ARRAY_TYPE(seq_range) *array,
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4206
diff changeset
35 unsigned int init_count, uint32_t seq)
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 struct seq_range *data, value;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 unsigned int idx, count;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 value.seq1 = value.seq2 = seq;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4206
diff changeset
42 if (!array_is_created(array))
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
43 i_array_init(array, init_count);
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4206
diff changeset
45 data = array_get_modifiable(array, &count);
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 if (count == 0) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 array_append(array, &value, 1);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 return;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 /* quick checks */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 if (data[count-1].seq2 == seq-1) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 /* grow last range */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 data[count-1].seq2 = seq;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 return;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 if (data[count-1].seq2 < seq) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 array_append(array, &value, 1);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 return;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 if (data[0].seq1 == seq+1) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 /* grow down first range */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 data[0].seq1 = seq;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 return;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 if (data[0].seq1 > seq) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 array_insert(array, 0, &value, 1);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 return;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 /* somewhere in the middle, array is sorted so find it with
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 binary search */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 if (seq_range_lookup(array, seq, &idx))
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 return;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 if (data[idx].seq2 < seq)
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 idx++;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 /* idx == count couldn't happen because we already handle it above */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 i_assert(idx < count && data[idx].seq1 >= seq);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 i_assert(data[idx].seq1 > seq || data[idx].seq2 < seq);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 if (data[idx].seq1 == seq+1) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 data[idx].seq1 = seq;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 if (idx > 0 && data[idx-1].seq2 == seq-1) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 /* merge */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 data[idx-1].seq2 = data[idx].seq2;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 array_delete(array, idx, 1);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 } else if (data[idx].seq2 == seq-1) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 i_assert(idx+1 < count); /* already handled above */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 data[idx].seq2 = seq;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 if (data[idx+1].seq1 == seq+1) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 /* merge */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 data[idx+1].seq1 = data[idx].seq1;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 array_delete(array, idx, 1);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 } else {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 array_insert(array, idx, &value, 1);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 4932
diff changeset
103 bool seq_range_array_remove(ARRAY_TYPE(seq_range) *array, uint32_t seq)
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 struct seq_range *data, value;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 unsigned int idx, left_idx, right_idx, count;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 if (!array_is_created(array))
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 4932
diff changeset
109 return FALSE;
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4206
diff changeset
111 data = array_get_modifiable(array, &count);
4173
1ba7983b814c seq_range_array_remove(): Don't crash if array is empty.
Timo Sirainen <tss@iki.fi>
parents: 4112
diff changeset
112 if (count == 0)
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 4932
diff changeset
113 return FALSE;
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 /* quick checks */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 if (seq > data[count-1].seq2 || seq < data[0].seq1) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 /* outside the range */
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 4932
diff changeset
118 return FALSE;
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 if (data[count-1].seq2 == seq) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 /* shrink last range */
4112
d7e169797e3e Removal didn't work properly from beginning/end if the range contained only
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
122 if (data[count-1].seq1 != data[count-1].seq2)
d7e169797e3e Removal didn't work properly from beginning/end if the range contained only
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
123 data[count-1].seq2--;
d7e169797e3e Removal didn't work properly from beginning/end if the range contained only
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
124 else
d7e169797e3e Removal didn't work properly from beginning/end if the range contained only
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
125 array_delete(array, count-1, 1);
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 4932
diff changeset
126 return TRUE;
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 if (data[0].seq1 == seq) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 /* shrink up first range */
4112
d7e169797e3e Removal didn't work properly from beginning/end if the range contained only
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
130 if (data[0].seq1 != data[0].seq2)
d7e169797e3e Removal didn't work properly from beginning/end if the range contained only
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
131 data[0].seq1++;
d7e169797e3e Removal didn't work properly from beginning/end if the range contained only
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
132 else
d7e169797e3e Removal didn't work properly from beginning/end if the range contained only
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
133 array_delete(array, 0, 1);
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 4932
diff changeset
134 return TRUE;
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 /* somewhere in the middle, array is sorted so find it with
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 binary search */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 idx = 0; left_idx = 0; right_idx = count;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 while (left_idx < right_idx) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 idx = (left_idx + right_idx) / 2;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 if (data[idx].seq1 > seq)
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 right_idx = idx;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 else if (data[idx].seq2 < seq)
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 left_idx = idx+1;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 else {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 /* found it */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 if (data[idx].seq1 == seq) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 if (data[idx].seq1 == data[idx].seq2) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 /* a single sequence range.
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 remove it entirely */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 array_delete(array, idx, 1);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 } else {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 /* shrink the range */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 data[idx].seq1++;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 } else if (data[idx].seq2 == seq) {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 /* shrink the range */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 data[idx].seq2--;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 } else {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 /* split the sequence range */
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 value.seq1 = seq + 1;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 value.seq2 = data[idx].seq2;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 data[idx].seq2 = seq - 1;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
4206
ec7e56827ea8 Fix for seq_range_array_remove()
Timo Sirainen <tss@iki.fi>
parents: 4173
diff changeset
167 array_insert(array, idx + 1, &value, 1);
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 }
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 4932
diff changeset
169 return TRUE;
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 }
6037
d911d943438e Recent flag handling rewrite. Still not perfect with maildir.
Timo Sirainen <tss@iki.fi>
parents: 4932
diff changeset
172 return FALSE;
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 }
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
6040
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
175 unsigned int seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array,
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
176 uint32_t seq1, uint32_t seq2)
4932
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
177 {
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
178 const struct seq_range *data;
6040
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
179 unsigned int idx, idx2, count, remove_count = 0;
4932
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
180
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
181 /* remove first and last. this makes sure that everything between
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
182 can simply be deleted with array_delete().
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
183
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
184 FIXME: it would be faster if we did only one binary lookup here
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
185 and handled the splitting ourself.. */
6852
6ed01546f211 seq_range_array_remove_range(): Don't break if seq2 is -1U.
Timo Sirainen <tss@iki.fi>
parents: 6758
diff changeset
186 if (seq_range_array_remove(array, seq1))
6040
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
187 remove_count++;
6852
6ed01546f211 seq_range_array_remove_range(): Don't break if seq2 is -1U.
Timo Sirainen <tss@iki.fi>
parents: 6758
diff changeset
188 if (seq1 == seq2)
6040
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
189 return remove_count;
6852
6ed01546f211 seq_range_array_remove_range(): Don't break if seq2 is -1U.
Timo Sirainen <tss@iki.fi>
parents: 6758
diff changeset
190 seq1++;
6040
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
191
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
192 if (seq_range_array_remove(array, seq2--))
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
193 remove_count++;
6102
a7dca74c0978 seq_range_array_remove_range() sometimes didn't remove one sequence from the
Timo Sirainen <tss@iki.fi>
parents: 6040
diff changeset
194 if (seq1 > seq2)
6040
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
195 return remove_count;
4932
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
196
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
197 /* find the beginning */
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
198 data = array_get(array, &count);
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
199 (void)seq_range_lookup(array, seq1, &idx);
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
200 if (idx < count && data[idx].seq2 < seq1)
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
201 idx++;
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
202
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
203 if (idx == count)
6040
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
204 return remove_count;
4932
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
205
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
206 i_assert(data[idx].seq1 >= seq1);
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
207 for (idx2 = idx; idx2 < count; idx2++) {
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
208 if (data[idx2].seq1 > seq2)
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
209 break;
6040
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
210 remove_count += data[idx2].seq2 - data[idx2].seq1 + 1;
4932
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
211 }
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
212 array_delete(array, idx, idx2-idx);
6040
fef4aad133dd seq_range_array_remove_range() returns now how many sequences were removed.
Timo Sirainen <tss@iki.fi>
parents: 6037
diff changeset
213 return remove_count;
4932
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
214 }
f38f3f11a93f Added seq_range_array_remove_range()
Timo Sirainen <tss@iki.fi>
parents: 4687
diff changeset
215
6897
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
216 unsigned int seq_range_array_remove_seq_range(ARRAY_TYPE(seq_range) *dest,
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
217 const ARRAY_TYPE(seq_range) *src)
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
218 {
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
219 unsigned int ret = 0;
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
220 const struct seq_range *src_range;
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
221 unsigned int i, count;
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
222
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
223 src_range = array_get(src, &count);
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
224 for (i = 0; i < count; i++) {
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
225 ret += seq_range_array_remove_range(dest, src_range[i].seq1,
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
226 src_range[i].seq2);
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
227 }
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
228 return ret;
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
229 }
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
230
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
231 unsigned int
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
232 seq_range_array_remove_invert_range(ARRAY_TYPE(seq_range) *dest,
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
233 const ARRAY_TYPE(seq_range) *src)
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
234 {
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
235 const struct seq_range *src_range;
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
236 unsigned int i, count, ret = 0;
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
237 uint32_t last_seq = 0;
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
238
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
239 src_range = array_get(src, &count);
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
240 for (i = 0; i < count; i++) {
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
241 if (last_seq + 1 < src_range[i].seq1) {
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
242 ret += seq_range_array_remove_range(dest, last_seq + 1,
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
243 src_range[i].seq1 - 1);
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
244 }
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
245 last_seq = src_range[i].seq2;
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
246 }
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
247 if (last_seq != (uint32_t)-1) {
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
248 ret += seq_range_array_remove_range(dest, last_seq + 1,
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
249 (uint32_t)-1);
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
250 }
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
251 return ret;
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
252 }
0a3186f44dff Added seq_range_array_remove_seq_range() and
Timo Sirainen <tss@iki.fi>
parents: 6852
diff changeset
253
4687
c8b565e87966 seq_range_exists() can take a const pointer to the array.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
254 bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, uint32_t seq)
3716
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 {
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 unsigned int idx;
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 return seq_range_lookup(array, seq, &idx);
821035fdc9f6 Moved seq_range_*() functions to more generic ones in lib/.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 }
6758
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
260
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
261 void seq_range_array_invert(ARRAY_TYPE(seq_range) *array,
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
262 uint32_t min_seq, uint32_t max_seq)
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
263 {
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
264 struct seq_range *range, value;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
265 unsigned int i, count;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
266 uint32_t next_min_seq;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
267
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
268 if (array_is_created(array))
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
269 range = array_get_modifiable(array, &count);
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
270 else {
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
271 range = NULL;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
272 count = 0;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
273 }
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
274 if (count == 0) {
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
275 /* empty -> full */
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
276 if (!array_is_created(array))
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
277 i_array_init(array, 4);
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
278 value.seq1 = min_seq;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
279 value.seq2 = max_seq;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
280 array_append(array, &value, 1);
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
281 return;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
282 }
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
283 i_assert(range[0].seq1 >= min_seq);
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
284 i_assert(range[count-1].seq2 <= max_seq);
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
285
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
286 if (range[0].seq1 == min_seq && range[0].seq2 == max_seq) {
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
287 /* full -> empty */
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
288 array_clear(array);
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
289 return;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
290 }
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
291
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
292 for (i = 0; i < count; ) {
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
293 next_min_seq = range[i].seq2 + 1;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
294 if (range[i].seq1 == min_seq) {
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
295 array_delete(array, i, 1);
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
296 range = array_get_modifiable(array, &count);
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
297 } else {
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
298 range[i].seq2 = range[i].seq1 - 1;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
299 range[i].seq1 = min_seq;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
300 i++;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
301 }
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
302 min_seq = next_min_seq;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
303 }
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
304 if (min_seq <= max_seq) {
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
305 value.seq1 = min_seq;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
306 value.seq2 = max_seq;
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
307 array_append(array, &value, 1);
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
308 }
3896c75bfaa8 Added seq_range_array_invert()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
309 }