aboutsummaryrefslogtreecommitdiffstats
path: root/src/nmraii.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/nmraii.h')
-rw-r--r--src/nmraii.h51
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>;