seq-range-array.c revision e8ecd8f24ffc612f5d0be10f7931ac619f1eab88
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen/* Copyright (c) 2005 Timo Sirainen */
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenstatic bool seq_range_lookup(array_t *array, uint32_t seq, unsigned int *idx_r)
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* it's already in the range */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainenvoid seq_range_array_add(array_t *array, unsigned int init_count, uint32_t seq)
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* quick checks */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* grow last range */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* grow down first range */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* somewhere in the middle, array is sorted so find it with
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen binary search */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* idx == count couldn't happen because we already handle it above */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen i_assert(idx < count && data[idx].seq1 >= seq);
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen i_assert(data[idx].seq1 > seq || data[idx].seq2 < seq);
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen i_assert(idx+1 < count); /* already handled above */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainenvoid seq_range_array_remove(array_t *array, uint32_t seq)
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* quick checks */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen if (seq > data[count-1].seq2 || seq < data[0].seq1) {
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* outside the range */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* shrink last range */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* shrink up first range */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* somewhere in the middle, array is sorted so find it with
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen binary search */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* found it */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* a single sequence range.
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen remove it entirely */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* shrink the range */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* shrink the range */
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen /* split the sequence range */
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenbool seq_range_exists(array_t *array, uint32_t seq)
503a863a317acba125a4e46435694e35fad769e4Timo Sirainen unsigned int idx;