| #pragma once | |
| #include "rive/rive_types.hpp" | |
| #ifdef RIVE_BUILD_FOR_APPLE | |
| #if defined(RIVE_BUILD_FOR_OSX) | |
| #include <ApplicationServices/ApplicationServices.h> | |
| #elif defined(RIVE_BUILD_FOR_IOS) | |
| #include <CoreFoundation/CoreFoundation.h> | |
| #endif | |
| template <typename T> class AutoCF | |
| { | |
| T m_obj; | |
| public: | |
| AutoCF(T obj = nullptr) : m_obj(obj) {} | |
| AutoCF(const AutoCF& other) | |
| { | |
| if (other.m_obj) | |
| { | |
| CFRetain(other.m_obj); | |
| } | |
| m_obj = other.m_obj; | |
| } | |
| AutoCF(AutoCF&& other) | |
| { | |
| m_obj = other.m_obj; | |
| other.m_obj = nullptr; | |
| } | |
| ~AutoCF() | |
| { | |
| if (m_obj) | |
| { | |
| CFRelease(m_obj); | |
| } | |
| } | |
| AutoCF& operator=(const AutoCF& other) | |
| { | |
| if (m_obj != other.m_obj) | |
| { | |
| if (other.m_obj) | |
| { | |
| CFRetain(other.m_obj); | |
| } | |
| if (m_obj) | |
| { | |
| CFRelease(m_obj); | |
| } | |
| m_obj = other.m_obj; | |
| } | |
| return *this; | |
| } | |
| void reset(T obj) | |
| { | |
| if (obj != m_obj) | |
| { | |
| if (m_obj) | |
| { | |
| CFRelease(m_obj); | |
| } | |
| m_obj = obj; | |
| } | |
| } | |
| operator T() const { return m_obj; } | |
| operator bool() const { return m_obj != nullptr; } | |
| T get() const { return m_obj; } | |
| }; | |
| #endif // RIVE_BUILD_FOR_APPLE |