1*99e0aae7SDavid Rees# Copyright 2019 Google LLC 2*99e0aae7SDavid Rees# 3*99e0aae7SDavid Rees# Licensed under the Apache License, Version 2.0 (the "License"); 4*99e0aae7SDavid Rees# you may not use this file except in compliance with the License. 5*99e0aae7SDavid Rees# You may obtain a copy of the License at 6*99e0aae7SDavid Rees# 7*99e0aae7SDavid Rees# https://www.apache.org/licenses/LICENSE-2.0 8*99e0aae7SDavid Rees# 9*99e0aae7SDavid Rees# Unless required by applicable law or agreed to in writing, software 10*99e0aae7SDavid Rees# distributed under the License is distributed on an "AS IS" BASIS, 11*99e0aae7SDavid Rees# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*99e0aae7SDavid Rees# See the License for the specific language governing permissions and 13*99e0aae7SDavid Rees# limitations under the License. 14*99e0aae7SDavid Rees 15*99e0aae7SDavid Rees[$default byte_order: "LittleEndian"] 16*99e0aae7SDavid Rees[(cpp) namespace: "emboss::test"] 17*99e0aae7SDavid Rees 18*99e0aae7SDavid Rees 19*99e0aae7SDavid Reesstruct BasicConditional: 20*99e0aae7SDavid Rees 0 [+1] UInt x 21*99e0aae7SDavid Rees if x == 0: 22*99e0aae7SDavid Rees 1 [+1] UInt xc 23*99e0aae7SDavid Rees 24*99e0aae7SDavid Rees 25*99e0aae7SDavid Reesstruct NegativeConditional: 26*99e0aae7SDavid Rees 0 [+1] UInt x 27*99e0aae7SDavid Rees if x != 0: 28*99e0aae7SDavid Rees 1 [+1] UInt xc 29*99e0aae7SDavid Rees 30*99e0aae7SDavid Rees 31*99e0aae7SDavid Reesstruct ConditionalAndUnconditionalOverlappingFinalField: 32*99e0aae7SDavid Rees 0 [+1] UInt x 33*99e0aae7SDavid Rees if x == 0: 34*99e0aae7SDavid Rees 1 [+1] UInt xc 35*99e0aae7SDavid Rees 36*99e0aae7SDavid Rees 1 [+1] UInt z 37*99e0aae7SDavid Rees 38*99e0aae7SDavid Rees 39*99e0aae7SDavid Reesstruct ConditionalBasicConditionalFieldFirst: 40*99e0aae7SDavid Rees if x == 0: 41*99e0aae7SDavid Rees 0 [+1] UInt xc 42*99e0aae7SDavid Rees 43*99e0aae7SDavid Rees 1 [+1] UInt x 44*99e0aae7SDavid Rees 45*99e0aae7SDavid Rees 46*99e0aae7SDavid Reesstruct ConditionalAndDynamicLocation: 47*99e0aae7SDavid Rees 0 [+1] UInt x 48*99e0aae7SDavid Rees 2 [+1] UInt y 49*99e0aae7SDavid Rees if x == 0: 50*99e0aae7SDavid Rees y [+1] UInt xc 51*99e0aae7SDavid Rees 52*99e0aae7SDavid Rees 53*99e0aae7SDavid Reesstruct ConditionUsesMinInt: 54*99e0aae7SDavid Rees 0 [+1] Int x 55*99e0aae7SDavid Rees if x - 0x7fff_ffff_ffff_ff80 == -0x8000_0000_0000_0000: 56*99e0aae7SDavid Rees 1 [+1] UInt xc 57*99e0aae7SDavid Rees 58*99e0aae7SDavid Rees 59*99e0aae7SDavid Reesstruct NestedConditional: 60*99e0aae7SDavid Rees 0 [+1] UInt x 61*99e0aae7SDavid Rees if x == 0: 62*99e0aae7SDavid Rees 1 [+1] UInt xc 63*99e0aae7SDavid Rees 64*99e0aae7SDavid Rees if xc == 0: 65*99e0aae7SDavid Rees 2 [+1] UInt xcc 66*99e0aae7SDavid Rees 67*99e0aae7SDavid Rees 68*99e0aae7SDavid Reesstruct CorrectNestedConditional: 69*99e0aae7SDavid Rees 0 [+1] UInt x 70*99e0aae7SDavid Rees if x == 0: 71*99e0aae7SDavid Rees 1 [+1] UInt xc 72*99e0aae7SDavid Rees 73*99e0aae7SDavid Rees if x == 0 && xc == 0: 74*99e0aae7SDavid Rees 2 [+1] UInt xcc 75*99e0aae7SDavid Rees 76*99e0aae7SDavid Rees 77*99e0aae7SDavid Reesstruct AlwaysFalseCondition: 78*99e0aae7SDavid Rees 0 [+1] UInt x 79*99e0aae7SDavid Rees if false: 80*99e0aae7SDavid Rees 1 [+1] UInt xc 81*99e0aae7SDavid Rees 82*99e0aae7SDavid Rees 83*99e0aae7SDavid Reesstruct OnlyAlwaysFalseCondition: 84*99e0aae7SDavid Rees if false: 85*99e0aae7SDavid Rees 0 [+1] UInt xc 86*99e0aae7SDavid Rees 87*99e0aae7SDavid Rees 88*99e0aae7SDavid Reesstruct EmptyStruct: 89*99e0aae7SDavid Rees -- Empty structure. 90*99e0aae7SDavid Rees 91*99e0aae7SDavid Rees 92*99e0aae7SDavid Reesstruct AlwaysFalseConditionDynamicSize: 93*99e0aae7SDavid Rees 0 [+1] UInt x 94*99e0aae7SDavid Rees x [+1] UInt y 95*99e0aae7SDavid Rees if false: 96*99e0aae7SDavid Rees 1 [+1] UInt xc 97*99e0aae7SDavid Rees 98*99e0aae7SDavid Rees 99*99e0aae7SDavid Reesstruct ConditionDoesNotContributeToSize: 100*99e0aae7SDavid Rees 0 [+1] UInt x 101*99e0aae7SDavid Rees if x == 0: 102*99e0aae7SDavid Rees 1 [+1] UInt xc 103*99e0aae7SDavid Rees 2 [+1] UInt y 104*99e0aae7SDavid Rees 105*99e0aae7SDavid Rees 106*99e0aae7SDavid Reesenum OnOff: 107*99e0aae7SDavid Rees OFF = 0 108*99e0aae7SDavid Rees ON = 1 109*99e0aae7SDavid Rees 110*99e0aae7SDavid Rees 111*99e0aae7SDavid Reesstruct EnumCondition: 112*99e0aae7SDavid Rees 0 [+1] OnOff x 113*99e0aae7SDavid Rees if x == OnOff.ON: 114*99e0aae7SDavid Rees 1 [+1] UInt xc 115*99e0aae7SDavid Rees if x > OnOff.OFF: 116*99e0aae7SDavid Rees 1 [+1] UInt xc2 117*99e0aae7SDavid Rees 118*99e0aae7SDavid Rees 119*99e0aae7SDavid Reesstruct NegativeEnumCondition: 120*99e0aae7SDavid Rees 0 [+1] OnOff x 121*99e0aae7SDavid Rees if x != OnOff.ON: 122*99e0aae7SDavid Rees 1 [+1] UInt xc 123*99e0aae7SDavid Rees 124*99e0aae7SDavid Rees 125*99e0aae7SDavid Reesstruct LessThanCondition: 126*99e0aae7SDavid Rees 0 [+1] UInt x 127*99e0aae7SDavid Rees if x < 5: 128*99e0aae7SDavid Rees 1 [+1] UInt xc 129*99e0aae7SDavid Rees 130*99e0aae7SDavid Rees 131*99e0aae7SDavid Reesstruct LessThanOrEqualCondition: 132*99e0aae7SDavid Rees 0 [+1] UInt x 133*99e0aae7SDavid Rees if x <= 5: 134*99e0aae7SDavid Rees 1 [+1] UInt xc 135*99e0aae7SDavid Rees 136*99e0aae7SDavid Rees 137*99e0aae7SDavid Reesstruct GreaterThanOrEqualCondition: 138*99e0aae7SDavid Rees 0 [+1] UInt x 139*99e0aae7SDavid Rees if x >= 5: 140*99e0aae7SDavid Rees 1 [+1] UInt xc 141*99e0aae7SDavid Rees 142*99e0aae7SDavid Rees 143*99e0aae7SDavid Reesstruct GreaterThanCondition: 144*99e0aae7SDavid Rees 0 [+1] UInt x 145*99e0aae7SDavid Rees if x > 5: 146*99e0aae7SDavid Rees 1 [+1] UInt xc 147*99e0aae7SDavid Rees 148*99e0aae7SDavid Rees 149*99e0aae7SDavid Reesstruct RangeCondition: 150*99e0aae7SDavid Rees 0 [+1] UInt x 151*99e0aae7SDavid Rees 1 [+1] UInt y 152*99e0aae7SDavid Rees if 5 < x <= y < 10: 153*99e0aae7SDavid Rees 2 [+1] UInt xc 154*99e0aae7SDavid Rees 155*99e0aae7SDavid Rees 156*99e0aae7SDavid Reesstruct ReverseRangeCondition: 157*99e0aae7SDavid Rees 0 [+1] UInt x 158*99e0aae7SDavid Rees 1 [+1] UInt y 159*99e0aae7SDavid Rees if 10 > y >= x > 5: 160*99e0aae7SDavid Rees 2 [+1] UInt xc 161*99e0aae7SDavid Rees 162*99e0aae7SDavid Rees 163*99e0aae7SDavid Reesstruct AndCondition: 164*99e0aae7SDavid Rees 0 [+1] UInt x 165*99e0aae7SDavid Rees 1 [+1] UInt y 166*99e0aae7SDavid Rees if x == 5 && y == 5: 167*99e0aae7SDavid Rees 2 [+1] UInt xc 168*99e0aae7SDavid Rees 169*99e0aae7SDavid Rees 170*99e0aae7SDavid Reesstruct OrCondition: 171*99e0aae7SDavid Rees 0 [+1] UInt x 172*99e0aae7SDavid Rees 1 [+1] UInt y 173*99e0aae7SDavid Rees if x == 5 || y == 5: 174*99e0aae7SDavid Rees 2 [+1] UInt xc 175*99e0aae7SDavid Rees 176*99e0aae7SDavid Rees 177*99e0aae7SDavid Reesstruct ChoiceCondition: 178*99e0aae7SDavid Rees 0 [+1] enum field: 179*99e0aae7SDavid Rees USE_X = 1 180*99e0aae7SDavid Rees USE_Y = 2 181*99e0aae7SDavid Rees 182*99e0aae7SDavid Rees 1 [+1] UInt x 183*99e0aae7SDavid Rees 2 [+1] UInt y 184*99e0aae7SDavid Rees if (field == Field.USE_X ? x : y) == 5: 185*99e0aae7SDavid Rees 3 [+1] UInt xyc 186*99e0aae7SDavid Rees 187*99e0aae7SDavid Rees 188*99e0aae7SDavid Reesstruct ContainsBits: 189*99e0aae7SDavid Rees 0 [+1] bits: 190*99e0aae7SDavid Rees 7 [+1] UInt has_top 191*99e0aae7SDavid Rees 0 [+1] UInt has_bottom 192*99e0aae7SDavid Rees 193*99e0aae7SDavid Rees 194*99e0aae7SDavid Reesstruct ContainsContainsBits: 195*99e0aae7SDavid Rees 0 [+1] ContainsBits condition 196*99e0aae7SDavid Rees # TODO(bolms): allow Flags to be used as booleans in conditions. 197*99e0aae7SDavid Rees if condition.has_top == 1: 198*99e0aae7SDavid Rees 1 [+1] UInt top 199*99e0aae7SDavid Rees 200*99e0aae7SDavid Rees 201*99e0aae7SDavid Reesstruct ConditionalInline: 202*99e0aae7SDavid Rees 0 [+1] UInt payload_id 203*99e0aae7SDavid Rees 204*99e0aae7SDavid Rees if payload_id == 0: 205*99e0aae7SDavid Rees 1 [+3] struct type_0: 206*99e0aae7SDavid Rees 0 [+1] UInt a 207*99e0aae7SDavid Rees 1 [+1] UInt b 208*99e0aae7SDavid Rees 2 [+1] UInt c 209*99e0aae7SDavid Rees 210*99e0aae7SDavid Rees if payload_id == 1: 211*99e0aae7SDavid Rees 1 [+3] struct type_1: 212*99e0aae7SDavid Rees 0 [+1] UInt a 213*99e0aae7SDavid Rees 1 [+1] UInt b 214*99e0aae7SDavid Rees 2 [+1] UInt c 215*99e0aae7SDavid Rees 216*99e0aae7SDavid Rees 217*99e0aae7SDavid Reesstruct ConditionalAnonymous: 218*99e0aae7SDavid Rees 0 [+1] UInt x 219*99e0aae7SDavid Rees if x > 10: 220*99e0aae7SDavid Rees 1 [+1] bits: 221*99e0aae7SDavid Rees 0 [+1] UInt low 222*99e0aae7SDavid Rees if low == 1: 223*99e0aae7SDavid Rees 3 [+2] UInt mid 224*99e0aae7SDavid Rees 7 [+1] UInt high 225*99e0aae7SDavid Rees 226*99e0aae7SDavid Rees 227*99e0aae7SDavid Reesstruct ConditionalOnFlag: 228*99e0aae7SDavid Rees 0 [+1] bits: 229*99e0aae7SDavid Rees 0 [+1] Flag enabled 230*99e0aae7SDavid Rees if enabled: 231*99e0aae7SDavid Rees 1 [+1] UInt value 232