diff options
| author | Danilo M. <danix@danix.xyz> | 2026-08-02 17:52:17 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-08-04 12:52:33 +0200 |
| commit | 9002b3bf4310f6a657d27a1f16f002c2d256e79d (patch) | |
| tree | 843d0f8de1a3c7d641a76de592a7218d0072a798 /src/nmraii.h | |
| parent | b09a44173e8671cbf25aff7db73b34f947ed49cf (diff) | |
| download | qtmaildir-9002b3bf4310f6a657d27a1f16f002c2d256e79d.tar.gz qtmaildir-9002b3bf4310f6a657d27a1f16f002c2d256e79d.zip | |
feat: add cross-thread value types and notmuch RAII wrappers
ThreadSummary, MessageRef, and TagChange are plain-value structs that
carry query results across the worker/UI thread boundary via queued
signals. NmHandle<T, Destroy> wraps libnotmuch's C handles (query,
threads, messages, thread, message, tags) so early returns in the
query paths can't leak.
Diffstat (limited to 'src/nmraii.h')
| -rw-r--r-- | src/nmraii.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/nmraii.h b/src/nmraii.h new file mode 100644 index 0000000..22ad4ae --- /dev/null +++ b/src/nmraii.h @@ -0,0 +1,51 @@ +#pragma once + +#include <notmuch.h> + +#include <utility> + +/// Generic owner for a notmuch handle with a destroy function. +template <typename T, void (*Destroy)(T *)> +class NmHandle +{ +public: + NmHandle() = default; + explicit NmHandle(T *handle) : m_handle(handle) {} + + ~NmHandle() { reset(); } + + NmHandle(const NmHandle &) = delete; + NmHandle &operator=(const NmHandle &) = delete; + + NmHandle(NmHandle &&other) noexcept + : m_handle(std::exchange(other.m_handle, nullptr)) {} + + NmHandle &operator=(NmHandle &&other) noexcept + { + if (this != &other) { + reset(); + m_handle = std::exchange(other.m_handle, nullptr); + } + return *this; + } + + void reset(T *handle = nullptr) + { + if (m_handle) + Destroy(m_handle); + m_handle = handle; + } + + T *get() const { return m_handle; } + explicit operator bool() const { return m_handle != nullptr; } + +private: + T *m_handle = nullptr; +}; + +using NmQuery = NmHandle<notmuch_query_t, notmuch_query_destroy>; +using NmThreads = NmHandle<notmuch_threads_t, notmuch_threads_destroy>; +using NmMessages = NmHandle<notmuch_messages_t, notmuch_messages_destroy>; +using NmThread = NmHandle<notmuch_thread_t, notmuch_thread_destroy>; +using NmMessage = NmHandle<notmuch_message_t, notmuch_message_destroy>; +using NmTags = NmHandle<notmuch_tags_t, notmuch_tags_destroy>; |
