From 1e8c6df7b99f1db7aa38c91c885ed9866c9a7873 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 31 Oct 2018 10:05:15 -0700 Subject: [PATCH] Add a C++ ContextRef helper to manage a ALCcontext reference --- OpenAL32/Include/alMain.h | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index 0fd77491..b3380ae2 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -914,7 +914,41 @@ int EventThread(void *arg); vector_al_string SearchDataFiles(const char *match, const char *subdir); #ifdef __cplusplus -} +} // extern "C" + +/* Simple RAII context reference. Takes the reference of the provided + * ALCcontext, and decrements it when leaving scope. Movable (transfer + * reference) but not copyable (no new references). + */ +class ContextRef { + ALCcontext *mCtx{nullptr}; + + void release() noexcept + { + if(mCtx) + ALCcontext_DecRef(mCtx); + mCtx = nullptr; + } + +public: + ContextRef() noexcept = default; + explicit ContextRef(ALCcontext *ctx) noexcept : mCtx(ctx) { } + ~ContextRef() { release(); } + + ContextRef& operator=(const ContextRef&) = delete; + ContextRef& operator=(ContextRef&& rhs) noexcept + { + release(); + mCtx = rhs.mCtx; + rhs.mCtx = nullptr; + return *this; + } + + operator bool() const noexcept { return static_cast(mCtx); } + + ALCcontext* operator->() noexcept { return mCtx; } + ALCcontext* get() noexcept { return mCtx; } +}; #endif #endif