blob: fdf72f6c3e038f6b1d1f08836b4f1bfc20ff4073 [file] [log] [blame]
{{/*
// Copyright 2021 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.
*/}}
{{- define "Struct:ForwardDeclaration:NaturalTypesHeader" }}
{{ EnsureNamespace . }}
class {{ .Name }};
{{- end }}
{{- define "Struct:NaturalTypesHeader" }}
{{ EnsureNamespace . }}
{{ if .IsResourceType }}
{{- IfdefFuchsia -}}
{{- end }}
extern "C" const fidl_type_t {{ .CodingTableType.Name }};
{{ .Docs }}
class {{ .Name }} {
private:
struct Storage_;
public:
{{ .Name }}(Storage_ storage) noexcept : storage_(std::move(storage)) {}
{{- if len .Members }}
{{ .Name }}(
{{- range $i, $m := .Members }}
{{- if $i }}, {{ end }}
{{- $m.Type }} {{ $m.Name }}
{{- end }}) noexcept
: storage_({
{{- range $i, $m := .Members }}
{{- if $i }}, {{ end }}
.{{ $m.Name }} = std::move({{ $m.Name}})
{{- end }}
}) {}
{{- end }}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
// Default constructs a |{{ .Name }}| only if all of its members are default constructible.
{{ .Name }}() = default;
#pragma clang diagnostic pop
{{ .Name }}({{ .Name }}&&) noexcept = default;
{{ .Name }}& operator=({{ .Name }}&&) noexcept = default;
{{- if not .IsResourceType }}
{{ .Name }}(const {{ .Name }}& other) noexcept : {{ .Name }}(other.CloneStorage_()){}
{{ .Name }}& operator=(const {{ .Name }}& other) noexcept {
storage_ = other.CloneStorage_();
return *this;
}
bool operator==(const {{ .Name }}& other) const noexcept {
return ::fidl::internal::NaturalStructCodingTraits<{{ . }}, {{ .TypeShapeV2.InlineSize }}>::Equal(this, &other);
}
bool operator!=(const {{ .Name }}& other) const noexcept {
return !::fidl::internal::NaturalStructCodingTraits<{{ . }}, {{ .TypeShapeV2.InlineSize }}>::Equal(this, &other);
}
{{- end }}
{{- range .Members }}
{{ .Docs }}
{{- if .Type.IsPrimitiveType }}
{{ .Type }}
{{- else }}
const {{ .Type }} &
{{- end }}
{{ .Name }}() const {
return storage_.{{ .Name }};
}
{{ .Docs }}
{{ .Type }}& {{ .Name }}() {
return storage_.{{ .Name }};
}
{{- end }}
{{ .Name }}(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : {{ .Name }}(Storage_{
{{- range .Members }}
.{{ .Name }} =
{{- if .DefaultValue.IsSet }}
{{- .DefaultValue }}
{{- else }}
{{- .NaturalPossiblyInvalidDefaultInitializer }}
{{- end }},
{{- end }}
}) {}
private:
struct Storage_ final {
{{- range .Members }}
{{- .Docs }}
{{ .Type }} {{ .Name }}
{{- if .DefaultValue.IsSet }}
= {{- .DefaultValue }}
{{- else }}
{{- if .NaturalInitializer }}
= {{ .NaturalInitializer }}
{{- end }}
{{- end }};
{{- end }}
};
Storage_ storage_;
{{- if not .IsResourceType }}
Storage_ CloneStorage_() const;
{{- end }}
friend struct ::fidl::internal::NaturalStructCodingTraits<{{ . }}, {{ .TypeShapeV2.InlineSize }}>;
friend struct ::fidl::internal::MemberVisitor<{{ . }}>;
static constexpr auto kMembers = std::make_tuple(
{{- range $i, $m := .Members }}
{{- if $i }}, {{ end -}}
::fidl::internal::NaturalStructMember<Storage_, {{ $m.Type }}, {{ $m.NaturalConstraint }}>{
&Storage_::{{ $m.Name }}, {{ $m.OffsetV2 }}
}
{{- end -}}
);
static constexpr auto kPadding = std::make_tuple(
{{- range $i, $p := .PaddingV2 }}
{{- if $i }}, {{ end -}}
::fidl::internal::NaturalStructPadding<{{ $p.MaskType }}>{
.offset = {{ $p.Offset }},
.mask = {{ $p.Mask }},
}
{{- end -}}
);
};
{{ if .IsResourceType }}
{{- EndifFuchsia -}}
{{- end }}
{{- end }}
{{- define "Struct:Traits:NaturalTypesHeader" }}
{{ if .IsResourceType }}
{{- IfdefFuchsia -}}
{{- end }}
extern "C" const fidl_type_t {{ .CodingTableType.Self }};
{{ if .IsResourceType }}
template <>
struct IsResource<{{ . }}> : public std::true_type {};
{{- end }}
template <>
struct IsFidlType<{{ . }}> : public std::true_type {};
template <>
struct internal::NaturalCodingTraits<{{ . }}, ::fidl::internal::NaturalCodingConstraintEmpty> final
{{- if .IsEmpty }}
: public ::fidl::internal::NaturalEmptyStructCodingTraits<{{ . }}> {};
{{- else }}
: public ::fidl::internal::NaturalStructCodingTraits<{{ . }}, {{ .TypeShapeV2.InlineSize }}> {};
{{- end }}
{{ if .IsResourceType }}
{{- EndifFuchsia -}}
{{ end }}
{{- end }}
{{- define "Struct:NaturalTypesSource" }}
{{ if .IsResourceType }}
{{- IfdefFuchsia -}}
{{- end }}
{{- EnsureNamespace "" }}
{{- if not .IsResourceType }}
{{ . }}::Storage_ {{ .NoLeading }}::CloneStorage_() const {
return Storage_{
{{- range $i, $m := .Members }}
{{- if $i }}, {{ end }}
::fidl::internal::NaturalClone(storage_.{{ .Name }})
{{- end }}
};
}
{{- end }}
{{ if .IsResourceType }}
{{- EndifFuchsia -}}
{{ end }}
{{- end }}
{{- define "Struct:Traits:TypeConversionsHeader" }}
{{ if .IsResourceType }}
{{- IfdefFuchsia -}}
{{- end }}
template <>
struct WireNaturalConversionTraits<{{ .Wire }}, {{ .Unified }}> {
static {{ .Unified }} ToNatural({{ .Wire }} src);
static {{ .Wire }} ToWire(fidl::AnyArena& arena, {{ .Unified }} src);
};
template <>
struct NaturalTypeForWireType<{{ .Wire }}> {
using type = {{ .Unified }};
};
template <>
struct WireTypeForNaturalType<{{ .Unified }}> {
using type = {{ .Wire }};
};
{{ if .IsResourceType }}
{{- EndifFuchsia -}}
{{ end }}
{{- end }}
{{- define "Struct:Traits:TypeConversionsSource" }}
{{ if .IsResourceType }}
{{- IfdefFuchsia -}}
{{- end }}
{{ .Unified }} WireNaturalConversionTraits<{{ .Wire }}, {{ .Unified }}>::ToNatural({{ .Wire }} src) {
{{- if eq (len .Members) 1 }}
return {{ .Unified }}({{ range .Members }}WireNaturalConversionTraits<{{ .Type.Wire }}, {{ .Type.Unified }}>::ToNatural(std::move(src.{{ .Name }})){{ end }});
{{- else }}
return {{ .Unified }}{ {
{{- range .Members }}
.{{ .Name }} = WireNaturalConversionTraits<{{ .Type.Wire }}, {{ .Type.Unified }}>::ToNatural(std::move(src.{{ .Name }})),
{{- end }}
} };
{{- end }}
}
{{ .Wire }} WireNaturalConversionTraits<{{ .Wire }}, {{ .Unified }}>::ToWire(fidl::AnyArena& arena, {{ .Unified }} src) {
return {{ .Wire }}{
{{- range .Members }}
.{{ .Name }} = WireNaturalConversionTraits<{{ .Type.Wire }}, {{ .Type.Unified }}>::ToWire(arena, std::move(src.{{ .Name }}())),
{{- end }}
};
}
{{ if .IsResourceType }}
{{- EndifFuchsia -}}
{{ end }}
{{- end }}