0518 Signal&Connect&Disconnect

고도에 있는 시그널을 도입할 필요가 있다.

시그널이란, "오브젝트와 오브젝트 간의 소통."

// ================================================
// ================================================
// ================================================

*** 이거 구현하고 나면
    IViewport의 리사이징 콜백 부분 갈아끼우기 ******

// ================================================
// ================================================
// ================================================



    ** 참고로 왜 struct & std::variant로 정적이게 만들지 않냐면,,,
        애초에 스크립팅 때문에 이렇게 해야 하고,
        유저가 (C++인터페이스에서) 직접 만드는 시그널을 구현해야 하기 때문이다.



오브젝트 안에
    std::map<Signal, std::vector<IObject*>> m_connected_objects { };
가 있고,

void connect(const Signal& signal, IObject* object);
void disconnect(const Signal& signal, IObject* object);

가 있고,

오브젝트 안에 

    // 가상 함수로, 인터페이스로써 시그널 받기 가능.
    virtual void on_signal_received(const Signal& signal, const SignalArgs& args);

    // 강제로 그 오브젝트의 특정 시그널을 발산
    void emit(const Signal& signal, const SignalArgs& args);

즉, 오브젝트에서 시그널이 발산되려면
    for (auto& obj : m_connected_objects[특정시그널_키]){
        obj->on_signal_received([특정시그널_키], args);
    }


Signal은 다음과 같음.

struct Signal {
    IObject* source = nullptr;
    std::string description = "ERROR";
};

SignalArgs는 다음과 같음.

    using SignalArgs = std::vector<Variant>;

Variant는 다음과 같음.

    class Variant{ 
    private:
    union {
        bool b;
        int i;
        float f;
        double d;
        Vector2f v2;
        Vector3f v3;
        Vector4f v4;
        Matrix2f m2;
        Matrix3f m3;
        Matrix4f m4;
        std::string s;
    } m_data;

    PrimitiveType m_type;

    public:
        Variant() = delete;
        explicit Variant(bool value) : m_data.b(value), m_type(PrimitiveType::Boolean) {}
        explicit Variant(int value); ...
        explicit Variant(float value); ...
        ...
    public:
        const bool& get_boolean()const;
        const int& get_int()const;
        const float& get_float() const;
    public:
        const PrimitiveType& get_type() const;
    }