//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// CLObject.h: Defines the cl::Object class, which is the base class of all ANGLE CL objects.

#ifndef LIBANGLE_CLOBJECT_H_
#define LIBANGLE_CLOBJECT_H_

#include "common/log_utils.h"

#include <angle_cl.h>
#include <atomic>

namespace cl
{

class Object
{
  public:
    Object();
    virtual ~Object();

    cl_uint getRefCount() const noexcept { return mRefCount; }

    void retain() const noexcept { ++mRefCount; }

    bool release() const
    {
        if (mRefCount == 0u)
        {
            WARN() << "Unreferenced object without references";
            return true;
        }
        return --mRefCount == 0u;
    }

    template <typename T, typename... Args>
    static T *Create(Args &&...args)
    {
        T *object = new T(std::forward<Args>(args)...);
        return object;
    }

  private:
    mutable std::atomic<cl_uint> mRefCount;
};

}  // namespace cl

#endif  // LIBANGLE_CLCONTEXT_H_
