blob: 528e910c4e15f36f2f5d4c0bcb4ab41b55396d8c [file] [log] [blame]
// Copyright 2019 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 tmplTable = `
{{- define "TableSizeAndAlloc" }}
template<>
struct MinSize<{{ .Natural.Name }}> {
operator size_t() {
return {{ if .Members }}{{ range $index, $member := .Members }}
{{- if $index }} + {{ end }}MinSize<{{ $member.Type.Natural }}>()
{{- end }}{{ else }}0{{ end }};
}
};
template<>
struct Allocate<{{ .Natural.Name }}> {
{{ .Natural.Name }} operator()(FuzzInput* src, size_t* size) {
ZX_ASSERT(*size >= MinSize<{{ .Natural.Name }}>());
{{ .Natural.Name }} out;
{{- if .Members }}
const size_t slack_per_member = (*size - MinSize<{{ .Natural.Name }}>()) / {{ len .Members }};
size_t out_size;
{{- range .Members }}
out_size = MinSize<{{ .Type.Natural }}>() + slack_per_member;
out.set_{{ .Name }}(Allocate<{{ .Type.Natural }}>{}(src, &out_size));
{{- end }}
{{- end }}
return out;
}
};
{{- end }}
`