#pragma once

#include "Types.h"
#include "Type.h"

namespace ehs
{
    class BaseObj
    {
    private:
		Type* hierarchy;
		UInt_64 hierarchySize;

    public:
		virtual ~BaseObj();

        BaseObj();

		BaseObj(BaseObj&& base) noexcept;

        BaseObj(const BaseObj& base);

		BaseObj& operator=(BaseObj&& base) noexcept;

        BaseObj& operator=(const BaseObj& base);

        bool operator==(const BaseObj& base) const;

        bool operator!=(const BaseObj& base) const;

		const Type* GetHierarchy() const;

		UInt_64 GetHierarchySize() const;

		bool HasType(UInt_64 typeHashId) const;

		bool HasType(const Char_8* typeId) const;

        Type GetType() const;

		UInt_64 GetTypeIdSize() const;

        const Char_8* GetTypeId() const;

		UInt_64 GetTypeHashId() const;

        virtual BaseObj* Clone() const;

	protected:
		void AddType(const Char_8* id);
    };
}