#include "Tool/RefObject.h"

RefObject::RefObject()
    : ref_count_(0) // 修正：新创建对象引用计数应为1
{
}

RefObject::~RefObject() {}

void RefObject::Retain()
{
    // 修正：使用fetch_add确保原子操作
    ref_count_.fetch_add(1, std::memory_order_relaxed);
}

void RefObject::Release()
{
    // 修正：使用fetch_sub确保原子操作并检查结果
    if (ref_count_.fetch_sub(1, std::memory_order_acq_rel) == 1)
    {
        delete this;
    }
}

uint32_t RefObject::GetRefCount() const
{
    return ref_count_.load(std::memory_order_relaxed);
}

void *RefObject::operator new(size_t size)
{
    void *ptr = memory::Alloc(size);
    if (!ptr)
    {
        throw std::bad_alloc();
    }
    return ptr;
}

void RefObject::operator delete(void *ptr)
{
    if (ptr) // 增加空指针检查
    {
        memory::Free(ptr);
    }
}

// 修正：添加noexcept说明符，与声明一致
void *RefObject::operator new(size_t size, std::nothrow_t const &) noexcept
{
    try
    {
        return memory::Alloc(size);
    }
    catch (...)
    {
        return nullptr;
    }
}

// 修正：添加noexcept说明符，与声明一致
void RefObject::operator delete(void *ptr, std::nothrow_t const &) noexcept
{
    if (ptr) // 增加空指针检查
    {
        try
        {
            memory::Free(ptr);
        }
        catch (...)
        {
            // 忽略异常，符合noexcept语义
        }
    }
}

// 修正：添加noexcept说明符，与声明一致
void *RefObject::operator new(size_t size, void *ptr) noexcept
{
    return ::operator new(size, ptr);
}

void RefObject::operator delete(void *ptr, void *place) noexcept
{
    ::operator delete(ptr, place);
}
