blob: 1445f3d3a408ddb1184f30d70c2cd82c1e65f3c2 [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 bitsTmpl = `
{{- define "BitsDeclaration" -}}
{{- range .Doc }}
///{{ . -}}
{{- end }}
class {{ .Name }} extends $fidl.Bits {
factory {{ .Name }}(int _v) {
{{- if .IsStrict }}
if ((_v & ~$mask.$value) != 0) {
throw $fidl.FidlError('Bits value contains unknown bit(s): $_v',
$fidl.FidlErrorCode.fidlInvalidBit);
}
{{- end }}
return {{ .Name }}._(_v);
}
{{- range .Members }}
{{- range .Doc }}
///{{ . -}}
{{- end }}
static const {{ $.Name }} {{ .Name }} = {{ $.Name }}._({{ .Value }});
{{- end }}
static const {{ .Name }} $none = {{ .Name }}._(0);
static const {{ .Name }} $mask = {{ .Name }}._({{ .Mask | printf "%#x" }});
const {{ .Name }}._(this.$value);
{{ .Name }} operator |({{ .Name }} other) {
return {{ .Name }}._($value | other.$value);
}
{{ .Name }} operator &({{ .Name }} other) {
return {{ .Name }}._($value & other.$value);
}
{{ .Name }} operator ~() {
return {{ .Name }}._(~$value & $mask.$value);
}
@override
final int $value;
@override
bool hasUnknownBits() {
return getUnknownBits() != 0;
}
@override
int getUnknownBits() {
return $value & ~$mask.$value;
}
@override
String toString() {
List<String> parts = [];
{{- range .Members }}
if ($value & {{ .Value }} != 0) {
parts.add(r'{{ $.Name }}.{{ .Name }}');
}
{{- end }}
{{- if .IsFlexible }}
if (hasUnknownBits()) {
parts.add('0x${getUnknownBits().toRadixString(16)}');
}
{{- end }}
if (parts.isEmpty) {
return r'{{ $.Name }}.$none';
} else {
return parts.join(" | ");
}
}
static {{ .Name }} _ctor(int v) => {{ .Name }}(v);
}
const $fidl.BitsType<{{ .Name }}> {{ .TypeSymbol }} = {{ .TypeExpr }};
{{ end }}
`