/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

#ifndef FLINK_TNEL_OBJECT_H
#define FLINK_TNEL_OBJECT_H

#include <string>
#include <mutex>
#include "nlohmann/json.hpp"
#include "core/include/common.h"

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
class Class;
class Object {
public:
    Object();

    Object(nlohmann::json jsonObj);

    virtual ~Object();

    virtual int hashCode();

    virtual bool equals(Object* obj);

    virtual std::string toString();

    virtual Object* clone();

    Object(const Object& obj);

    Object(Object&& obj);

    Object& operator=(const Object& obj);

    Object& operator=(Object&& obj);

    virtual void putRefCount();

    inline void getRefCount()
    {
        ++refCount;
    }

    void setRefCount(uint64_t count);

    bool isCloned();

    uint64_t getRefCountNumber();

    virtual void setValue(const std::string& value);

    virtual Class* getObjectClass();

    static Class* getClass();

public:
    std::recursive_mutex mutex;
    bool isClone = false;
    bool isPool = false;
    uint64_t refCount = 1;
};

namespace std {
template <>
struct hash<Object*> {
    std::size_t operator()(Object* nsPtr) const noexcept
    {
        return nsPtr->hashCode();
    }
};

template <>
struct equal_to<Object*> {
    bool operator()(Object* lhs, Object* rhs) const noexcept
    {
        return lhs->equals(rhs);
    }
};
} // namespace std

#endif // FLINK_TNEL_OBJECT_H