///////////////////////////////////////////////////////////////////////////////
// Name: gtk/private/variant.h
// Purpose: RAII wrapper for working with GVariant
// Author: Vadim Zeitlin
// Created: 2024-04-11
// Copyright: (c) 2024 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#ifndef _WX_GTK_PRIVATE_VARIANT_H_
#define _WX_GTK_PRIVATE_VARIANT_H_
// ----------------------------------------------------------------------------
// wxGtkVariant: RAII wrapper for GVariant
// ----------------------------------------------------------------------------
class wxGtkVariant
{
public:
wxGtkVariant() = default;
explicit wxGtkVariant(GVariant* variant) : m_variant(variant) { }
wxGtkVariant(wxGtkVariant&& other) noexcept
: m_variant(other.m_variant)
{
other.m_variant = nullptr;
}
wxGtkVariant& operator=(wxGtkVariant&& other) noexcept
{
if ( this != &other )
{
m_variant = other.m_variant;
other.m_variant = nullptr;
}
return *this;
}
~wxGtkVariant()
{
if ( m_variant )
g_variant_unref(m_variant);
}
// Check if we have a valid GVariant.
explicit operator bool() const { return m_variant != nullptr; }
// Return the pointer to the internally stored pointer. This should only be
// used to initialize the object by passing it to some GTK function.
GVariant **ByRef()
{
wxASSERT_MSG( !m_variant, "shouldn't be already initialized" );
return &m_variant;
}
// Wrappers for a few functions used in our code.
guint32 GetUint32() const { return g_variant_get_uint32(m_variant); }
wxGtkVariant GetVariant() const { return wxGtkVariant{g_variant_get_variant(m_variant)}; }
// Wrapper for generic g_variant_get(): this is still as type-unsafe as the
// original C function.
template <typename... Args>
void Get(const gchar* format_string, Args*... args) const
{
g_variant_get(m_variant, format_string, args...);
}
// Yield ownership of the GVariant to the caller.
GVariant* Release()
{
GVariant* const variant = m_variant;
m_variant = nullptr;
return variant;
}
private:
GVariant* m_variant = nullptr;
// For now we just don't support copying at all for simplicity, it could be
// implemented later if needed.
wxDECLARE_NO_COPY_CLASS(wxGtkVariant);
};
#endif // _WX_GTK_PRIVATE_VARIANT_H_