Quellcode durchsuchen

Added the assignment operator with support for oneof's.

Bart Hertog vor 5 Jahren
Ursprung
Commit
36605f12eb
3 geänderte Dateien mit 60 neuen und 0 gelöschten Zeilen
  1. 34 0
      generator/Header_Template.h
  2. 4 0
      test/proto/oneof_fields.proto
  3. 22 0
      test/test_oneof_fields.cpp

+ 34 - 0
generator/Header_Template.h

@@ -37,6 +37,28 @@ void init_{{_oneof.name}}(const id field_id)
 {% endmacro %}
 {# #}
 {# ------------------------------------------------------------------------------------------------------------------ #}
+{# #}
+{% macro oneof_assign(_oneof) %}
+if(rhs.get_which_{{_oneof.name}}() != {{_oneof.which_oneof}})
+{
+  // First delete the old object in the oneof.
+  clear_{{_oneof.name}}();
+}
+
+switch(rhs.get_which_{{_oneof.name}}())
+{
+  {% for field in _oneof.fields() %}
+  case id::{{field.variable_id_name}}:
+    set_{{field.name}}(rhs.get_{{field.name}}());
+    break;
+  {% endfor %}
+  default:
+    break;
+}
+{% endmacro %}
+{# #}
+{# ------------------------------------------------------------------------------------------------------------------ #}
+{# #}
 {% macro oneof_clear(_oneof) %}
 void clear_{{_oneof.name}}()
 {
@@ -336,6 +358,18 @@ class {{ msg.name }} final: public ::EmbeddedProto::MessageInterface
       {% endfor %}
     };
 
+    {{ msg.name }}& operator=(const {{ msg.name }}& rhs)
+    {
+      {% for field in msg.fields() %}
+      set_{{ field.name }}(rhs.get_{{ field.name }}());
+      {% endfor %}
+      {% for oneof in msg.oneofs() %}
+      {{ oneof_assign(oneof)|indent(6) }}
+      {% endfor %}
+
+      return *this;
+    }
+
     {% for field in msg.fields() %}
     {{ field_get_set_macro(field)|indent(4) }}
     {% endfor %}

+ 4 - 0
test/proto/oneof_fields.proto

@@ -72,3 +72,7 @@ message message_oneof
     some_DEF msg_DEF = 21;
   }
 }
+
+message nested_oneof {
+  message_oneof msg_oneof = 1;
+}

+ 22 - 0
test/test_oneof_fields.cpp

@@ -317,3 +317,25 @@ TEST(OneofField, deserialize_oneof_msg)
   EXPECT_EQ(22, msg.get_msg_DEF().get_varE());
   EXPECT_EQ(333, msg.get_msg_DEF().get_varF());
 }
+
+TEST(OneofField, nested_assign)
+{
+  // This test will call the assignement operator and set the union data correctly in the message
+  // which holds a nested message with oneof's.
+
+  InSequence s;
+  nested_oneof top_level_msg;
+
+  message_oneof nested_msg;
+  nested_msg.mutable_msg_ABC().set_varA(1);
+  nested_msg.mutable_msg_ABC().set_varB(22);
+  nested_msg.mutable_msg_ABC().set_varC(333);
+
+  top_level_msg.set_msg_oneof(nested_msg);
+
+  // Check the result.
+  EXPECT_EQ(message_oneof::id::MSG_ABC, top_level_msg.get_msg_oneof().get_which_message());
+  EXPECT_EQ(1, top_level_msg.get_msg_oneof().msg_ABC().varA());
+  EXPECT_EQ(22, top_level_msg.get_msg_oneof().msg_ABC().varB());
+  EXPECT_EQ(333, top_level_msg.get_msg_oneof().msg_ABC().varC());
+}