void index_mailbox_set_recent_uid(struct mailbox *box, uint32_t uid) { struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box); if (uid <= ibox->recent_flags_prev_uid) { if (seq_range_exists(&ibox->recent_flags, uid)) return; mail_storage_set_critical(box->storage, "Recent flags state corrupted for mailbox %s", box->vname); array_clear(&ibox->recent_flags); ibox->recent_flags_count = 0; } ibox->recent_flags_prev_uid = uid; seq_range_array_add_with_init(&ibox->recent_flags, 64, uid); ibox->recent_flags_count++; }
static void test_seq_range_array_invert(void) { static const unsigned int input_min = 1, input_max = 5; static const unsigned int input[] = { 1, 2, 3, 4, 5, UINT_MAX, 2, 3, 4, UINT_MAX, 1, 2, 4, 5, UINT_MAX, 1, 3, 5, UINT_MAX, 1, UINT_MAX, 5, UINT_MAX, UINT_MAX }; ARRAY_TYPE(seq_range) range = ARRAY_INIT; unsigned int i, j, seq, start, num; bool old_exists, success; for (i = num = 0; input[i] != UINT_MAX; num++, i++) { success = TRUE; start = i; for (; input[i] != UINT_MAX; i++) { seq_range_array_add_with_init(&range, 32, input[i]); for (j = start; j < i; j++) { if (!seq_range_exists(&range, input[j])) success = FALSE; } } seq_range_array_invert(&range, input_min, input_max); for (seq = input_min; seq <= input_max; seq++) { for (j = start; input[j] != UINT_MAX; j++) { if (input[j] == seq) break; } old_exists = input[j] != UINT_MAX; if (seq_range_exists(&range, seq) == old_exists) success = FALSE; } test_out(t_strdup_printf("seq_range_array_invert(%u)", num), success); array_free(&range); } }