#pragma once #include #include #include #include namespace commons::protocol { enum class Type { DRAW_RECTANGLE = 0, DRAW_PIXEL, COMPOSED_MESSAGE, }; struct header { Type type; uint32_t message_length; }; struct generic_message_base { virtual constexpr Type get_type() const = 0; virtual uint32_t get_size() const = 0; //virtual void operator()() //{ // if(is_handler) // { // handle_message(); // return; // } // create_message(); //} //virtual void handle_message() = 0; //virtual void create_message() = 0; bool is_handler = false; }; template struct generic_message : public generic_message_base { virtual ~generic_message() = default; virtual constexpr Type get_type() const override { return type; } virtual header get_header() const { return header{get_type(), get_size()}; } static constexpr Type type = TypeValue; }; struct message { //header head; //generic_message_base* msg; //bool init_header() //{ // if(!msg) // { // return false; // } // head = msg->get_header(); // return true; //} //uint32_t get_size() const //{ //} }; struct composed_message : public generic_message { message** messages; }; struct vec2 { int x,y; }; struct vec3 { int x,y,z; }; struct draw_rectangle : public generic_message { virtual ~draw_rectangle() = default; virtual uint32_t get_size() const override { return sizeof(*this); } vec2 position; vec2 size; vec3 color; }; struct draw_pixel : public generic_message { virtual ~draw_pixel() = default; virtual uint32_t get_size() const override { return sizeof(*this); } vec2 position; vec3 color; }; //uint32_t get_size(Type type) //{ // static std::map type_map{}; // // //initalizes map on first run // static bool run_once = [&](){ // type_map.emplace(Type::DRAW_PIXEL, sizeof(draw_pixel)); // type_map.emplace(Type::DRAW_RECTANGLE, sizeof(draw_rectangle)); // type_map.emplace(Type::COMPOSED_MESSAGE, sizeof(composed_message)); // return true; // }(); // // return type_map[type]; //} //generic_message_base* get_object(Type type, generic_message_base* msg) //{ // switch(type) // { // case Type::COMPOSED_MESSAGE: // { // return reinterpret_cast(msg); // } // case Type::DRAW_RECTANGLE: // { // return reinterpret_cast(msg); // } // case Type::DRAW_PIXEL: // { // return reinterpret_cast(msg); // } // default: // return nullptr; // } //} //template //auto* get_object(generic_message_base* msg) //{ // return nullptr; //} // //template<> //auto* get_object(generic_message_base* msg) //{ // return reinterpret_cast(msg); //} // //template<> //auto* get_object(generic_message_base* msg) //{ // return reinterpret_cast(msg); //} // //template<> //auto* get_object(generic_message_base* msg) //{ // return reinterpret_cast(msg); //} }