blob: 5512a0b4718e8f6abd6c547ebb90d9ca1d97831e [file] [log] [blame]
#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