Quellcode durchsuchen

Serialization marco

Bart Hertog vor 6 Jahren
Ursprung
Commit
c002da5913
2 geänderte Dateien mit 103 neuen und 32 gelöschten Zeilen
  1. 99 30
      generator/Header_Template.h
  2. 4 2
      generator/protoc-gen-eams.py

+ 99 - 30
generator/Header_Template.h

@@ -13,33 +13,126 @@ static const uint32_t {{_field.variable_id_name}} = {{_field.variable_id}};
 {% if _field.is_repeated_field %}
     inline const {{_field.type}}& {{_field.name}}(uint32_t index) const { return {{_field.variable_name}}[index]; }
     inline void clear_{{_field.name}}() { {{_field.variable_name}}.clear(); }
+    {% if _field.which_oneof is defined %}
+    inline void set_{{_field.name}}(uint32_t index, const {{_field.type}}& value)
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      {{_field.variable_name}}.set(index, value);
+    }
+    inline void set_{{_field.name}}(uint32_t index, const {{_field.type}}&& value)
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      {{_field.variable_name}}.set(index, value);
+    }
+    inline void add_{{_field.name}}(const {{_field.type}}& value)
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      {{_field.variable_name}}.add(value);
+    }
+    inline {{_field.repeated_type}}& mutable_{{_field.name}}()
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      return {{_field.variable_name}};
+    }
+    {% else %}
     inline void set_{{_field.name}}(uint32_t index, const {{_field.type}}& value) { {{_field.variable_name}}.set(index, value); }
     inline void set_{{_field.name}}(uint32_t index, const {{_field.type}}&& value) { {{_field.variable_name}}.set(index, value); }
     inline void add_{{_field.name}}(const {{_field.type}}& value) { {{_field.variable_name}}.add(value); }
-    inline const {{_field.repeated_type}}& get_{{_field.name}}() const { return {{_field.variable_name}}; }
     inline {{_field.repeated_type}}& mutable_{{_field.name}}() { return {{_field.variable_name}}; }
+    {% endif %}
+    inline const {{_field.repeated_type}}& get_{{_field.name}}() const { return {{_field.variable_name}}; }
 {% elif _field.of_type_message %}
     inline const {{_field.type}}& {{_field.name}}() const { return {{_field.variable_name}}; }
     inline void clear_{{_field.name}}() { {{_field.variable_name}}.clear(); }
+    {% if _field.which_oneof is defined %}
+    inline void set_{{_field.name}}(const {{_field.type}}& value)
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      {{_field.variable_name}} = value;
+    }
+    inline void set_{{_field.name}}(const {{_field.type}}&& value)
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      {{_field.variable_name}} = value;
+    }
+    inline {{_field.type}}& mutable_{{_field.name}}()
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      return {{_field.variable_name}};
+    }
+    {% else %}
     inline void set_{{_field.name}}(const {{_field.type}}& value) { {{_field.variable_name}} = value; }
     inline void set_{{_field.name}}(const {{_field.type}}&& value) { {{_field.variable_name}} = value; }
-    inline const {{_field.type}}& get_{{_field.name}}() const { return {{_field.variable_name}}; }
     inline {{_field.type}}& mutable_{{_field.name}}() { return {{_field.variable_name}}; }
+    {% endif %}
+    inline const {{_field.type}}& get_{{_field.name}}() const { return {{_field.variable_name}}; }
 {% elif _field.of_type_enum %}
     inline {{_field.type}} {{_field.name}}() const { return {{_field.variable_name}}; }
     inline void clear_{{_field.name}}() { {{_field.variable_name}} = static_cast<{{_field.type}}>({{_field.default_value}}); }
-    inline void set_{{_field.name}}(const {{_field.type}}& value) { {{_field.variable_name}} = value; }
-    inline void set_{{_field.name}}(const {{_field.type}}&& value) { {{_field.variable_name}} = value; }
-    inline {{_field.type}} get_{{_field.name}}() const { return {{_field.variable_name}}; }
+    {% if _field.which_oneof is defined %}
+    inline void set_{{_field.name}}(const {{_field.type}}::FIELD_TYPE& value)
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      {{_field.variable_name}} = value;
+    }
+    inline void set_{{_field.name}}(const {{_field.type}}::FIELD_TYPE&& value)
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      {{_field.variable_name}} = value;
+    }
+    {% else %}
+    inline void set_{{_field.name}}(const {{_field.type}}::FIELD_TYPE& value) { {{_field.variable_name}} = value; }
+    inline void set_{{_field.name}}(const {{_field.type}}::FIELD_TYPE&& value) { {{_field.variable_name}} = value; }
+    {% endif %}    inline {{_field.type}} get_{{_field.name}}() const { return {{_field.variable_name}}; }
 {% else %}
     inline {{_field.type}}::FIELD_TYPE {{_field.name}}() const { return {{_field.variable_name}}.get(); }
     inline void clear_{{_field.name}}() { {{_field.variable_name}}.set({{_field.default_value}}); }
+    {% if _field.which_oneof is defined %}
+    inline void set_{{_field.name}}(const {{_field.type}}::FIELD_TYPE& value)
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      {{_field.variable_name}}.set(value);
+    }
+    inline void set_{{_field.name}}(const {{_field.type}}::FIELD_TYPE&& value)
+    {
+      {{_field.which_oneof}} = {{_field.variable_id_name}};
+      {{_field.variable_name}}.set(value);
+    }
+    {% else %}
     inline void set_{{_field.name}}(const {{_field.type}}::FIELD_TYPE& value) { {{_field.variable_name}}.set(value); }
     inline void set_{{_field.name}}(const {{_field.type}}::FIELD_TYPE&& value) { {{_field.variable_name}}.set(value); }
+    {% endif %}
     inline {{_field.type}}::FIELD_TYPE get_{{_field.name}}() const { return {{_field.variable_name}}.get(); }
 {% endif %}
 {% endmacro %}
 
+{% macro field_serialize_macro(_field) %}
+      {% if _field.is_repeated_field %}
+      if(result)
+      {
+        result = {{_field.variable_name}}.serialize({{_field.variable_id_name}}, buffer);
+      }
+      {% elif _field.of_type_message %}
+      if(result)
+      {
+        const ::EmbeddedProto::MessageInterface* x = &{{_field.variable_name}};
+        result = x->serialize({{_field.variable_id_name}}, buffer);
+      }
+      {% elif _field.of_type_enum %}
+      if(({{_field.default_value}} != {{_field.variable_name}}) && result)
+      {
+        EmbeddedProto::uint32 value;
+        value.set(static_cast<uint32_t>({{_field.variable_name}}));
+        result = value.serialize({{_field.variable_id_name}}, buffer);
+      }
+      {% else %}
+      if(({{_field.default_value}} != {{_field.variable_name}}.get()) && result)
+      {
+        result = {{_field.variable_name}}.serialize({{_field.variable_id_name}}, buffer);
+      }
+      {% endif %}
+{% endmacro %}
+
 {% macro msg_macro(msg) %}
 {% if msg.templates is defined %}
 {% for template in msg.templates %}
@@ -79,31 +172,7 @@ class {{ msg.name }} final: public ::EmbeddedProto::MessageInterface
       bool result = true;
 
       {% for field in msg.fields() %}
-      {% if field.is_repeated_field %}
-      if(result)
-      {
-        result = {{field.variable_name}}.serialize({{field.variable_id_name}}, buffer);
-      }
-      {% elif field.of_type_message %}
-      if(result)
-      {
-        const ::EmbeddedProto::MessageInterface* x = &{{field.variable_name}};
-        result = x->serialize({{field.variable_id_name}}, buffer);
-      }
-      {% elif field.of_type_enum %}
-      if(({{field.default_value}} != {{field.variable_name}}) && result)
-      {
-        EmbeddedProto::uint32 value;
-        value.set(static_cast<uint32_t>({{field.variable_name}}));
-        result = value.serialize({{field.variable_id_name}}, buffer);
-      }
-      {% else %}
-      if(({{field.default_value}} != {{field.variable_name}}.get()) && result)
-      {
-        result = {{field.variable_name}}.serialize({{field.variable_id_name}}, buffer);
-      }
-      {% endif %}
-
+      {{ field_serialize_macro(field)|indent(0) }}
       {% endfor %}
       return result;
     };

+ 4 - 2
generator/protoc-gen-eams.py

@@ -84,8 +84,10 @@ class FieldTemplateParameters:
         self.variable_name = self.name + "_"
         self.variable_id_name = self.name + "_id"
         self.variable_id = field_proto.number
-        # When set this field is part of a oneof.
-        self.which_oneof = which_oneof
+
+        if which_oneof:
+            # When set this field is part of a oneof.
+            self.which_oneof = which_oneof
 
         self.of_type_message = FieldDescriptorProto.TYPE_MESSAGE == field_proto.type
         self.wire_type = self.type_to_wire_type[field_proto.type]