| # Copyright 2019 Google LLC | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # https://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| [$default byte_order: "LittleEndian"] | |
| [(cpp) namespace: "emboss::test"] | |
| enum Product: | |
| VERSION_1 = 0 | |
| VERSION_2 = 10 | |
| VERSION_X = 23 | |
| enum MessageId: | |
| AXIS = 0 | |
| CONFIG = 1 | |
| struct MultiVersion(product: Product): | |
| 0 [+1] MessageId message_id | |
| if message_id == MessageId.AXIS: | |
| 1 [+12] Axes(product == Product.VERSION_X ? 3 : 2) axes | |
| if message_id == MessageId.CONFIG: | |
| 1 [+4] Config config | |
| if product == Product.VERSION_X && message_id == MessageId.CONFIG: | |
| 1 [+8] ConfigVX() config_vx | |
| struct Axes(axes: UInt:4): | |
| 0 [+axes*4] Axis(AxisType.GENERIC)[] values | |
| if axes > 0: | |
| 0 [+4] Axis(AxisType.X_AXIS) x | |
| if axes > 1: | |
| 4 [+4] Axis(AxisType.Y_AXIS) y | |
| if axes > 2: | |
| 8 [+4] Axis(AxisType.Z_AXIS) z | |
| let axis_count_plus_one = axes+1 | |
| struct AxisPair(axis_type_a_parameter: AxisType, axis_type_b_parameter: AxisType): | |
| 0 [+4] Axis(axis_type_a) axis_a | |
| 4 [+4] Axis(axis_type_b) axis_b | |
| let axis_type_a = axis_type_a_parameter | |
| let axis_type_b = axis_type_b_parameter | |
| struct AxesEnvelope: | |
| 0 [+1] UInt:8 axis_count | |
| 1 [+axis_count*4] Axes(axis_count) axes | |
| enum AxisType: | |
| GENERIC = -1 | |
| X_AXIS = 1 | |
| Y_AXIS = 2 | |
| Z_AXIS = 3 | |
| struct Axis(axis_type_parameter: AxisType): | |
| 0 [+4] UInt:32 value | |
| if axis_type == AxisType.X_AXIS: | |
| 0 [+4] UInt:32 x | |
| if axis_type == AxisType.Y_AXIS: | |
| 0 [+4] UInt:32 y | |
| if axis_type == AxisType.Z_AXIS: | |
| 0 [+4] UInt:32 z | |
| let axis_type = axis_type_parameter | |
| bits Config(): | |
| 31 [+1] Flag power | |
| struct ConfigVX: | |
| 0 [+4] bits: | |
| 31 [+1] Flag power | |
| 4 [+4] UInt gain | |
| struct StructWithUnusedParameter(x: UInt:8): | |
| 0 [+1] UInt y | |
| # StructContainingStructWithUnusedParameter is used to ensure that a struct is | |
| # not Ok() if it does not have its parameters, even if it does not directly use | |
| # those parameters. | |
| struct StructContainingStructWithUnusedParameter: | |
| 0 [+1] StructWithUnusedParameter(x) swup | |
| 1 [+1] UInt x | |
| struct BiasedValue(bias: UInt:8): | |
| 0 [+1] UInt raw_value | |
| let value = raw_value+bias | |
| struct VirtualFirstFieldWithParam(param: UInt:8): | |
| # Regression test: virtual fields did not have `public:` annotations, causing | |
| # them to pick up the `private:` annotation from the parameter accessor when | |
| # they were first in the struct. | |
| let value = x | |
| 0 [+1] UInt x | |
| struct ConstVirtualFirstFieldWithParam(param: UInt:8): | |
| # Regression test: see VirtualFirstFieldWithParam | |
| let value = 10 | |
| 0 [+1] UInt x | |
| struct SizedArrayOfBiasedValues: | |
| 0 [+1] UInt element_count (ec) | |
| 1 [+1] UInt bias | |
| 2 [+ec] BiasedValue(bias)[] values |