{%- set class_name = struct.name ~ "_Data" -%}

class {{class_name}} {
 public:
  static {{class_name}}* New(mojo::internal::Buffer* buf);

  static mojo::internal::ValidationError Validate(
      const void* data,
      mojo::internal::BoundsChecker* bounds_checker,
      std::string* err);

  void EncodePointersAndHandles(std::vector<mojo::Handle>* handles);
  void DecodePointersAndHandles(std::vector<mojo::Handle>* handles);

  mojo::internal::StructHeader header_;
{%- for packed_field in struct.packed.packed_fields %}
{%-   set name = packed_field.field.name %}
{%-   set kind = packed_field.field.kind %}
{%-   if kind.spec == 'b' %}
  uint8_t {{name}} : 1;
{%-   elif kind|is_enum_kind %}
  int32_t {{name}};
{%-   else %}
  {{kind|cpp_field_type}} {{name}};
{%-   endif %}
{%-   if not loop.last %}
{%-     set next_pf = struct.packed.packed_fields[loop.index0 + 1] %}
{%-     set pad = next_pf.offset - (packed_field.offset + packed_field.size) %}
{%-     if pad > 0 %}
  uint8_t pad{{loop.index0}}_[{{pad}}];
{%-     endif %}
{%-   endif %}
{%- endfor %}

{%- set num_fields = struct.versions[-1].num_fields %}
{%- if num_fields > 0 %}
{%-   set last_field = struct.packed.packed_fields[num_fields - 1] %}
{%-   set offset = last_field.offset + last_field.size %}
{%-   set pad = offset|get_pad(8) %}
{%-   if pad > 0 %}
  uint8_t padfinal_[{{pad}}];
{%-   endif %}
{%- endif %}

 private:
  {{class_name}}();
  ~{{class_name}}() = delete;
};
static_assert(sizeof({{class_name}}) == {{struct.versions[-1].num_bytes}},
              "Bad sizeof({{class_name}})");
