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

library fidl_fidl_test_arrays_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 UnionSmallArrayTag {
  a, // 0x1
}

const Map<int, UnionSmallArrayTag> _UnionSmallArrayTag_map = {
  1: UnionSmallArrayTag.a,
};

class UnionSmallArray extends $fidl.XUnion {
  const UnionSmallArray.withA(Uint32List value)
      : _ordinal = 1,
        _data = value;

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

  final int _ordinal;
  final _data;

  UnionSmallArrayTag get $tag => _UnionSmallArrayTag_map[_ordinal]!;

  Uint32List? get a {
    if (_ordinal != 1) {
      return null;
    }
    return _data;
  }

  $fidl.UnknownRawData? get $unknownData {
    switch (_ordinal) {
      case 1:
        return null;
      default:
        return _data;
    }
  }

  @override
  String toString() {
    switch (_ordinal) {
      case 1:
        return r'UnionSmallArray.a(' + a.toString() + ')';
      default:
        return r'UnionSmallArray.<UNKNOWN>';
    }
  }

  @override
  int get $ordinal => _ordinal;

  @override
  Object get $data => _data;

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

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.UnionType<UnionSmallArray> kUnionSmallArray_Type =
    $fidl.UnionType<UnionSmallArray>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<int, Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 2),
  },
  ctor: UnionSmallArray._ctor,
  flexible: false,
  resource: false,
);
// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.NullableUnionType<UnionSmallArray> kUnionSmallArray_OptType =
    $fidl.NullableUnionType<UnionSmallArray>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<int, Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 2),
  },
  ctor: UnionSmallArray._ctor,
  flexible: false,
  resource: false,
);

enum UnionLargeArrayTag {
  a, // 0x1
}

const Map<int, UnionLargeArrayTag> _UnionLargeArrayTag_map = {
  1: UnionLargeArrayTag.a,
};

class UnionLargeArray extends $fidl.XUnion {
  const UnionLargeArray.withA(Uint32List value)
      : _ordinal = 1,
        _data = value;

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

  final int _ordinal;
  final _data;

  UnionLargeArrayTag get $tag => _UnionLargeArrayTag_map[_ordinal]!;

  Uint32List? get a {
    if (_ordinal != 1) {
      return null;
    }
    return _data;
  }

  $fidl.UnknownRawData? get $unknownData {
    switch (_ordinal) {
      case 1:
        return null;
      default:
        return _data;
    }
  }

  @override
  String toString() {
    switch (_ordinal) {
      case 1:
        return r'UnionLargeArray.a(' + a.toString() + ')';
      default:
        return r'UnionLargeArray.<UNKNOWN>';
    }
  }

  @override
  int get $ordinal => _ordinal;

  @override
  Object get $data => _data;

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

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.UnionType<UnionLargeArray> kUnionLargeArray_Type =
    $fidl.UnionType<UnionLargeArray>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<int, Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 100),
  },
  ctor: UnionLargeArray._ctor,
  flexible: false,
  resource: false,
);
// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.NullableUnionType<UnionLargeArray> kUnionLargeArray_OptType =
    $fidl.NullableUnionType<UnionLargeArray>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<int, Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 100),
  },
  ctor: UnionLargeArray._ctor,
  flexible: false,
  resource: false,
);

class StructSmallArray extends $fidl.Struct {
  const StructSmallArray({
    required this.a,
  });
  StructSmallArray.clone(
    StructSmallArray $orig, {
    Uint32List? a,
  }) : this(
          a: a ?? $orig.a,
        );

  final Uint32List a;

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

  static const $fieldType0 = $fidl.ArrayType<int, Uint32List>(
      element: $fidl.Uint32Type(), elementCount: 2);

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

  @override
  String toString() {
    return r'StructSmallArray' r'(a: ' + a.toString() + r')';
  }

  static StructSmallArray _structDecode($fidl.Decoder $decoder, int $offset) {
    return StructSmallArray(a: $fieldType0.decode($decoder, $offset + 0));
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.StructType<StructSmallArray> kStructSmallArray_Type =
    $fidl.StructType<StructSmallArray>(
  inlineSize: 8,
  structDecode: StructSmallArray._structDecode,
);

class StructLargeArray extends $fidl.Struct {
  const StructLargeArray({
    required this.a,
  });
  StructLargeArray.clone(
    StructLargeArray $orig, {
    Uint32List? a,
  }) : this(
          a: a ?? $orig.a,
        );

  final Uint32List a;

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

  static const $fieldType0 = $fidl.ArrayType<int, Uint32List>(
      element: $fidl.Uint32Type(), elementCount: 100);

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

  @override
  String toString() {
    return r'StructLargeArray' r'(a: ' + a.toString() + r')';
  }

  static StructLargeArray _structDecode($fidl.Decoder $decoder, int $offset) {
    return StructLargeArray(a: $fieldType0.decode($decoder, $offset + 0));
  }
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.StructType<StructLargeArray> kStructLargeArray_Type =
    $fidl.StructType<StructLargeArray>(
  inlineSize: 400,
  structDecode: StructLargeArray._structDecode,
);

class TableSmallArray extends $fidl.Table {
  const TableSmallArray({
    this.$unknownData,
    this.a,
  });

  TableSmallArray._(Map<int, dynamic> argv, this.$unknownData) : a = argv[1];

  @override
  final Map<int, $fidl.UnknownRawData>? $unknownData;
  final Uint32List? a;

  @override
  dynamic $field(int index) {
    switch (index) {
      case 0:
        return a;
    }
    return null;
  }

  @override
  Map<int, dynamic> get $fields {
    return {
      1: a,
    };
  }

  static TableSmallArray _ctor(Map<int, dynamic> argv,
          [Map<int, $fidl.UnknownRawData>? unknownData]) =>
      TableSmallArray._(argv, unknownData);
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.TableType<TableSmallArray> kTableSmallArray_Type =
    $fidl.TableType<TableSmallArray>(
  inlineSize: 16,
  members: [
    $fidl.ArrayType<int, Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 2),
  ],
  ctor: TableSmallArray._ctor,
  resource: false,
);

class TableLargeArray extends $fidl.Table {
  const TableLargeArray({
    this.$unknownData,
    this.a,
  });

  TableLargeArray._(Map<int, dynamic> argv, this.$unknownData) : a = argv[1];

  @override
  final Map<int, $fidl.UnknownRawData>? $unknownData;
  final Uint32List? a;

  @override
  dynamic $field(int index) {
    switch (index) {
      case 0:
        return a;
    }
    return null;
  }

  @override
  Map<int, dynamic> get $fields {
    return {
      1: a,
    };
  }

  static TableLargeArray _ctor(Map<int, dynamic> argv,
          [Map<int, $fidl.UnknownRawData>? unknownData]) =>
      TableLargeArray._(argv, unknownData);
}

// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.TableType<TableLargeArray> kTableLargeArray_Type =
    $fidl.TableType<TableLargeArray>(
  inlineSize: 16,
  members: [
    $fidl.ArrayType<int, Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 100),
  ],
  ctor: TableLargeArray._ctor,
  resource: false,
);

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