{#
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
#}
{% macro assign(_oneof) %}
if(rhs.get_which_{{_oneof.get_name()}}() != {{_oneof.get_which_oneof()}})
{
// First delete the old object in the oneof.
clear_{{_oneof.get_name()}}();
}
switch(rhs.get_which_{{_oneof.get_name()}}())
{
{% for field in _oneof.get_fields() %}
case id::{{field.get_variable_id_name()}}:
set_{{field.get_name()}}(rhs.get_{{field.name}}());
break;
{% endfor %}
default:
break;
}
{% endmacro %}
{# #}
{# ------------------------------------------------------------------------------------------------------------------ #}
{# #}
{% macro init(_oneof) %}
void init_{{_oneof.get_name()}}(const id field_id)
{
if(id::NOT_SET != {{_oneof.get_which_oneof()}})
{
// First delete the old object in the oneof.
clear_{{_oneof.get_name()}}();
}
{% if _oneof.oneof_allocation_required() %}
// C++11 unions only support nontrivial members when you explicitly call the placement new statement.
switch(field_id)
{
{% for field in _oneof.get_fields() %}
{% if field.oneof_allocation_required() %}
case id::{{field.get_variable_id_name()}}:
new(&{{field.get_variable_name()}}) {{field.get_type()}};
{{_oneof.get_which_oneof()}} = id::{{field.get_variable_id_name()}};
break;
{% endif %}
{% endfor %}
default:
break;
}
{% endif %}
{{_oneof.get_which_oneof()}} = field_id;
}
{% endmacro %}
{# #}
{# ------------------------------------------------------------------------------------------------------------------ #}
{# #}
{% macro clear(_oneof) %}
void clear_{{_oneof.get_name()}}()
{
switch({{_oneof.get_which_oneof()}})
{
{% for field in _oneof.get_fields() %}
case id::{{field.get_variable_id_name()}}:
{% if field.oneof_allocation_required() %}
{{field.get_variable_name()}}.~{{field.get_short_type()}}();
{% elif field.of_type_enum %}
{{field.get_variable_name()}} = {{field.get_default_value()}};
{% else %}
{{field.get_variable_name()}}.set(0);
{% endif %}
break;
{% endfor %}
default:
break;
}
{{_oneof.get_which_oneof()}} = id::NOT_SET;
}
{% endmacro %}