// WARNING: This file is machine generated by fidlgen.

library fidl_test_fidl_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 $zx;

// 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

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 'UnionSize8Alignment4.variant($variant)';
      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 FIDL-308:
// 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 FIDL-308:
// 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 'UnionSize12Alignment4.variant($variant)';
      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 FIDL-308:
// 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 FIDL-308:
// 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 'UnionSize24Alignment8.variant($variant)';
      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 FIDL-308:
// 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 FIDL-308:
// 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 'UnionSize36Alignment4.variant($variant)';
      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 FIDL-308:
// 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 FIDL-308:
// 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,
        );

  SandwichUnionSize8Alignment4._(List<Object> argv)
      : before = argv[0],
        union = argv[1],
        after = argv[2];
  final int before;
  final UnionSize8Alignment4 union;
  final int after;

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

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

  static SandwichUnionSize8Alignment4 _ctor(List<Object> argv) =>
      SandwichUnionSize8Alignment4._(argv);
}

// See FIDL-308:
// ignore: recursive_compile_time_constant
const $fidl.StructType<SandwichUnionSize8Alignment4>
    kSandwichUnionSize8Alignment4_Type =
    $fidl.StructType<SandwichUnionSize8Alignment4>(
  inlineSizeOld: 16,
  inlineSizeV1: 40,
  members: <$fidl.MemberType>[
    $fidl.MemberType<int>(type: $fidl.Uint32Type(), offsetOld: 0, offsetV1: 0),
    $fidl.MemberType<UnionSize8Alignment4>(
        type: kUnionSize8Alignment4_Type, offsetOld: 4, offsetV1: 8),
    $fidl.MemberType<int>(
        type: $fidl.Uint32Type(), offsetOld: 12, offsetV1: 32),
  ],
  ctor: SandwichUnionSize8Alignment4._ctor,
);

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,
        );

  SandwichUnionSize12Alignment4._(List<Object> argv)
      : before = argv[0],
        union = argv[1],
        after = argv[2];
  final int before;
  final UnionSize12Alignment4 union;
  final int after;

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

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

  static SandwichUnionSize12Alignment4 _ctor(List<Object> argv) =>
      SandwichUnionSize12Alignment4._(argv);
}

// See FIDL-308:
// ignore: recursive_compile_time_constant
const $fidl.StructType<SandwichUnionSize12Alignment4>
    kSandwichUnionSize12Alignment4_Type =
    $fidl.StructType<SandwichUnionSize12Alignment4>(
  inlineSizeOld: 20,
  inlineSizeV1: 40,
  members: <$fidl.MemberType>[
    $fidl.MemberType<int>(type: $fidl.Uint32Type(), offsetOld: 0, offsetV1: 0),
    $fidl.MemberType<UnionSize12Alignment4>(
        type: kUnionSize12Alignment4_Type, offsetOld: 4, offsetV1: 8),
    $fidl.MemberType<int>(type: $fidl.Int32Type(), offsetOld: 16, offsetV1: 32),
  ],
  ctor: SandwichUnionSize12Alignment4._ctor,
);

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,
        );

  StructSize16Alignment8._(List<Object> argv)
      : f1 = argv[0],
        f2 = argv[1];
  final int f1;
  final int f2;

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

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

  static StructSize16Alignment8 _ctor(List<Object> argv) =>
      StructSize16Alignment8._(argv);
}

// See FIDL-308:
// ignore: recursive_compile_time_constant
const $fidl.StructType<StructSize16Alignment8> kStructSize16Alignment8_Type =
    $fidl.StructType<StructSize16Alignment8>(
  inlineSizeOld: 16,
  inlineSizeV1: 16,
  members: <$fidl.MemberType>[
    $fidl.MemberType<int>(type: $fidl.Uint64Type(), offsetOld: 0, offsetV1: 0),
    $fidl.MemberType<int>(type: $fidl.Uint64Type(), offsetOld: 8, offsetV1: 8),
  ],
  ctor: StructSize16Alignment8._ctor,
);

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,
        );

  SandwichUnionSize24Alignment8._(List<Object> argv)
      : before = argv[0],
        union = argv[1],
        after = argv[2];
  final int before;
  final UnionSize24Alignment8 union;
  final int after;

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

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

  static SandwichUnionSize24Alignment8 _ctor(List<Object> argv) =>
      SandwichUnionSize24Alignment8._(argv);
}

// See FIDL-308:
// ignore: recursive_compile_time_constant
const $fidl.StructType<SandwichUnionSize24Alignment8>
    kSandwichUnionSize24Alignment8_Type =
    $fidl.StructType<SandwichUnionSize24Alignment8>(
  inlineSizeOld: 40,
  inlineSizeV1: 40,
  members: <$fidl.MemberType>[
    $fidl.MemberType<int>(type: $fidl.Uint32Type(), offsetOld: 0, offsetV1: 0),
    $fidl.MemberType<UnionSize24Alignment8>(
        type: kUnionSize24Alignment8_Type, offsetOld: 8, offsetV1: 8),
    $fidl.MemberType<int>(
        type: $fidl.Uint32Type(), offsetOld: 32, offsetV1: 32),
  ],
  ctor: SandwichUnionSize24Alignment8._ctor,
);

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,
        );

  SandwichUnionSize36Alignment4._(List<Object> argv)
      : before = argv[0],
        union = argv[1],
        after = argv[2];
  final int before;
  final UnionSize36Alignment4 union;
  final int after;

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

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

  static SandwichUnionSize36Alignment4 _ctor(List<Object> argv) =>
      SandwichUnionSize36Alignment4._(argv);
}

// See FIDL-308:
// ignore: recursive_compile_time_constant
const $fidl.StructType<SandwichUnionSize36Alignment4>
    kSandwichUnionSize36Alignment4_Type =
    $fidl.StructType<SandwichUnionSize36Alignment4>(
  inlineSizeOld: 44,
  inlineSizeV1: 40,
  members: <$fidl.MemberType>[
    $fidl.MemberType<int>(type: $fidl.Uint32Type(), offsetOld: 0, offsetV1: 0),
    $fidl.MemberType<UnionSize36Alignment4>(
        type: kUnionSize36Alignment4_Type, offsetOld: 4, offsetV1: 8),
    $fidl.MemberType<int>(
        type: $fidl.Uint32Type(), offsetOld: 40, offsetV1: 32),
  ],
  ctor: SandwichUnionSize36Alignment4._ctor,
);

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