Newer
Older
libj / include / j / lang / object.hpp
/**
 * @file object.hpp
 * @brief J Library Object ヘッダファイル。
 * @copyright  2001 - 2024  Nomura Kei
 * @depends
 *   j.hpp
 */
#ifndef J_LANG_OBJECT_HPP
#define J_LANG_OBJECT_HPP

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

#include <j.hpp>

namespace j
{
    namespace lang
    {

        class String;

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

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

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

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

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

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

            // 比較演算子
            bool operator==(const Object &obj) const noexcept;

            // 比較演算子(不等価演算子)
            bool operator!=(const Object &obj) const 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;

            // notify
            void notify();

            // notifyAll
            void notifyAll();

            // wait
            void wait();

            // wait
            void wait(int msec);

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

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

        private:
            // mutable をつけて、const メンバでも、mtx だけは変更を許可する。
            // 言語仕様的にいかがなものかとは思うが。。。
            mutable std::mutex mtx;

            std::condition_variable cv;
        };

    } // namespace lang
} // namespace j

#endif // J_LANG_OBJECT_HPP