chromium/mojo/public/tools/bindings/generators/cpp_templates/struct_traits_declaration.tmpl

{%- set mojom_type = struct|get_qualified_name_for_kind %}

template <>
struct {{export_attribute}} StructTraits<{{mojom_type}}::DataView,
                                         {{mojom_type}}Ptr> {
  static bool IsNull(const {{mojom_type}}Ptr& input) { return !input; }
  static void SetToNull({{mojom_type}}Ptr* output) { output->reset(); }

{%- for field in struct.fields %}
{%-   set return_ref = field.kind|is_object_kind or
  field.kind|is_any_handle_or_interface_kind %}
{#    We want the field accessor to be const whenever possible to allow
      structs to be used as map keys.
      TODO(tibell): Make this check more precise to deal with e.g.
          custom types which don't contain handles but require non-const
          reference for serialization. #}
{%-   set maybe_const = "" if field.kind|contains_handles_or_interfaces else "const" %}
{%-   if return_ref %}
  static {{maybe_const}} decltype({{mojom_type}}::{{field.name}})& {{field.name}}(
      {{maybe_const}} {{mojom_type}}Ptr& input) {
    return input->{{field.name}};
  }
{%-   else %}
  static decltype({{mojom_type}}::{{field.name}}) {{field.name}}(
      const {{mojom_type}}Ptr& input) {
    return input->{{field.name}};
  }
{%-   endif %}
{%- endfor %}

  static bool Read({{mojom_type}}::DataView input, {{mojom_type}}Ptr* output);
};