{# Copyright (C) 2020 Embedded AMS B.V. - All Rights Reserved This file is part of Embedded Proto. Embedded Proto is open source software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the license. Embedded Proto is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Embedded Proto. If not, see . For commercial and closed source application please visit: . Embedded AMS B.V. Info: info at EmbeddedProto dot com Postal address: Johan Huizingalaan 763a 1066 VH, Amsterdam the Netherlands #} {% import 'TypeOneof.h' as TypeOneof %} {% for tmpl_param in typedef.get_templates() %} {{"template<" if loop.first}}{{tmpl_param['type']}} {{tmpl_param['name']}}{{", " if not loop.last}}{{">" if loop.last}} {% endfor %} class {{ typedef.get_name() }} final: public ::EmbeddedProto::MessageInterface { public: {{ typedef.get_name() }}(){% if (typedef.fields or typedef.oneofs) %} : {% endif %} {% for field in typedef.fields %} {{field.get_variable_name()}}({{field.get_default_value()}}){{"," if not loop.last}}{{"," if loop.last and typedef.oneofs}} {% endfor %} {% for oneof in typedef.oneofs %} {{oneof.get_which_oneof()}}(id::NOT_SET){{"," if not loop.last}} {% endfor %} { }; ~{{ typedef.get_name() }}() override = default; {% for enum in typedef.nested_enum_definitions %} {{ enum.render(environment)|indent(4) }} {% endfor %} {% for msg in typedef.nested_msg_definitions %} {{ msg.render(environment)|indent(4) }} {% endfor %} enum class id { NOT_SET = 0, {% for id_set in typedef.field_ids %} {{id_set[1]}} = {{id_set[0]}}{{ "," if not loop.last }} {% endfor %} }; {{ typedef.name }}& operator=(const {{ typedef.name }}& rhs) { {% for field in typedef.fields %} set_{{ field.get_name() }}(rhs.get_{{ field.get_name() }}()); {% endfor %} {% for oneof in typedef.oneofs %} {{ TypeOneof.assign(oneof)|indent(6) }} {% endfor %} return *this; } {% for field in typedef.fields %} {{ field.render_get_set(environment)|indent(4) }} {% endfor %} {% for oneof in typedef.oneofs %} id get_which_{{oneof.get_name()}}() const { return {{oneof.get_which_oneof()}}; } {% for field in oneof.fields %} {{ field.render_get_set(environment)|indent(4) }} {% endfor %} {% endfor %} ::EmbeddedProto::Error serialize(::EmbeddedProto::WriteBufferInterface& buffer) const final { ::EmbeddedProto::Error return_value = ::EmbeddedProto::Error::NO_ERRORS; {% for field in typedef.fields %} {{ field.render_serialize(environment)|indent(6) }} {% endfor %} {% for oneof in typedef.oneofs %} switch({{oneof.get_which_oneof()}}) { {% for field in oneof.get_fields() %} case id::{{field.variable_id_name}}: {{ field.render_serialize(environment)|indent(10) }} break; {% endfor %} default: break; } {% endfor %} return return_value; }; ::EmbeddedProto::Error deserialize(::EmbeddedProto::ReadBufferInterface& buffer) final { ::EmbeddedProto::Error return_value = ::EmbeddedProto::Error::NO_ERRORS; ::EmbeddedProto::WireFormatter::WireType wire_type; uint32_t id_number = 0; ::EmbeddedProto::Error tag_value = ::EmbeddedProto::WireFormatter::DeserializeTag(buffer, wire_type, id_number); while((::EmbeddedProto::Error::NO_ERRORS == return_value) && (::EmbeddedProto::Error::NO_ERRORS == tag_value)) { switch(id_number) { {% for field in typedef.fields %} case static_cast(id::{{field.get_variable_id_name()}}): { {{ field.render_deserialize(environment)|indent(12) }} break; } {% endfor %} {% for oneof in typedef.oneofs %} {% for field in oneof.get_fields() %} case static_cast(id::{{field.get_variable_id_name()}}): { {{ field.render_deserialize(environment)|indent(12) }} break; } {% endfor %} {% endfor %} default: break; } if(::EmbeddedProto::Error::NO_ERRORS == return_value) { // Read the next tag. tag_value = ::EmbeddedProto::WireFormatter::DeserializeTag(buffer, wire_type, id_number); } } // When an error was detect while reading the tag but no other errors where found, set it in the return value. if((::EmbeddedProto::Error::NO_ERRORS == return_value) && (::EmbeddedProto::Error::NO_ERRORS != tag_value) && (::EmbeddedProto::Error::END_OF_BUFFER != tag_value)) // The end of the buffer is not an array in this case. { return_value = tag_value; } return return_value; }; void clear() final { {% for field in typedef.fields %} clear_{{field.get_name()}}(); {% endfor %} {% for oneof in typedef.oneofs %} clear_{{oneof.get_name()}}(); {% endfor %} } private: {% for field in typedef.fields %} {{field.get_type()}} {{field.get_variable_name()}}; {% endfor %} {% for oneof in typedef.oneofs %} id {{oneof.get_which_oneof()}}; union {{oneof.get_name()}} { {{oneof.get_name()}}() {} ~{{oneof.get_name()}}() {} {% for field in oneof.fields %} {# Here we use the field name variable instead of the get_ function as the get function will add the oneof name. This is the only place where this is required. #} {{field.get_type()}} {{field.variable_name}}; {% endfor %} }; {{oneof.get_name()}} {{oneof.get_variable_name()}}; {{ TypeOneof.init(oneof)|indent(6) }} {{ TypeOneof.clear(oneof)|indent(6) }} {% endfor %} };