#ifndef MXMINIAUDIO_H #define MXMINIAUDIO_H #include "mxtypes.h" #include #include #include template class MxMiniaudio { public: MxMiniaudio() : m_initialized(false) {} template ma_result Init(Fn p_init, Args&&... p_args) { assert(!m_initialized); ma_result result = p_init(std::forward(p_args)..., &m_object); if (result == MA_SUCCESS) { m_initialized = true; } return result; } template void Destroy(Fn p_uninit) { if (m_initialized) { p_uninit(&m_object); m_initialized = false; } } T* operator->() { assert(m_initialized); if (m_initialized) { return &m_object; } return nullptr; } operator T*() { assert(m_initialized); if (m_initialized) { return &m_object; } return nullptr; } explicit operator bool() { return m_initialized; } private: T m_object; bool m_initialized; }; #endif // MXMINIAUDIO_H