blob: 3d7645a63224e638f65e8927c72116afd3c4b849 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package codegen
const structTemplate = `
{{- define "StructForwardDeclaration" }}
{{ EnsureNamespace . }}
class {{ .Name }};
{{- end }}
{{/* TODO(fxbug.dev/36441): Remove __Fuchsia__ ifdefs once we have non-Fuchsia
emulated handles for C++. */}}
{{- define "StructDeclaration" }}
{{ EnsureNamespace . }}
{{ if .IsResourceType }}
{{- IfdefFuchsia -}}
{{- end }}
{{- .Docs }}
class {{ .Name }} final {
public:
static const fidl_type_t* FidlType;
{{- if .IsResultValue }}
{{ .Name }}() = default;
{{- if eq 1 (len .Members) }}
explicit {{ .Name }}({{ (index .Members 0).Type }} v) : {{ (index .Members 0).Name }}(std::move(v)) {}
{{ (index .Members 0).Type }} ResultValue_() { return std::move({{ (index .Members 0).Name }}); }
{{- end }}
explicit {{ .Name }}({{ .Result.ValueTupleDecl }} _value_tuple) {
{{- if .Result.ValueArity }}
std::tie(
{{- range $index, $member := .Members }}
{{- if $index }}, {{ end -}}
{{ .Name }}
{{- end -}}
) = std::move(_value_tuple);
{{- end }}
}
operator {{ .Result.ValueTupleDecl }}() && {
return std::make_tuple(
{{- if .Result.ValueArity }}
{{- range $index, $member := .Members }}
{{- if $index }}, {{ end -}}
std::move({{ .Name }})
{{- end -}}
{{- end }}
);
}
{{- end }}
{{- range .Members }}
{{ .Docs }}
{{ .Type }} {{ .Name }}{{ if .DefaultValue.IsSet }} = {{ .DefaultValue }}{{ else }}{}{{ end }};
{{- end }}
static inline ::std::unique_ptr<{{ .Name }}> New() { return ::std::make_unique<{{ .Name }}>(); }
void Encode(::fidl::Encoder* _encoder, size_t _offset,
cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
static void Decode(::fidl::Decoder* _decoder, {{ .Name }}* value, size_t _offset);
zx_status_t Clone({{ .Name }}* result) const;
};
inline zx_status_t Clone(const {{ . }}& _value,
{{ . }}* _result) {
return _value.Clone(_result);
}
using {{ .Name }}Ptr = ::std::unique_ptr<{{ .Name }}>;
{{- if .IsResourceType }}
{{- EndifFuchsia -}}
{{ end }}
{{- end }}
{{- define "StructDefinition" }}
{{ EnsureNamespace . }}
{{- if .IsResourceType }}
{{- IfdefFuchsia -}}
{{- end }}
extern "C" const fidl_type_t {{ .CodingTableType }};
const fidl_type_t* {{ .Name }}::FidlType = &{{ .CodingTableType }};
void {{ .Name }}::Encode(::fidl::Encoder* _encoder, size_t _offset,
cpp17::optional<::fidl::HandleInformation> maybe_handle_info) {
if (::fidl::IsMemcpyCompatible<{{ .Name }}>::value) {
memcpy(_encoder->template GetPtr<{{ .Name }}>(_offset), this, sizeof({{ .Name }}));
} else {
{{- range .Members }}
{{- if .HandleInformation }}
::fidl::Encode(_encoder, &{{ .Name }}, _offset + {{ .Offset }}, ::fidl::HandleInformation {
.object_type = {{ .HandleInformation.ObjectType }},
.rights = {{ .HandleInformation.Rights }},
});
{{ else -}}
::fidl::Encode(_encoder, &{{ .Name }}, _offset + {{ .Offset }});
{{ end -}}
{{- end }}
}
}
void {{ .Name }}::Decode(::fidl::Decoder* _decoder, {{ .Name }}* _value, size_t _offset) {
if (::fidl::IsMemcpyCompatible<{{ .Name }}>::value) {
memcpy(_value, _decoder->template GetPtr<{{ .Name }}>(_offset), sizeof({{ .Name }}));
} else {
{{- range .Members }}
::fidl::Decode(_decoder, &_value->{{ .Name }}, _offset + {{ .Offset }});
{{- end }}
}
}
zx_status_t {{ .Name }}::Clone({{ .Name }}* _result) const {
{{- range $index, $member := .Members }}
{{ if not $index }}zx_status_t {{ end -}}
_status = ::fidl::Clone({{ .Name }}, &_result->{{ .Name }});
if (_status != ZX_OK)
return _status;
{{- end }}
return ZX_OK;
}
{{- if .IsResourceType }}
{{- EndifFuchsia -}}
{{ end }}
{{- end }}
{{- define "StructTraits" }}
{{- if .IsResourceType }}
{{- IfdefFuchsia -}}
{{- end }}
template <>
struct CodingTraits<{{ . }}>
: public EncodableCodingTraits<{{ . }}, {{ .InlineSize }}> {};
{{ if .HasPadding }}
template<>
struct HasPadding<{{ . }}> : public std::true_type {};
{{ end }}
{{ if .FullDeclMemcpyCompatibleDeps }}
template<>
struct IsMemcpyCompatible<{{ . }}> : public internal::BoolConstant<
!HasPadding<{{ . }}>::value
{{- range .FullDeclMemcpyCompatibleDeps }}
&& IsMemcpyCompatible<{{ . }}>::value
{{- end -}}
> {};
{{ end }}
inline zx_status_t Clone(const {{ . }}& value,
{{ . }}* result) {
return {{ .Namespace }}::Clone(value, result);
}
template<>
struct Equality<{{ . }}> {
bool operator()(const {{ . }}& _lhs, const {{ . }}& _rhs) const {
{{- range $index, $member := .Members }}
if (!::fidl::Equals(_lhs.{{ .Name }}, _rhs.{{ .Name }})) {
return false;
}
{{- end }}
return true;
}
};
{{- if .IsResourceType }}
{{- EndifFuchsia -}}
{{ end }}
{{- end }}
`