|  | {{/* | 
|  | // 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. | 
|  | */}} | 
|  |  | 
|  | {{- 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 }} | 
|  |  |