| {{/* |
| // Copyright 2023 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 "Filename:CodingTables" -}} |
| {{- .LibrarySlashes }}/cpp/tables.c |
| {{- end }} |
| |
| {{- define "File:CodingTables" -}} |
| // WARNING: This file is machine generated by fidlgen. |
| {{ range $experiment := .Experiments }} |
| // fidl_experiment = {{ $experiment }} |
| {{- end }} |
| |
| #include <lib/fidl/internal.h> |
| {{ "" }} |
| |
| {{- /* In the rest of this template, `.` is coding_tables.Root, not fidlgen_cpp.Root. */ -}} |
| {{- with GetCodingTables -}} |
| |
| {{- range .ForwardDecls }} |
| {{ .StorageClass }} const struct {{ .CType }} {{ .Name }}; |
| {{- end }} |
| {{ "" }} |
| |
| {{- range .Bits }} |
| const struct FidlCodedBits {{ .Name }} = { |
| .tag = kFidlTypeBits, |
| .name = "{{ .FidlName }}", |
| .underlying_type = {{ .UnderlyingType }}, |
| .strictness = {{ .Strictness }}, |
| .mask = {{ .Mask | printf "%#x" }}, |
| }; |
| {{ end }} |
| |
| {{- range .Enums }} |
| {{- if .Validator }} |
| static bool {{ .Validator }}(uint64_t v) { |
| switch (v) { |
| {{- range .Values }} |
| case {{ . }}: |
| {{- end }} |
| return true; |
| default: |
| return false; |
| } |
| } |
| {{- end }} |
| const struct FidlCodedEnum {{ .Name }} = { |
| .tag = kFidlTypeEnum, |
| .name = "{{ .FidlName }}", |
| .underlying_type = {{ .UnderlyingType }}, |
| .strictness = {{ .Strictness }}, |
| .validate = {{ or .Validator "NULL" }}, |
| }; |
| {{ end }} |
| |
| {{- range .Structs }} |
| {{- if .Members }} |
| static const struct FidlStructElement {{ .MembersName }}[] = { |
| {{- range .Members }} |
| { |
| {{- if .Type }} |
| .field = { |
| .header = { |
| .element_type = kFidlStructElementType_Field, |
| .is_resource = {{ .Resourceness }}, |
| }, |
| .offset_v2 = {{ .Offset }}, |
| .field_type = {{ .Type }}, |
| }, |
| {{- else }} |
| .padding = { |
| .header = { |
| .element_type = kFidlStructElementType_Padding{{ .PaddingMaskBitWidth }}, |
| .is_resource = kFidlIsResource_NotResource, |
| }, |
| .offset_v2 = {{ .Offset }}, |
| .mask_{{ .PaddingMaskBitWidth }} = {{ .PaddingMask | printf "%#x" }}, |
| }, |
| {{- end }} |
| }, |
| {{- end }} |
| }; |
| {{- end }} |
| const struct FidlCodedStruct {{ .Name }} = { |
| .tag = kFidlTypeStruct, |
| .name = "{{ .FidlName }}", |
| .is_empty = {{ .Emptiness }}, |
| .size_v2 = {{ .InlineSize }}, |
| .elements = {{ .MembersName }}, |
| .element_count = {{ len .Members }}, |
| }; |
| {{ end }} |
| |
| {{- range .Tables }} |
| {{- if .Members }} |
| static const struct FidlTableField {{ .MembersName }}[] = { |
| {{- range .Members }} |
| { .ordinal = {{ .Ordinal }}, .type = {{ .Type }} }, |
| {{- end }} |
| }; |
| {{- end }} |
| const struct FidlCodedTable {{ .Name }} = { |
| .tag = kFidlTypeTable, |
| .name = "{{ .FidlName }}", |
| .is_resource = {{ .Resourceness }}, |
| .fields = {{ .MembersName }}, |
| .field_count = {{ len .Members }}, |
| }; |
| {{ end }} |
| |
| {{- range .Unions }} |
| {{- if .Members }} |
| static const struct FidlUnionField {{ .MembersName }}[] = { |
| {{- range .Members }} |
| { .type = {{ .Type }} }, |
| {{- end }} |
| }; |
| {{- end }} |
| const struct FidlCodedUnion {{ .Name }} = { |
| .tag = kFidlTypeUnion, |
| .name = "{{ .FidlName }}", |
| .strictness = {{ .Strictness }}, |
| .is_resource = {{ .Resourceness }}, |
| .nullable = kFidlNullability_Nonnullable, |
| .fields = {{ .MembersName }}, |
| .field_count = {{ len .Members }}, |
| }; |
| {{- /* For every union, we emit a second coding table for when it's nullable. |
| We must do this even if the library doesn't use it with `:optional`, |
| because a dependent library might do so, and dependent libraries don't |
| have enough information in the IR to construct the FidlCodedUnion. */}} |
| const struct FidlCodedUnion {{ .NullableName }} = { |
| .tag = kFidlTypeUnion, |
| .name = "{{ .FidlName }}", |
| .strictness = {{ .Strictness }}, |
| .is_resource = {{ .Resourceness }}, |
| .nullable = kFidlNullability_Nullable, |
| .fields = {{ .MembersName }}, |
| .field_count = {{ len .Members }}, |
| }; |
| {{ end }} |
| |
| {{- range .Arrays }} |
| static const struct FidlCodedArray {{ .Name }} = { |
| .tag = kFidlTypeArray, |
| .element = {{ .ElementType }}, |
| .array_size_v2 = {{ .InlineSize }}, |
| .element_size_v2 = {{ .ElementSize }}, |
| }; |
| {{ end }} |
| |
| {{- range .Vectors }} |
| static const struct FidlCodedVector {{ .Name }} = { |
| .tag = kFidlTypeVector, |
| .element = {{ .ElementType }}, |
| .max_count = {{ .MaxCount }}, |
| .nullable = {{ .Nullability }}, |
| .element_size_v2 = {{ .ElementSize }}, |
| }; |
| {{ end }} |
| |
| {{- range .Strings }} |
| static const struct FidlCodedString {{ .Name }} = { |
| .tag = kFidlTypeString, |
| .max_size = {{ .MaxCount }}, |
| .nullable = {{ .Nullability }}, |
| }; |
| {{ end }} |
| |
| {{- range .Handles }} |
| static const struct FidlCodedHandle {{ .Name }} = { |
| .tag = kFidlTypeHandle, |
| .handle_subtype = {{ .ObjectType }}, |
| .handle_rights = {{ .Rights }}, |
| .nullable = {{ .Nullability }}, |
| }; |
| {{ end }} |
| |
| {{- range .Boxes }} |
| static const struct FidlCodedStructPointer {{ .Name }} = { |
| .tag = kFidlTypeStructPointer, |
| .struct_type = &{{ .StructName }}, |
| }; |
| {{ end }} |
| {{- end }} |
| {{- end }} |