// WARNING: This file is machine generated by fidlgen_dart.
// @dart = 2.8

library fidl_fidl_test_unionsandwich_async;

import 'dart:async' as $async;
import 'dart:core' hide Set;
import 'dart:developer';
import 'dart:typed_data';

import 'package:fidl/fidl.dart' as $fidl;
import 'package:meta/meta.dart';
import 'package:zircon/zircon.dart' as $zircon;

// ignore_for_file: always_specify_types
// ignore_for_file: avoid_positional_boolean_parameters
// ignore_for_file: avoid_returning_null
// ignore_for_file: cascade_invocations
// ignore_for_file: constant_identifier_names
// ignore_for_file: one_member_abstracts
// ignore_for_file: prefer_constructors_over_static_methods
// ignore_for_file: prefer_single_quotes
// ignore_for_file: public_member_api_docs
// ignore_for_file: unused_import
// ignore_for_file: unused_local_variable
// ignore_for_file: non_constant_identifier_names
// ignore_for_file: library_prefixes
// ignore_for_file: prefer_typing_uninitialized_variables
// ignore_for_file: avoid_js_rounded_ints
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: always_put_required_named_parameters_first
// ignore_for_file: prefer_generic_function_type_aliases
// ignore_for_file: prefer_equal_for_default_values
// ignore_for_file: avoid_catches_without_on_clauses
// ignore_for_file: unused_shown_name
// ignore_for_file: unnecessary_lambdas
// ignore_for_file: comment_references
// ignore_for_file: avoid_unused_constructor_parameters
// ignore_for_file: prefer_interpolation_to_compose_strings

enum UnionSize8Alignment4Tag {
  variant, // 0x1
}

const Map<int, UnionSize8Alignment4Tag> _UnionSize8Alignment4Tag_map = {
  1: UnionSize8Alignment4Tag.variant,
};

class UnionSize8Alignment4 extends $fidl.XUnion {
  const UnionSize8Alignment4.withVariant(int value)
      : _ordinal = 1,
        _data = value;

  UnionSize8Alignment4._(int ordinal, Object data)
      : _ordinal = ordinal,
        _data = data;

  final int _ordinal;
  final _data;

  UnionSize8Alignment4Tag get $tag => _UnionSize8Alignment4Tag_map[_ordinal];

  int get variant {
    if (_ordinal != 1) {
      return null;
    }
    return _data;
  }

  @override
  String toString() {
    switch (_ordinal) {
      case 1:
        return r'UnionSize8Alignment4.variant(' + variant.toString() + ')';
      default:
        return null;
    }
  }

  @override
  int get $ordinal => _ordinal;

  @override
  Object get $data => _data;

  static UnionSize8Alignment4 _ctor(int ordinal, Object data) {
    return UnionSize8Alignment4._(ordinal, data);
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionSize8Alignment4> kUnionSize8Alignment4_Type =
    $fidl.XUnionType<UnionSize8Alignment4>(
  members: <int, $fidl.FidlType>{
    1: $fidl.Uint32Type(),
  },
  ctor: UnionSize8Alignment4._ctor,
  nullable: false,
  flexible: false,
);
// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionSize8Alignment4> kUnionSize8Alignment4_OptType =
    $fidl.XUnionType<UnionSize8Alignment4>(
  members: <int, $fidl.FidlType>{
    1: $fidl.Uint32Type(),
  },
  ctor: UnionSize8Alignment4._ctor,
  nullable: true,
  flexible: false,
);

enum UnionSize12Alignment4Tag {
  variant, // 0x1
}

const Map<int, UnionSize12Alignment4Tag> _UnionSize12Alignment4Tag_map = {
  1: UnionSize12Alignment4Tag.variant,
};

class UnionSize12Alignment4 extends $fidl.XUnion {
  const UnionSize12Alignment4.withVariant(Uint8List value)
      : _ordinal = 1,
        _data = value;

  UnionSize12Alignment4._(int ordinal, Object data)
      : _ordinal = ordinal,
        _data = data;

  final int _ordinal;
  final _data;

  UnionSize12Alignment4Tag get $tag => _UnionSize12Alignment4Tag_map[_ordinal];

  Uint8List get variant {
    if (_ordinal != 1) {
      return null;
    }
    return _data;
  }

  @override
  String toString() {
    switch (_ordinal) {
      case 1:
        return r'UnionSize12Alignment4.variant(' + variant.toString() + ')';
      default:
        return null;
    }
  }

  @override
  int get $ordinal => _ordinal;

  @override
  Object get $data => _data;

  static UnionSize12Alignment4 _ctor(int ordinal, Object data) {
    return UnionSize12Alignment4._(ordinal, data);
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionSize12Alignment4> kUnionSize12Alignment4_Type =
    $fidl.XUnionType<UnionSize12Alignment4>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<Uint8List>(element: $fidl.Uint8Type(), elementCount: 6),
  },
  ctor: UnionSize12Alignment4._ctor,
  nullable: false,
  flexible: false,
);
// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionSize12Alignment4> kUnionSize12Alignment4_OptType =
    $fidl.XUnionType<UnionSize12Alignment4>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<Uint8List>(element: $fidl.Uint8Type(), elementCount: 6),
  },
  ctor: UnionSize12Alignment4._ctor,
  nullable: true,
  flexible: false,
);

enum UnionSize24Alignment8Tag {
  variant, // 0x1
}

const Map<int, UnionSize24Alignment8Tag> _UnionSize24Alignment8Tag_map = {
  1: UnionSize24Alignment8Tag.variant,
};

class UnionSize24Alignment8 extends $fidl.XUnion {
  const UnionSize24Alignment8.withVariant(StructSize16Alignment8 value)
      : _ordinal = 1,
        _data = value;

  UnionSize24Alignment8._(int ordinal, Object data)
      : _ordinal = ordinal,
        _data = data;

  final int _ordinal;
  final _data;

  UnionSize24Alignment8Tag get $tag => _UnionSize24Alignment8Tag_map[_ordinal];

  StructSize16Alignment8 get variant {
    if (_ordinal != 1) {
      return null;
    }
    return _data;
  }

  @override
  String toString() {
    switch (_ordinal) {
      case 1:
        return r'UnionSize24Alignment8.variant(' + variant.toString() + ')';
      default:
        return null;
    }
  }

  @override
  int get $ordinal => _ordinal;

  @override
  Object get $data => _data;

  static UnionSize24Alignment8 _ctor(int ordinal, Object data) {
    return UnionSize24Alignment8._(ordinal, data);
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionSize24Alignment8> kUnionSize24Alignment8_Type =
    $fidl.XUnionType<UnionSize24Alignment8>(
  members: <int, $fidl.FidlType>{
    1: kStructSize16Alignment8_Type,
  },
  ctor: UnionSize24Alignment8._ctor,
  nullable: false,
  flexible: false,
);
// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionSize24Alignment8> kUnionSize24Alignment8_OptType =
    $fidl.XUnionType<UnionSize24Alignment8>(
  members: <int, $fidl.FidlType>{
    1: kStructSize16Alignment8_Type,
  },
  ctor: UnionSize24Alignment8._ctor,
  nullable: true,
  flexible: false,
);

enum UnionSize36Alignment4Tag {
  variant, // 0x1
}

const Map<int, UnionSize36Alignment4Tag> _UnionSize36Alignment4Tag_map = {
  1: UnionSize36Alignment4Tag.variant,
};

class UnionSize36Alignment4 extends $fidl.XUnion {
  const UnionSize36Alignment4.withVariant(Uint8List value)
      : _ordinal = 1,
        _data = value;

  UnionSize36Alignment4._(int ordinal, Object data)
      : _ordinal = ordinal,
        _data = data;

  final int _ordinal;
  final _data;

  UnionSize36Alignment4Tag get $tag => _UnionSize36Alignment4Tag_map[_ordinal];

  Uint8List get variant {
    if (_ordinal != 1) {
      return null;
    }
    return _data;
  }

  @override
  String toString() {
    switch (_ordinal) {
      case 1:
        return r'UnionSize36Alignment4.variant(' + variant.toString() + ')';
      default:
        return null;
    }
  }

  @override
  int get $ordinal => _ordinal;

  @override
  Object get $data => _data;

  static UnionSize36Alignment4 _ctor(int ordinal, Object data) {
    return UnionSize36Alignment4._(ordinal, data);
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionSize36Alignment4> kUnionSize36Alignment4_Type =
    $fidl.XUnionType<UnionSize36Alignment4>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<Uint8List>(element: $fidl.Uint8Type(), elementCount: 32),
  },
  ctor: UnionSize36Alignment4._ctor,
  nullable: false,
  flexible: false,
);
// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionSize36Alignment4> kUnionSize36Alignment4_OptType =
    $fidl.XUnionType<UnionSize36Alignment4>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<Uint8List>(element: $fidl.Uint8Type(), elementCount: 32),
  },
  ctor: UnionSize36Alignment4._ctor,
  nullable: true,
  flexible: false,
);

class SandwichUnionSize8Alignment4 extends $fidl.Struct {
  const SandwichUnionSize8Alignment4({
    @required this.before,
    @required this.union,
    @required this.after,
  });
  SandwichUnionSize8Alignment4.clone(
    SandwichUnionSize8Alignment4 $orig, {
    int before,
    UnionSize8Alignment4 union,
    int after,
  }) : this(
          before: before ?? $orig.before,
          union: union ?? $orig.union,
          after: after ?? $orig.after,
        );

  final int before;
  final UnionSize8Alignment4 union;
  final int after;

  @override
  List<Object> get $fields {
    return <Object>[
      before,
      union,
      after,
    ];
  }

  static const $fieldType0 = $fidl.Uint32Type();
  static const $fieldType1 = kUnionSize8Alignment4_Type;
  static const $fieldType2 = $fidl.Uint32Type();

  @override
  void $encode($fidl.Encoder $encoder, int $offset) {
    $fieldType0.encode($encoder, before, $offset + 0);
    $fieldType1.encode($encoder, union, $offset + 8);
    $fieldType2.encode($encoder, after, $offset + 32);
  }

  @override
  String toString() {
    return r'SandwichUnionSize8Alignment4' r'(before: ' +
        before.toString() +
        r', union: ' +
        union.toString() +
        r', after: ' +
        after.toString() +
        r')';
  }

  static SandwichUnionSize8Alignment4 _structDecode(
      $fidl.Decoder $decoder, int $offset) {
    return SandwichUnionSize8Alignment4(
        before: $fieldType0.decode($decoder, $offset + 0),
        union: $fieldType1.decode($decoder, $offset + 8),
        after: $fieldType2.decode($decoder, $offset + 32));
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.StructType<SandwichUnionSize8Alignment4>
    kSandwichUnionSize8Alignment4_Type =
    $fidl.StructType<SandwichUnionSize8Alignment4>(
  inlineSize: 40,
  structDecode: SandwichUnionSize8Alignment4._structDecode,
);

class SandwichUnionSize12Alignment4 extends $fidl.Struct {
  const SandwichUnionSize12Alignment4({
    @required this.before,
    @required this.union,
    @required this.after,
  });
  SandwichUnionSize12Alignment4.clone(
    SandwichUnionSize12Alignment4 $orig, {
    int before,
    UnionSize12Alignment4 union,
    int after,
  }) : this(
          before: before ?? $orig.before,
          union: union ?? $orig.union,
          after: after ?? $orig.after,
        );

  final int before;
  final UnionSize12Alignment4 union;
  final int after;

  @override
  List<Object> get $fields {
    return <Object>[
      before,
      union,
      after,
    ];
  }

  static const $fieldType0 = $fidl.Uint32Type();
  static const $fieldType1 = kUnionSize12Alignment4_Type;
  static const $fieldType2 = $fidl.Int32Type();

  @override
  void $encode($fidl.Encoder $encoder, int $offset) {
    $fieldType0.encode($encoder, before, $offset + 0);
    $fieldType1.encode($encoder, union, $offset + 8);
    $fieldType2.encode($encoder, after, $offset + 32);
  }

  @override
  String toString() {
    return r'SandwichUnionSize12Alignment4' r'(before: ' +
        before.toString() +
        r', union: ' +
        union.toString() +
        r', after: ' +
        after.toString() +
        r')';
  }

  static SandwichUnionSize12Alignment4 _structDecode(
      $fidl.Decoder $decoder, int $offset) {
    return SandwichUnionSize12Alignment4(
        before: $fieldType0.decode($decoder, $offset + 0),
        union: $fieldType1.decode($decoder, $offset + 8),
        after: $fieldType2.decode($decoder, $offset + 32));
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.StructType<SandwichUnionSize12Alignment4>
    kSandwichUnionSize12Alignment4_Type =
    $fidl.StructType<SandwichUnionSize12Alignment4>(
  inlineSize: 40,
  structDecode: SandwichUnionSize12Alignment4._structDecode,
);

class StructSize16Alignment8 extends $fidl.Struct {
  const StructSize16Alignment8({
    @required this.f1,
    @required this.f2,
  });
  StructSize16Alignment8.clone(
    StructSize16Alignment8 $orig, {
    int f1,
    int f2,
  }) : this(
          f1: f1 ?? $orig.f1,
          f2: f2 ?? $orig.f2,
        );

  final int f1;
  final int f2;

  @override
  List<Object> get $fields {
    return <Object>[
      f1,
      f2,
    ];
  }

  static const $fieldType0 = $fidl.Uint64Type();
  static const $fieldType1 = $fidl.Uint64Type();

  @override
  void $encode($fidl.Encoder $encoder, int $offset) {
    $fieldType0.encode($encoder, f1, $offset + 0);
    $fieldType1.encode($encoder, f2, $offset + 8);
  }

  @override
  String toString() {
    return r'StructSize16Alignment8' r'(f1: ' +
        f1.toString() +
        r', f2: ' +
        f2.toString() +
        r')';
  }

  static StructSize16Alignment8 _structDecode(
      $fidl.Decoder $decoder, int $offset) {
    return StructSize16Alignment8(
        f1: $fieldType0.decode($decoder, $offset + 0),
        f2: $fieldType1.decode($decoder, $offset + 8));
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.StructType<StructSize16Alignment8> kStructSize16Alignment8_Type =
    $fidl.StructType<StructSize16Alignment8>(
  inlineSize: 16,
  structDecode: StructSize16Alignment8._structDecode,
);

class SandwichUnionSize24Alignment8 extends $fidl.Struct {
  const SandwichUnionSize24Alignment8({
    @required this.before,
    @required this.union,
    @required this.after,
  });
  SandwichUnionSize24Alignment8.clone(
    SandwichUnionSize24Alignment8 $orig, {
    int before,
    UnionSize24Alignment8 union,
    int after,
  }) : this(
          before: before ?? $orig.before,
          union: union ?? $orig.union,
          after: after ?? $orig.after,
        );

  final int before;
  final UnionSize24Alignment8 union;
  final int after;

  @override
  List<Object> get $fields {
    return <Object>[
      before,
      union,
      after,
    ];
  }

  static const $fieldType0 = $fidl.Uint32Type();
  static const $fieldType1 = kUnionSize24Alignment8_Type;
  static const $fieldType2 = $fidl.Uint32Type();

  @override
  void $encode($fidl.Encoder $encoder, int $offset) {
    $fieldType0.encode($encoder, before, $offset + 0);
    $fieldType1.encode($encoder, union, $offset + 8);
    $fieldType2.encode($encoder, after, $offset + 32);
  }

  @override
  String toString() {
    return r'SandwichUnionSize24Alignment8' r'(before: ' +
        before.toString() +
        r', union: ' +
        union.toString() +
        r', after: ' +
        after.toString() +
        r')';
  }

  static SandwichUnionSize24Alignment8 _structDecode(
      $fidl.Decoder $decoder, int $offset) {
    return SandwichUnionSize24Alignment8(
        before: $fieldType0.decode($decoder, $offset + 0),
        union: $fieldType1.decode($decoder, $offset + 8),
        after: $fieldType2.decode($decoder, $offset + 32));
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.StructType<SandwichUnionSize24Alignment8>
    kSandwichUnionSize24Alignment8_Type =
    $fidl.StructType<SandwichUnionSize24Alignment8>(
  inlineSize: 40,
  structDecode: SandwichUnionSize24Alignment8._structDecode,
);

class SandwichUnionSize36Alignment4 extends $fidl.Struct {
  const SandwichUnionSize36Alignment4({
    @required this.before,
    @required this.union,
    @required this.after,
  });
  SandwichUnionSize36Alignment4.clone(
    SandwichUnionSize36Alignment4 $orig, {
    int before,
    UnionSize36Alignment4 union,
    int after,
  }) : this(
          before: before ?? $orig.before,
          union: union ?? $orig.union,
          after: after ?? $orig.after,
        );

  final int before;
  final UnionSize36Alignment4 union;
  final int after;

  @override
  List<Object> get $fields {
    return <Object>[
      before,
      union,
      after,
    ];
  }

  static const $fieldType0 = $fidl.Uint32Type();
  static const $fieldType1 = kUnionSize36Alignment4_Type;
  static const $fieldType2 = $fidl.Uint32Type();

  @override
  void $encode($fidl.Encoder $encoder, int $offset) {
    $fieldType0.encode($encoder, before, $offset + 0);
    $fieldType1.encode($encoder, union, $offset + 8);
    $fieldType2.encode($encoder, after, $offset + 32);
  }

  @override
  String toString() {
    return r'SandwichUnionSize36Alignment4' r'(before: ' +
        before.toString() +
        r', union: ' +
        union.toString() +
        r', after: ' +
        after.toString() +
        r')';
  }

  static SandwichUnionSize36Alignment4 _structDecode(
      $fidl.Decoder $decoder, int $offset) {
    return SandwichUnionSize36Alignment4(
        before: $fieldType0.decode($decoder, $offset + 0),
        union: $fieldType1.decode($decoder, $offset + 8),
        after: $fieldType2.decode($decoder, $offset + 32));
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.StructType<SandwichUnionSize36Alignment4>
    kSandwichUnionSize36Alignment4_Type =
    $fidl.StructType<SandwichUnionSize36Alignment4>(
  inlineSize: 40,
  structDecode: SandwichUnionSize36Alignment4._structDecode,
);

// ignore: unused_element, avoid_private_typedef_functions
typedef _VoidCallback = void Function();
