Explorar o código

Finished rework on the oneof field type generation.

Bart Hertog %!s(int64=5) %!d(string=hai) anos
pai
achega
aa65b80ab7

+ 11 - 1
generator/support/Field.py

@@ -89,7 +89,11 @@ class Field:
         return self.name
 
     def get_variable_name(self):
-        return self.variable_name
+        var_name = ""
+        if self.oneof:
+            var_name = self.oneof.get_variable_name() + "."
+        var_name += self.variable_name
+        return var_name
 
     def get_variable_id_name(self):
         return self.variable_id_name
@@ -111,6 +115,12 @@ class Field:
         return (type(self) is FieldMessage) or (type(self) is FieldRepeated) or (type(self) is FieldString) or \
                (type(self) is FieldBytes)
 
+    def get_oneof_name(self):
+        return self.oneof.get_name()
+
+    def get_which_oneof(self):
+        return self.oneof.get_which_oneof()
+
     def render(self, filename, jinja_environment):
         template = jinja_environment.get_template(filename)
         try:

+ 9 - 3
generator/templates/FieldBasic_Deserialize.h

@@ -29,11 +29,17 @@ Postal address:
 #}
 if(::EmbeddedProto::WireFormatter::WireType::{{field.get_wire_type_str()}} == wire_type)
 {
+  {% if field.oneof is not none %}
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {% endif %}
   return_value = {{field.get_variable_name()}}.deserialize(buffer);
-  {% if field.which_oneof is defined %}
-  if(::EmbeddedProto::Error::NO_ERRORS == return_value)
+  {% if field.oneof is not none %}
+  if(::EmbeddedProto::Error::NO_ERRORS != return_value)
   {
-    {{field.which_oneof}} = id::{{field.get_variable_id_name()}};
+    clear_{{field.get_name()}}();
   }
   {% endif %}
 }

+ 27 - 0
generator/templates/FieldBasic_GetSet.h

@@ -27,9 +27,36 @@ Postal address:
   1066 VH, Amsterdam
   the Netherlands
 #}
+{% if field.oneof is not none %}
+inline void clear_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} == {{field.get_which_oneof()}})
+  {
+    {{field.get_which_oneof()}} = id::NOT_SET;
+    {{field.get_variable_name()}}.set({{field.get_default_value()}});
+  }
+}
+inline void set_{{field.get_name()}}(const {{field.get_type()}}::FIELD_TYPE& value)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}}.set(value);
+}
+inline void set_{{field.get_name()}}(const {{field.get_type()}}::FIELD_TYPE&& value)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}}.set(value);
+}
+{% else %}
 inline void clear_{{field.get_name()}}() { {{field.get_variable_name()}}.clear(); }
 inline void set_{{field.get_name()}}(const {{field.get_type()}}& value) { {{field.get_variable_name()}} = value; }
 inline void set_{{field.get_name()}}(const {{field.get_type()}}&& value) { {{field.get_variable_name()}} = value; }
 inline {{field.get_type()}}& mutable_{{field.get_name()}}() { return {{field.get_variable_name()}}; }
+{% endif %}
 inline const {{field.get_type()}}& get_{{field.get_name()}}() const { return {{field.get_variable_name()}}; }
 inline {{field.get_type()}}::FIELD_TYPE {{field.get_name()}}() const { return {{field.get_variable_name()}}.get(); }

+ 21 - 4
generator/templates/FieldBytes_GetSet.h

@@ -27,9 +27,26 @@ Postal address:
   1066 VH, Amsterdam
   the Netherlands
 #}
+{% if field.oneof is not none %}
+inline void clear_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} == {{field.get_which_oneof()}})
+  {
+    {{field.get_which_oneof()}} = id::NOT_SET;
+    {{field.get_variable_name()}}.~{{field.get_type()}}();
+  }
+}
+inline {{field.repeated_type}}& mutable_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  return {{field.get_variable_name()}};
+}
+{% else %}
 inline void clear_{{field.get_name()}}() { {{field.get_variable_name()}}.clear(); }
-inline void set_{{field.get_name()}}(const {{field.get_type()}}& value) { {{field.get_variable_name()}} = value; }
-inline void set_{{field.get_name()}}(const {{field.get_type()}}&& value) { {{field.get_variable_name()}} = value; }
 inline {{field.get_type()}}& mutable_{{field.get_name()}}() { return {{field.get_variable_name()}}; }
-inline const {{field.get_type()}}& get_{{field.get_name()}}() const { return {{field.get_variable_name()}}; }
-inline const {{field.get_type()}}& {{field.get_name()}}() const { return {{field.get_variable_name()}}; }
+{% endif %}
+inline const {{field.get_type()}}& {{field.get_name()}}() const { return {{field.get_variable_name()}}; }
+inline const uint8_t* get_{{field.get_name()}}() const { return {{field.get_variable_name()}}.get_const(); }

+ 0 - 6
generator/templates/FieldEnum_Deserialize.h

@@ -35,12 +35,6 @@ if(::EmbeddedProto::WireFormatter::WireType::{{field.get_wire_type_str()}} == wi
   {
     set_{{field.get_name()}}(static_cast<{{field.get_type()}}>(value));
   }
-  {% if field.which_oneof is defined %}
-  if(::EmbeddedProto::Error::NO_ERRORS == return_value)
-  {
-    {{field.which_oneof}} = id::{{field.get_variable_id_name()}};
-  }
-  {% endif %}
 }
 else
 {

+ 27 - 1
generator/templates/FieldEnum_GetSet.h

@@ -27,9 +27,35 @@ Postal address:
   1066 VH, Amsterdam
   the Netherlands
 #}
+{% if field.oneof is not none %}
+inline void clear_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} == {{field.get_which_oneof()}})
+  {
+    {{field.get_which_oneof()}} = id::NOT_SET;
+    {{field.get_variable_name()}} = static_cast<{{field.get_type()}}>({{field.get_default_value()}});
+  }
+}
+inline void set_{{field.get_name()}}(const {{field.get_type()}}& value)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}} = value;
+}
+inline void set_{{field.get_name()}}(const {{field.get_type()}}&& value)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}} = value;
+}
+{% else %}
 inline void clear_{{field.get_name()}}() { {{field.get_variable_name()}} = {{field.get_default_value()}}; }
 inline void set_{{field.get_name()}}(const {{field.get_type()}}& value) { {{field.get_variable_name()}} = value; }
 inline void set_{{field.get_name()}}(const {{field.get_type()}}&& value) { {{field.get_variable_name()}} = value; }
-inline {{field.get_type()}}& mutable_{{field.get_name()}}() { return {{field.get_variable_name()}}; }
+{% endif %}
 inline const {{field.get_type()}}& get_{{field.get_name()}}() const { return {{field.get_variable_name()}}; }
 inline {{field.get_type()}} {{field.get_name()}}() const { return {{field.get_variable_name()}}; }

+ 3 - 3
generator/templates/FieldMsg_Deserialize.h

@@ -36,10 +36,10 @@ if(::EmbeddedProto::WireFormatter::WireType::{{field.get_wire_type_str()}} == wi
   {
     return_value = mutable_{{field.get_name()}}().deserialize(bufferSection);
   }
-  {% if field.which_oneof is defined %}
-  if(::EmbeddedProto::Error::NO_ERRORS == return_value)
+  {% if field.oneof is not none %}
+  if(::EmbeddedProto::Error::NO_ERRORS != return_value)
   {
-    {{field.which_oneof}} = id::{{field.get_variable_id_name()}};
+    clear_{{field.get_name()}}();
   }
   {% endif %}
 }

+ 35 - 0
generator/templates/FieldMsg_GetSet.h

@@ -27,9 +27,44 @@ Postal address:
   1066 VH, Amsterdam
   the Netherlands
 #}
+{% if field.oneof is not none %}
+inline void clear_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} == {{field.get_which_oneof()}})
+  {
+    {{field.get_which_oneof()}} = id::NOT_SET;
+    {{field.get_variable_name()}}.~{{field.get_short_type()}}();
+  }
+}
+inline void set_{{field.get_name()}}(const {{field.get_type()}}& value)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}} = value;
+}
+inline void set_{{field.get_name()}}(const {{field.get_type()}}&& value)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}} = value;
+}
+inline {{field.get_type()}}& mutable_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  return {{field.get_variable_name()}};
+}
+{% else %}
 inline void clear_{{field.get_name()}}() { {{field.get_variable_name()}}.clear(); }
 inline void set_{{field.get_name()}}(const {{field.get_type()}}& value) { {{field.get_variable_name()}} = value; }
 inline void set_{{field.get_name()}}(const {{field.get_type()}}&& value) { {{field.get_variable_name()}} = value; }
 inline {{field.get_type()}}& mutable_{{field.get_name()}}() { return {{field.get_variable_name()}}; }
+{% endif %}
 inline const {{field.get_type()}}& get_{{field.get_name()}}() const { return {{field.get_variable_name()}}; }
 inline const {{field.get_type()}}& {{field.get_name()}}() const { return {{field.get_variable_name()}}; }

+ 51 - 0
generator/templates/FieldRepeated_GetSet.h

@@ -27,6 +27,56 @@ Postal address:
   1066 VH, Amsterdam
   the Netherlands
 #}
+{% if field.oneof is not none %}
+inline void clear_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} == {{field.get_which_oneof()}})
+  {
+    {{field.get_which_oneof}} = id::NOT_SET;
+    {{field.get_variable_name()}}.~{{field.get_short_type()}}();
+  }
+}
+inline void set_{{field.get_name()}}(uint32_t index, const {{field.get_type()}}& value)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}}.set(index, value);
+}
+inline void set_{{field.get_name()}}(uint32_t index, const {{field.get_type()}}&& value)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}}.set(index, value);
+}
+inline void set_{{field.get_name()}}(const {{field.repeated_type}}& values)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}} = values;
+}
+inline void add_{{field.get_name()}}(const {{field.get_type()}}& value)
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  {{field.get_variable_name()}}.add(value);
+}
+inline {{field.repeated_type}}& mutable_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  return {{field.get_variable_name()}};
+}
+{% else %}
 inline const {{field.get_base_type()}}& {{field.get_name()}}(uint32_t index) const { return {{field.get_variable_name()}}[index]; }
 inline void clear_{{field.get_name()}}() { {{field.get_variable_name()}}.clear(); }
 inline void set_{{field.get_name()}}(uint32_t index, const {{field.get_base_type()}}& value) { {{field.get_variable_name()}}.set(index, value); }
@@ -34,5 +84,6 @@ inline void set_{{field.get_name()}}(uint32_t index, const {{field.get_base_type
 inline void set_{{field.get_name()}}(const {{field.get_type()}}& values) { {{field.get_variable_name()}} = values; }
 inline void add_{{field.get_name()}}(const {{field.get_base_type()}}& value) { {{field.get_variable_name()}}.add(value); }
 inline {{field.get_type()}}& mutable_{{field.get_name()}}() { return {{field.get_variable_name()}}; }
+{% endif %}
 inline const {{field.get_type()}}& get_{{field.get_name()}}() const { return {{field.get_variable_name()}}; }
 inline const {{field.get_type()}}& {{field.get_name()}}() const { return {{field.get_variable_name()}}; }

+ 21 - 4
generator/templates/FieldString_GetSet.h

@@ -27,9 +27,26 @@ Postal address:
   1066 VH, Amsterdam
   the Netherlands
 #}
+{% if field.oneof is not none %}
+inline void clear_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} == {{field.get_which_oneof()}})
+  {
+    {{field.get_which_oneof()}} = id::NOT_SET;
+    {{field.get_variable_name()}}.~{{field.get_short_type()}}();
+  }
+}
+inline {{field.repeated_type}}& mutable_{{field.get_name()}}()
+{
+  if(id::{{field.get_variable_id_name()}} != {{field.get_which_oneof()}})
+  {
+    init_{{field.get_oneof_name()}}(id::{{field.get_variable_id_name()}});
+  }
+  return {{field.get_variable_name()}};
+}
+{% else %}
 inline void clear_{{field.get_name()}}() { {{field.get_variable_name()}}.clear(); }
-inline void set_{{field.get_name()}}(const {{field.get_type()}}& value) { {{field.get_variable_name()}} = value; }
-inline void set_{{field.get_name()}}(const {{field.get_type()}}&& value) { {{field.get_variable_name()}} = value; }
 inline {{field.get_type()}}& mutable_{{field.get_name()}}() { return {{field.get_variable_name()}}; }
-inline const {{field.get_type()}}& get_{{field.get_name()}}() const { return {{field.get_variable_name()}}; }
-inline const {{field.get_type()}}& {{field.get_name()}}() const { return {{field.get_variable_name()}}; }
+{% endif %}
+inline const {{field.get_type()}}& {{field.get_name()}}() const { return {{field.get_variable_name()}}; }
+inline const char* get_{{field.get_name()}}() const { return {{field.get_variable_name()}}.get_const(); }

+ 14 - 4
generator/templates/TypeDefMsg.h

@@ -77,6 +77,14 @@ class {{ typedef.get_name() }} final: public ::EmbeddedProto::MessageInterface
     {% 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
@@ -179,12 +187,14 @@ class {{ typedef.get_name() }} final: public ::EmbeddedProto::MessageInterface
         {{oneof.get_name()}}() {}
         ~{{oneof.get_name()}}() {}
         {% for field in oneof.fields %}
-        {{field.get_type()}} {{field.get_variable_name()}};
+        {# 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_name()}}_;
+      {{oneof.get_name()}} {{oneof.get_variable_name()}};
 
-      {{ TypeOneof.init(oneof)|indent(4) }}
-      {{ TypeOneof.clear(oneof)|indent(4) }}
+      {{ TypeOneof.init(oneof)|indent(6) }}
+      {{ TypeOneof.clear(oneof)|indent(6) }}
       {% endfor %}
 };

+ 9 - 3
generator/templates/TypeOneof.h

@@ -40,6 +40,7 @@ switch(rhs.get_which_{{_oneof.get_name()}}())
   case id::{{field.get_variable_id_name()}}:
     set_{{field.get_name()}}(rhs.get_{{field.name}}());
     break;
+
   {% endfor %}
   default:
     break;
@@ -57,20 +58,25 @@ void init_{{_oneof.get_name()}}(const id field_id)
     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()}}:
-      {% if field.oneof_allocation_required() %}
-      new(&{{field.variable_full_name}}) {{field.type}};
+      new(&{{field.get_variable_name()}}) {{field.get_type()}};
       {{_oneof.get_which_oneof()}} = id::{{field.get_variable_id_name()}};
-      {% endif %}
       break;
+
+    {% endif %}
     {% endfor %}
     default:
       break;
    }
+
+   {% endif %}
+   {{_oneof.get_which_oneof()}} = field_id;
 }
 {% endmacro %}
 {# #}