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

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;
  }

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

  @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.XUnionType<UnionSmallArray> kUnionSmallArray_Type =
    $fidl.XUnionType<UnionSmallArray>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 2),
  },
  ctor: UnionSmallArray._ctor,
  nullable: false,
  flexible: false,
);
// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionSmallArray> kUnionSmallArray_OptType =
    $fidl.XUnionType<UnionSmallArray>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 2),
  },
  ctor: UnionSmallArray._ctor,
  nullable: true,
  flexible: 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;
  }

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

  @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.XUnionType<UnionLargeArray> kUnionLargeArray_Type =
    $fidl.XUnionType<UnionLargeArray>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 100),
  },
  ctor: UnionLargeArray._ctor,
  nullable: false,
  flexible: false,
);
// See fxbug.dev/7644:
// ignore: recursive_compile_time_constant
const $fidl.XUnionType<UnionLargeArray> kUnionLargeArray_OptType =
    $fidl.XUnionType<UnionLargeArray>(
  members: <int, $fidl.FidlType>{
    1: $fidl.ArrayType<Uint32List>(
        element: $fidl.Uint32Type(), elementCount: 100),
  },
  ctor: UnionLargeArray._ctor,
  nullable: true,
  flexible: 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<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<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<Uint32List>(element: $fidl.Uint32Type(), elementCount: 2),
  ],
  ctor: TableSmallArray._ctor,
);

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<Uint32List>(element: $fidl.Uint32Type(), elementCount: 100),
  ],
  ctor: TableLargeArray._ctor,
);

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