# 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"]


struct BasicConditional:
  0 [+1]    UInt  x
  if x == 0:
    1 [+1]  UInt  xc


struct NegativeConditional:
  0 [+1]    UInt  x
  if x != 0:
    1 [+1]  UInt  xc


struct ConditionalAndUnconditionalOverlappingFinalField:
  0 [+1]    UInt  x
  if x == 0:
    1 [+1]  UInt  xc

  1 [+1]    UInt  z


struct ConditionalBasicConditionalFieldFirst:
  if x == 0:
    0 [+1]  UInt  xc

  1 [+1]    UInt  x


struct ConditionalAndDynamicLocation:
  0 [+1]    UInt  x
  2 [+1]    UInt  y
  if x == 0:
    y [+1]  UInt  xc


struct ConditionUsesMinInt:
  0 [+1]    Int  x
  if x - 0x7fff_ffff_ffff_ff80 == -0x8000_0000_0000_0000:
    1 [+1]  UInt  xc


struct NestedConditional:
  0 [+1]    UInt  x
  if x == 0:
    1 [+1]  UInt  xc

  if xc == 0:
    2 [+1]  UInt  xcc


struct CorrectNestedConditional:
  0 [+1]    UInt  x
  if x == 0:
    1 [+1]  UInt  xc

  if x == 0 && xc == 0:
    2 [+1]  UInt  xcc


struct AlwaysFalseCondition:
  0 [+1]    UInt  x
  if false:
    1 [+1]  UInt  xc


struct OnlyAlwaysFalseCondition:
  if false:
    0 [+1]  UInt  xc


struct EmptyStruct:
  -- Empty structure.


struct AlwaysFalseConditionDynamicSize:
  0 [+1]    UInt  x
  x [+1]    UInt  y
  if false:
    1 [+1]  UInt  xc


struct ConditionDoesNotContributeToSize:
  0 [+1]    UInt  x
  if x == 0:
    1 [+1]  UInt  xc
  2 [+1]    UInt  y


enum OnOff:
  OFF = 0
  ON  = 1


struct EnumCondition:
  0 [+1]    OnOff  x
  if x == OnOff.ON:
    1 [+1]  UInt   xc


struct NegativeEnumCondition:
  0 [+1]    OnOff  x
  if x != OnOff.ON:
    1 [+1]  UInt   xc


struct LessThanCondition:
  0 [+1]    UInt  x
  if x < 5:
    1 [+1]  UInt  xc


struct LessThanOrEqualCondition:
  0 [+1]    UInt  x
  if x <= 5:
    1 [+1]  UInt  xc


struct GreaterThanOrEqualCondition:
  0 [+1]    UInt  x
  if x >= 5:
    1 [+1]  UInt  xc


struct GreaterThanCondition:
  0 [+1]    UInt  x
  if x > 5:
    1 [+1]  UInt  xc


struct RangeCondition:
  0 [+1]    UInt  x
  1 [+1]    UInt  y
  if 5 < x <= y < 10:
    2 [+1]  UInt  xc


struct ReverseRangeCondition:
  0 [+1]    UInt  x
  1 [+1]    UInt  y
  if 10 > y >= x > 5:
    2 [+1]  UInt  xc


struct AndCondition:
  0 [+1]    UInt  x
  1 [+1]    UInt  y
  if x == 5 && y == 5:
    2 [+1]  UInt  xc


struct OrCondition:
  0 [+1]    UInt  x
  1 [+1]    UInt  y
  if x == 5 || y == 5:
    2 [+1]  UInt  xc


struct ChoiceCondition:
  0 [+1]    enum  field:
    USE_X = 1
    USE_Y = 2

  1 [+1]    UInt  x
  2 [+1]    UInt  y
  if (field == Field.USE_X ? x : y) == 5:
    3 [+1]  UInt  xyc


struct ContainsBits:
  0 [+1]  bits:
    7 [+1]  UInt  has_top
    0 [+1]  UInt  has_bottom


struct ContainsContainsBits:
  0 [+1]    ContainsBits  condition
  # TODO(bolms): allow Flags to be used as booleans in conditions.
  if condition.has_top == 1:
    1 [+1]  UInt          top


struct ConditionalInline:
  0 [+1]    UInt      payload_id

  if payload_id == 0:
    1 [+3]  struct  type_0:
      0 [+1]  UInt  a
      1 [+1]  UInt  b
      2 [+1]  UInt  c

  if payload_id == 1:
    1 [+3]  struct  type_1:
      0 [+1]  UInt  a
      1 [+1]  UInt  b
      2 [+1]  UInt  c


struct ConditionalAnonymous:
  0 [+1]  UInt  x
  if x > 10:
    1 [+1]  bits:
      0 [+1]  UInt  low
      if low == 1:
        3 [+2]  UInt  mid
      7 [+1]  UInt  high


struct ConditionalOnFlag:
  0 [+1]  bits:
    0 [+1]  Flag  enabled
  if enabled:
    1 [+1]  UInt  value
