seq-range-array.c revision 8d80659e504ffb34bb0c6a633184fece35751b18
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn/* Copyright (c) 2005 Timo Sirainen */
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallynstatic bool seq_range_lookup(ARRAY_TYPE(seq_range) *array,
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn /* it's already in the range */
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallynvoid seq_range_array_add(ARRAY_TYPE(seq_range) *array,
1aad9e44d65e7c20dabc4c99f57bcf532db66c68Serge Hallyn ARRAY_CREATE(array, default_pool, struct seq_range, init_count);
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn /* quick checks */
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn /* grow last range */
4759162d078d86628956cae4846c6efccf548e67Serge Hallyn /* grow down first range */
9313e1e628160ca64f9e7fcec6500056c9a0725fStéphane Graber /* somewhere in the middle, array is sorted so find it with
f2a95ee1bf54c949614a68bf152ea9a8e1d3a172Stéphane Graber binary search */
f2a95ee1bf54c949614a68bf152ea9a8e1d3a172Stéphane Graber /* idx == count couldn't happen because we already handle it above */
f2a95ee1bf54c949614a68bf152ea9a8e1d3a172Stéphane Graber i_assert(idx < count && data[idx].seq1 >= seq);
f2a95ee1bf54c949614a68bf152ea9a8e1d3a172Stéphane Graber i_assert(data[idx].seq1 > seq || data[idx].seq2 < seq);
f2a95ee1bf54c949614a68bf152ea9a8e1d3a172Stéphane Graber i_assert(idx+1 < count); /* already handled above */
1aad9e44d65e7c20dabc4c99f57bcf532db66c68Serge Hallynvoid seq_range_array_remove(ARRAY_TYPE(seq_range) *array, uint32_t seq)
0a3673e80732ab83d807d406fb2fd3c3b7f54ad3Stéphane Graber unsigned int idx, left_idx, right_idx, count;
0a3673e80732ab83d807d406fb2fd3c3b7f54ad3Stéphane Graber /* quick checks */
542939c31bb73bab55f2fd71243b98f5559597d1Stéphane Graber if (seq > data[count-1].seq2 || seq < data[0].seq1) {
42ff5f0f8767114d060f5031055038a1a1c3759aSerge Hallyn /* outside the range */
68c36a303f402b52f94067d3da7b168e274001a7Serge Hallyn /* shrink last range */
5ff337745e4a705293b056ab58f6ea7a92cabbc8Stéphane Graber if (data[count-1].seq1 != data[count-1].seq2)
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn /* shrink up first range */
3f5f5d99b0ea1c204699b13d4a0caf4d9e745449Stéphane Graber /* somewhere in the middle, array is sorted so find it with
4759162d078d86628956cae4846c6efccf548e67Serge Hallyn binary search */
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn /* found it */
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn /* a single sequence range.
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn remove it entirely */
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn /* shrink the range */
f8b2a49ce0bb7ce66d0c902b5976a48e49f754b2Stéphane Graber /* shrink the range */
65d8ae9c4a66f5ca85289c02dc06d63261c84619Scott Moser /* split the sequence range */
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallynbool seq_range_exists(ARRAY_TYPE(seq_range) *array, uint32_t seq)
d1458ac8d13880f83fa2d1e08623b97c50d311d7Serge Hallyn unsigned int idx;