/** * @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 /* Object を継承したクラスを HashMap のキーに利用する場合、下記実装が必要。 Object で記載しようとしたが、operator== 引数には Object の参照が渡ってくるため、 下位クラスの equals, hashCode 等を利用できず断念。 namespace std { // For j::util::HashMap (std::unordered_map) template <> struct hash<j::lang::Object> { std::size_t operator()(const j::lang::Object &obj) const { return static_cast<std::size_t>(obj.hashCode()); } }; } */ #endif // J_LANG_OBJECT_HPP