Newer
Older
libkcpp / modules / include / kcpp_object.hpp
/**
 * @file kcpp_object.h
 * @brief Kantan C++ Library Object ヘッダファイル。
 * @copyright  2001 - 2024  Nomura Kei
 * @depends
 *   kcpp.hpp
 */
#ifndef KCPP_OBJECT_HPP
#define KCPP_OBJECT_HPP

#include <memory>
#include <ostream>
#include <mutex>

#include <kcpp.hpp>

namespace kcpp
{

    class String;

    class Object
    {
    public:
        // デフォルトコンストラクタ
        Object() noexcept;

        // コピーコンストラクタ
        Object(const Object &obj) noexcept;

        // ムーブコンストラクタ
        Object(Object &&obj) noexcept;

        // デストラクタ
        virtual ~Object() noexcept = default;

        // コピー代入演算子
        Object &operator=(const Object &other) noexcept;

        // ムーブ代入演算子
        Object &operator=(Object &&obj) noexcept;

        // クラス名取得
        virtual String getClassName() const noexcept;

        // 文字列表現取得
        virtual String toString() const noexcept;

        // 同じクラスか否か
        virtual bool isSameClass(const Object &obj) const noexcept;

        // 比較
        virtual bool equals(const Object &obj) const noexcept;

        // ハッシュコード
        virtual int hashCode() const noexcept;

        // クローン
        virtual std::unique_ptr<Object> clone() const noexcept;

        // notify
        void notify();

        // notifyAll
        void notifyAll();

        // wait
        void wait();

        // wait
        void wait(int msec);

        // 出力用
        friend std::ostream &operator<<(std::ostream &os, const Object &obj);

    private:
        mutable std::mutex mtx;
        std::condition_variable cv;
    };

} // namespace kcpp

#endif // KCPP_OBJECT_HPP