/src/dovecot/src/lib/seq-range-array.h
Line | Count | Source |
1 | | #ifndef SEQ_RANGE_ARRAY_H |
2 | | #define SEQ_RANGE_ARRAY_H |
3 | | |
4 | | /* NOTE: A full 0..UINT_MAX sequence range isn't valid to use here, because its |
5 | | size would become UINT_MAX+1, which can't be returned by e.g. |
6 | | seq_range_count() and similar functions. Attempting to use such sequence |
7 | | ranges will result in assert-crash. */ |
8 | | |
9 | | struct seq_range { |
10 | | uint32_t seq1, seq2; |
11 | | }; |
12 | | ARRAY_DEFINE_TYPE(seq_range, struct seq_range); |
13 | | |
14 | | struct seq_range_iter { |
15 | | const ARRAY_TYPE(seq_range) *array; |
16 | | unsigned int prev_n, prev_idx; |
17 | | }; |
18 | | |
19 | | static inline uint32_t ATTR_PURE seq_range_length(const struct seq_range *range) |
20 | 0 | { |
21 | 0 | i_assert(range->seq2 >= range->seq1); |
22 | 0 | i_assert(range->seq1 > 0 || range->seq2 < (uint32_t)-1); |
23 | 0 | return range->seq2 - range->seq1 + 1; |
24 | 0 | } Unexecuted instantiation: testsuite-common.c:seq_range_length Unexecuted instantiation: testsuite-objects.c:seq_range_length Unexecuted instantiation: testsuite-message.c:seq_range_length Unexecuted instantiation: testsuite-mailstore.c:seq_range_length Unexecuted instantiation: cmd-test-message.c:seq_range_length Unexecuted instantiation: sieve-message.c:seq_range_length Unexecuted instantiation: sieve-storage-sync.c:seq_range_length Unexecuted instantiation: sieve-rusage.c:seq_range_length Unexecuted instantiation: sieve-interpreter.c:seq_range_length Unexecuted instantiation: sieve-result.c:seq_range_length Unexecuted instantiation: sieve-actions.c:seq_range_length Unexecuted instantiation: tst-size.c:seq_range_length Unexecuted instantiation: cmd-redirect.c:seq_range_length Unexecuted instantiation: sieve-file-storage.c:seq_range_length Unexecuted instantiation: tag-flags.c:seq_range_length Unexecuted instantiation: tag-mailbox-create.c:seq_range_length Unexecuted instantiation: tst-mailboxexists.c:seq_range_length Unexecuted instantiation: tst-duplicate.c:seq_range_length Unexecuted instantiation: tag-index.c:seq_range_length Unexecuted instantiation: ext-metadata.c:seq_range_length Unexecuted instantiation: tst-metadata.c:seq_range_length Unexecuted instantiation: tst-metadataexists.c:seq_range_length Unexecuted instantiation: tag-mime.c:seq_range_length Unexecuted instantiation: tag-specialuse.c:seq_range_length Unexecuted instantiation: tst-specialuse-exists.c:seq_range_length Unexecuted instantiation: tag-redirect-list.c:seq_range_length Unexecuted instantiation: edit-mail.c:seq_range_length Unexecuted instantiation: mail-raw.c:seq_range_length Unexecuted instantiation: cmd-vacation.c:seq_range_length Unexecuted instantiation: ext-imap4flags-common.c:seq_range_length Unexecuted instantiation: ext-body-common.c:seq_range_length Unexecuted instantiation: ntfy-mailto.c:seq_range_length Unexecuted instantiation: ext-spamvirustest-common.c:seq_range_length Unexecuted instantiation: cmd-addheader.c:seq_range_length Unexecuted instantiation: cmd-deleteheader.c:seq_range_length Unexecuted instantiation: ext-extlists-common.c:seq_range_length Unexecuted instantiation: cmd-report.c:seq_range_length Unexecuted instantiation: sieve-tool.c:seq_range_length Unexecuted instantiation: index-mail-binary.c:seq_range_length Unexecuted instantiation: index-mail.c:seq_range_length Unexecuted instantiation: index-storage.c:seq_range_length Unexecuted instantiation: index-thread.c:seq_range_length Unexecuted instantiation: index-transaction.c:seq_range_length Unexecuted instantiation: istream-mail.c:seq_range_length Unexecuted instantiation: mail-cache-decisions.c:seq_range_length Unexecuted instantiation: mail-cache-fields.c:seq_range_length Unexecuted instantiation: mail-cache-lookup.c:seq_range_length Unexecuted instantiation: mail-cache-purge.c:seq_range_length Unexecuted instantiation: mail-cache-transaction.c:seq_range_length Unexecuted instantiation: mail-cache.c:seq_range_length Unexecuted instantiation: mail-index-alloc-cache.c:seq_range_length Unexecuted instantiation: mail-index-fsck.c:seq_range_length Unexecuted instantiation: mail-index-lock.c:seq_range_length Unexecuted instantiation: mail-index-map.c:seq_range_length Unexecuted instantiation: mail-index-modseq.c:seq_range_length Unexecuted instantiation: mail-index-strmap.c:seq_range_length Unexecuted instantiation: mail-index-sync.c:seq_range_length Unexecuted instantiation: mail-index-transaction-finish.c:seq_range_length Unexecuted instantiation: mail-index-transaction-sort-appends.c:seq_range_length Unexecuted instantiation: mail-index-transaction-update.c:seq_range_length Unexecuted instantiation: mail-index-transaction-view.c:seq_range_length Unexecuted instantiation: mail-index-transaction.c:seq_range_length Unexecuted instantiation: mail-index-util.c:seq_range_length Unexecuted instantiation: mail-index-view-sync.c:seq_range_length Unexecuted instantiation: mail-index-view.c:seq_range_length Unexecuted instantiation: mail-index-write.c:seq_range_length Unexecuted instantiation: mail-index.c:seq_range_length Unexecuted instantiation: mail-namespace.c:seq_range_length Unexecuted instantiation: mail-search-build.c:seq_range_length Unexecuted instantiation: mail-search-register.c:seq_range_length Unexecuted instantiation: mail-search.c:seq_range_length Unexecuted instantiation: mail-storage-hooks.c:seq_range_length Unexecuted instantiation: mail-storage-service.c:seq_range_length Unexecuted instantiation: mail-storage-settings.c:seq_range_length Unexecuted instantiation: mail-storage.c:seq_range_length Unexecuted instantiation: mail-transaction-log-append.c:seq_range_length Unexecuted instantiation: mail-transaction-log-file.c:seq_range_length Unexecuted instantiation: mail-transaction-log-modseq.c:seq_range_length Unexecuted instantiation: mail-transaction-log-view.c:seq_range_length Unexecuted instantiation: mail-transaction-log.c:seq_range_length Unexecuted instantiation: mail-user.c:seq_range_length Unexecuted instantiation: mail.c:seq_range_length Unexecuted instantiation: mailbox-attribute.c:seq_range_length Unexecuted instantiation: mailbox-get.c:seq_range_length Unexecuted instantiation: mailbox-guid-cache.c:seq_range_length Unexecuted instantiation: mailbox-header.c:seq_range_length Unexecuted instantiation: mailbox-keywords.c:seq_range_length Unexecuted instantiation: mailbox-list-iter.c:seq_range_length Unexecuted instantiation: mailbox-list-subscriptions.c:seq_range_length Unexecuted instantiation: mailbox-list.c:seq_range_length Unexecuted instantiation: mailbox-recent-flags.c:seq_range_length Unexecuted instantiation: mailbox-search-result.c:seq_range_length Unexecuted instantiation: mailbox-watch.c:seq_range_length Unexecuted instantiation: raw-storage.c:seq_range_length Unexecuted instantiation: raw-sync.c:seq_range_length Unexecuted instantiation: shared-list.c:seq_range_length Unexecuted instantiation: shared-storage.c:seq_range_length Unexecuted instantiation: subscription-file.c:seq_range_length Unexecuted instantiation: imap-metadata.c:seq_range_length Unexecuted instantiation: fail-mailbox.c:seq_range_length Unexecuted instantiation: imapc-list.c:seq_range_length Unexecuted instantiation: imapc-storage.c:seq_range_length Unexecuted instantiation: imapc-sync.c:seq_range_length Unexecuted instantiation: index-attachment.c:seq_range_length Unexecuted instantiation: index-attribute.c:seq_range_length Unexecuted instantiation: index-mail-headers.c:seq_range_length Unexecuted instantiation: index-mailbox-size.c:seq_range_length Unexecuted instantiation: index-pop3-uidl.c:seq_range_length Unexecuted instantiation: index-search.c:seq_range_length Unexecuted instantiation: index-sort.c:seq_range_length Unexecuted instantiation: index-status.c:seq_range_length Unexecuted instantiation: index-sync-pvt.c:seq_range_length Unexecuted instantiation: index-sync.c:seq_range_length Unexecuted instantiation: index-thread-finish.c:seq_range_length Unexecuted instantiation: index-thread-links.c:seq_range_length Unexecuted instantiation: mail-cache-sync-update.c:seq_range_length Unexecuted instantiation: mail-copy.c:seq_range_length Unexecuted instantiation: mail-index-dummy-view.c:seq_range_length Unexecuted instantiation: mail-index-map-read.c:seq_range_length Unexecuted instantiation: mail-index-sync-update.c:seq_range_length Unexecuted instantiation: mail-index-transaction-export.c:seq_range_length Unexecuted instantiation: mail-search-args-simplify.c:seq_range_length Unexecuted instantiation: mail-search-mime-register.c:seq_range_length Unexecuted instantiation: mail-search-mime.c:seq_range_length Unexecuted instantiation: mail-search-register-human.c:seq_range_length Unexecuted instantiation: mail-search-register-imap.c:seq_range_length Unexecuted instantiation: mail-storage-register.c:seq_range_length Unexecuted instantiation: mailbox-attribute-internal.c:seq_range_length Unexecuted instantiation: mailbox-list-fs.c:seq_range_length Unexecuted instantiation: mailbox-list-index-backend.c:seq_range_length Unexecuted instantiation: mailbox-list-index-status.c:seq_range_length Unexecuted instantiation: mailbox-list-index-sync.c:seq_range_length Unexecuted instantiation: mailbox-list-index.c:seq_range_length Unexecuted instantiation: mailbox-list-maildir.c:seq_range_length Unexecuted instantiation: mailbox-list-none.c:seq_range_length Unexecuted instantiation: maildir-storage.c:seq_range_length Unexecuted instantiation: maildir-sync-index.c:seq_range_length Unexecuted instantiation: maildir-sync.c:seq_range_length Unexecuted instantiation: maildir-uidlist.c:seq_range_length Unexecuted instantiation: maildir-util.c:seq_range_length Unexecuted instantiation: mbox-storage.c:seq_range_length Unexecuted instantiation: mbox-sync-list-index.c:seq_range_length Unexecuted instantiation: mbox-sync.c:seq_range_length Unexecuted instantiation: mdbox-deleted-storage.c:seq_range_length Unexecuted instantiation: mdbox-file.c:seq_range_length Unexecuted instantiation: mdbox-mail.c:seq_range_length Unexecuted instantiation: mdbox-map.c:seq_range_length Unexecuted instantiation: mdbox-purge.c:seq_range_length Unexecuted instantiation: mdbox-save.c:seq_range_length Unexecuted instantiation: mdbox-settings.c:seq_range_length Unexecuted instantiation: mdbox-storage-rebuild.c:seq_range_length Unexecuted instantiation: mdbox-storage.c:seq_range_length Unexecuted instantiation: mdbox-sync.c:seq_range_length Unexecuted instantiation: pop3c-storage.c:seq_range_length Unexecuted instantiation: pop3c-sync.c:seq_range_length Unexecuted instantiation: raw-mail.c:seq_range_length Unexecuted instantiation: sdbox-storage.c:seq_range_length Unexecuted instantiation: sdbox-sync.c:seq_range_length Unexecuted instantiation: dbox-file-fix.c:seq_range_length Unexecuted instantiation: dbox-file.c:seq_range_length Unexecuted instantiation: dbox-mail.c:seq_range_length Unexecuted instantiation: dbox-save.c:seq_range_length Unexecuted instantiation: dbox-storage.c:seq_range_length Unexecuted instantiation: fail-mail-storage.c:seq_range_length Unexecuted instantiation: fail-mail.c:seq_range_length Unexecuted instantiation: imapc-attribute.c:seq_range_length Unexecuted instantiation: imapc-connection.c:seq_range_length Unexecuted instantiation: imapc-mail-fetch.c:seq_range_length Unexecuted instantiation: imapc-mail.c:seq_range_length Unexecuted instantiation: imapc-mailbox.c:seq_range_length Unexecuted instantiation: imapc-save.c:seq_range_length Unexecuted instantiation: imapc-search.c:seq_range_length Unexecuted instantiation: index-rebuild.c:seq_range_length Unexecuted instantiation: index-search-mime.c:seq_range_length Unexecuted instantiation: index-sort-string.c:seq_range_length Unexecuted instantiation: index-sync-changes.c:seq_range_length Unexecuted instantiation: index-sync-search.c:seq_range_length Unexecuted instantiation: mail-index-map-hdr.c:seq_range_length Unexecuted instantiation: mail-index-sync-ext.c:seq_range_length Unexecuted instantiation: mail-index-sync-keywords.c:seq_range_length Unexecuted instantiation: mail-search-args-imap.c:seq_range_length Unexecuted instantiation: mail-search-mime-build.c:seq_range_length Unexecuted instantiation: mail-storage-list-index-rebuild.c:seq_range_length Unexecuted instantiation: mailbox-list-delete.c:seq_range_length Unexecuted instantiation: mailbox-list-fs-flags.c:seq_range_length Unexecuted instantiation: mailbox-list-fs-iter.c:seq_range_length Unexecuted instantiation: mailbox-list-index-iter.c:seq_range_length Unexecuted instantiation: mailbox-list-index-notify.c:seq_range_length Unexecuted instantiation: mailbox-list-maildir-iter.c:seq_range_length Unexecuted instantiation: mailbox-list-notify-tree.c:seq_range_length Unexecuted instantiation: maildir-copy.c:seq_range_length Unexecuted instantiation: maildir-filename-flags.c:seq_range_length Unexecuted instantiation: maildir-filename.c:seq_range_length Unexecuted instantiation: maildir-keywords.c:seq_range_length Unexecuted instantiation: maildir-mail.c:seq_range_length Unexecuted instantiation: maildir-save.c:seq_range_length Unexecuted instantiation: mbox-file.c:seq_range_length Unexecuted instantiation: mbox-lock.c:seq_range_length Unexecuted instantiation: mbox-mail.c:seq_range_length Unexecuted instantiation: mbox-save.c:seq_range_length Unexecuted instantiation: mbox-sync-parse.c:seq_range_length Unexecuted instantiation: mbox-sync-rewrite.c:seq_range_length Unexecuted instantiation: mbox-sync-update.c:seq_range_length Unexecuted instantiation: pop3c-mail.c:seq_range_length Unexecuted instantiation: sdbox-copy.c:seq_range_length Unexecuted instantiation: sdbox-file.c:seq_range_length Unexecuted instantiation: sdbox-mail.c:seq_range_length Unexecuted instantiation: sdbox-save.c:seq_range_length Unexecuted instantiation: sdbox-settings.c:seq_range_length Unexecuted instantiation: sdbox-sync-rebuild.c:seq_range_length Unexecuted instantiation: dbox-attachment.c:seq_range_length Unexecuted instantiation: index-search-result.c:seq_range_length Unexecuted instantiation: imap-seqset.c:seq_range_length Unexecuted instantiation: imap-util.c:seq_range_length Unexecuted instantiation: seq-range-array.c:seq_range_length |
25 | | |
26 | | /* Add sequence to range. If the array isn't created yet, create it with |
27 | | initial size of init_count. */ |
28 | | bool ATTR_NOWARN_UNUSED_RESULT |
29 | | seq_range_array_add(ARRAY_TYPE(seq_range) *array, uint32_t seq); |
30 | | /* Like seq_range_array_add(), but if the array isn't already initialized do |
31 | | it with i_array_init(). */ |
32 | | void seq_range_array_add_with_init(ARRAY_TYPE(seq_range) *array, |
33 | | unsigned int init_count, uint32_t seq); |
34 | | void seq_range_array_add_range(ARRAY_TYPE(seq_range) *array, |
35 | | uint32_t seq1, uint32_t seq2); |
36 | | unsigned int seq_range_array_add_range_count(ARRAY_TYPE(seq_range) *array, |
37 | | uint32_t seq1, uint32_t seq2); |
38 | | void seq_range_array_merge(ARRAY_TYPE(seq_range) *dest, |
39 | | const ARRAY_TYPE(seq_range) *src); |
40 | | /* Merge the first n sequences from src into dest. */ |
41 | | void seq_range_array_merge_n(ARRAY_TYPE(seq_range) *dest, |
42 | | const ARRAY_TYPE(seq_range) *src, |
43 | | unsigned int count); |
44 | | /* Remove the given sequence from range. Returns TRUE if it was found. */ |
45 | | bool ATTR_NOWARN_UNUSED_RESULT |
46 | | seq_range_array_remove(ARRAY_TYPE(seq_range) *array, uint32_t seq); |
47 | | /* Remove a sequence range. Returns number of sequences actually removed. */ |
48 | | unsigned int ATTR_NOWARN_UNUSED_RESULT |
49 | | seq_range_array_remove_range(ARRAY_TYPE(seq_range) *array, |
50 | | uint32_t seq1, uint32_t seq2); |
51 | | unsigned int ATTR_NOWARN_UNUSED_RESULT |
52 | | seq_range_array_remove_seq_range(ARRAY_TYPE(seq_range) *dest, |
53 | | const ARRAY_TYPE(seq_range) *src); |
54 | | /* Remove count number of sequences from the nth sequence (0 = first). */ |
55 | | void seq_range_array_remove_nth(ARRAY_TYPE(seq_range) *array, |
56 | | uint32_t n, uint32_t count); |
57 | | /* Remove sequences from dest that don't exist in src. */ |
58 | | unsigned int ATTR_NOWARN_UNUSED_RESULT |
59 | | seq_range_array_intersect(ARRAY_TYPE(seq_range) *dest, |
60 | | const ARRAY_TYPE(seq_range) *src); |
61 | | /* Returns TRUE if sequence exists in the range. */ |
62 | | bool seq_range_exists(const ARRAY_TYPE(seq_range) *array, |
63 | | uint32_t seq) ATTR_PURE; |
64 | | /* Returns TRUE if arrays have common sequences. */ |
65 | | bool seq_range_array_have_common(const ARRAY_TYPE(seq_range) *array1, |
66 | | const ARRAY_TYPE(seq_range) *array2) ATTR_PURE; |
67 | | /* Return number of sequences in the range. */ |
68 | | unsigned int seq_range_count(const ARRAY_TYPE(seq_range) *array) ATTR_PURE; |
69 | | |
70 | | /* Invert the sequence range. For example 5:6 -> min_seq:4,7:max_seq. |
71 | | The array must not have any sequences outside min_seq..max_seq or this |
72 | | function will assert-crash. */ |
73 | | void seq_range_array_invert(ARRAY_TYPE(seq_range) *array, |
74 | | uint32_t min_seq, uint32_t max_seq); |
75 | | |
76 | | void seq_range_array_iter_init(struct seq_range_iter *iter_r, |
77 | | const ARRAY_TYPE(seq_range) *array); |
78 | | /* Get the nth sequence (0 = first). Returns FALSE if idx is too large. */ |
79 | | bool seq_range_array_iter_nth(struct seq_range_iter *iter, unsigned int n, |
80 | | uint32_t *seq_r); |
81 | | |
82 | | #endif |