Jelajahi Sumber

Merged in feature/PROTO-76-github-issue-17-enum-in-oneof (pull request #33)

Feature/PROTO-76 github issue 17 enum in oneof
Bart Hertog 5 tahun lalu
induk
melakukan
5e0bf6e03c

+ 2 - 0
generator/support/Field.py

@@ -49,6 +49,8 @@ class Field:
         self.variable_id_name = self.name.upper()
         self.variable_id = self.descriptor.number
         self.template_file = template_filename
+        
+        self.of_type_enum = FieldDescriptorProto.TYPE_ENUM == proto_descriptor.type
 
 
     @staticmethod

+ 2 - 0
generator/templates/TypeOneof.h

@@ -91,6 +91,8 @@ void clear_{{_oneof.get_name()}}()
     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 %}

+ 8 - 0
test/proto/oneof_fields.proto

@@ -50,11 +50,19 @@ message message_oneof
 {
   int32 a = 1;
 
+  enum States {
+    Idle = 0;
+    Run = 1;
+    Done = 2;
+    Error = 3;
+  }
+
   oneof xyz 
   {
     int32 x = 5;
     int32 y = 6;
     int32 z = 7;
+    States state = 8;
   }
 
   int32 b = 10;

+ 6 - 0
test/test_oneof_fields.cpp

@@ -84,6 +84,12 @@ TEST(OneofField, set_get_clear)
   EXPECT_EQ(message_oneof::id::Z, msg.get_which_xyz());
   msg.clear_z();
 
+  EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
+  msg.set_state(message_oneof::States::Run);
+  EXPECT_EQ(message_oneof::States::Run, msg.get_state());
+  EXPECT_EQ(message_oneof::id::STATE, msg.get_which_xyz());
+  msg.clear_state();
+
   EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
 
   EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_message());