#pragma once
#include "cstring"
#include "cstddef"
#include "exception"

/* Size=0x8 */
struct __type_info_node {
    void *_MemPtr; // 0x0
    __type_info_node *_Next; // 0x4
};

namespace std {
    /* Size=0xc */
    class type_info {
    public:
        virtual ~type_info();
        //   public: virtual void* __vecDelDtor(uint32_t);

        unsigned int hash_code() const;
        bool operator==(const type_info &rhs) const;
        bool operator!=(const type_info &rhs) const;
        int before(const type_info &rhs) const;
        const char *name(__type_info_node *n) const { return _Name_base(this, n); }
        const char *raw_name() const;

    private:
        type_info(const type_info &);
        type_info &operator=(const type_info &);

        static const char *_Name_base(const type_info *, __type_info_node *);
        static void _Type_info_dtor(type_info *);

        void *_M_data; // 0x4
        char _M_d_name[1]; // 0x8
    };

    class bad_cast : public exception {
    public:
        virtual ~bad_cast() {}
        virtual const char *what() const { return "bad_cast"; }
    };

    class bad_typeid : public exception {
    public:
        virtual ~bad_typeid() {}
        virtual const char *what() const { return "bad_typeid"; }
    };

}
