// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// TODO(37581): Generate this file.

// These micro benchmarks track the speed of reading and writing C memory from
// Dart with a specific marshalling and unmarshalling of data.

import 'dart:ffi';
import 'dart:io';

import 'package:ffi/ffi.dart';
import 'package:benchmark_harness/benchmark_harness.dart';

import 'dlopen_helper.dart';

//
// Trampoline functions.
//

DynamicLibrary ffiTestFunctions = dlopenPlatformSpecific('native_functions',
    path: Platform.script.resolve('../native/out/').path);

typedef NativeFunction1Uint8 = Uint8 Function(Uint8);
typedef Function1int = int Function(int);
final function1Uint8 = ffiTestFunctions
    .lookupFunction<NativeFunction1Uint8, Function1int>('Function1Uint8');

typedef NativeFunction1Uint16 = Uint16 Function(Uint16);
final function1Uint16 = ffiTestFunctions
    .lookupFunction<NativeFunction1Uint16, Function1int>('Function1Uint16');

typedef NativeFunction1Uint32 = Uint32 Function(Uint32);
final function1Uint32 = ffiTestFunctions
    .lookupFunction<NativeFunction1Uint32, Function1int>('Function1Uint32');

typedef NativeFunction1Uint64 = Uint64 Function(Uint64);
final function1Uint64 = ffiTestFunctions
    .lookupFunction<NativeFunction1Uint64, Function1int>('Function1Uint64');

typedef NativeFunction1Int8 = Int8 Function(Int8);
final function1Int8 = ffiTestFunctions
    .lookupFunction<NativeFunction1Int8, Function1int>('Function1Int8');

typedef NativeFunction1Int16 = Int16 Function(Int16);
final function1Int16 = ffiTestFunctions
    .lookupFunction<NativeFunction1Int16, Function1int>('Function1Int16');

typedef NativeFunction1Int32 = Int32 Function(Int32);
final function1Int32 = ffiTestFunctions
    .lookupFunction<NativeFunction1Int32, Function1int>('Function1Int32');

typedef NativeFunction2Int32 = Int32 Function(Int32, Int32);
typedef Function2int = int Function(int, int);
final function2Int32 = ffiTestFunctions
    .lookupFunction<NativeFunction2Int32, Function2int>('Function2Int32');

typedef NativeFunction4Int32 = Int32 Function(Int32, Int32, Int32, Int32);
typedef Function4int = int Function(int, int, int, int);
final function4Int32 = ffiTestFunctions
    .lookupFunction<NativeFunction4Int32, Function4int>('Function4Int32');

typedef NativeFunction10Int32 = Int32 Function(
    Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32);
typedef Function10int = int Function(
    int, int, int, int, int, int, int, int, int, int);
final function10Int32 = ffiTestFunctions
    .lookupFunction<NativeFunction10Int32, Function10int>('Function10Int32');

typedef NativeFunction20Int32 = Int32 Function(
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32,
    Int32);
typedef Function20int = int Function(int, int, int, int, int, int, int, int,
    int, int, int, int, int, int, int, int, int, int, int, int);
final function20Int32 = ffiTestFunctions
    .lookupFunction<NativeFunction20Int32, Function20int>('Function20Int32');

typedef NativeFunction1Int64 = Int64 Function(Int64);
final function1Int64 = ffiTestFunctions
    .lookupFunction<NativeFunction1Int64, Function1int>('Function1Int64');

typedef NativeFunction2Int64 = Int64 Function(Int64, Int64);
final function2Int64 = ffiTestFunctions
    .lookupFunction<NativeFunction2Int64, Function2int>('Function2Int64');

typedef NativeFunction4Int64 = Int64 Function(Int64, Int64, Int64, Int64);
final function4Int64 = ffiTestFunctions
    .lookupFunction<NativeFunction4Int64, Function4int>('Function4Int64');

typedef NativeFunction10Int64 = Int64 Function(
    Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64);
final function10Int64 = ffiTestFunctions
    .lookupFunction<NativeFunction10Int64, Function10int>('Function10Int64');

typedef NativeFunction20Int64 = Int64 Function(
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64,
    Int64);
final function20Int64 = ffiTestFunctions
    .lookupFunction<NativeFunction20Int64, Function20int>('Function20Int64');

typedef NativeFunction1Float = Float Function(Float);
typedef Function1double = double Function(double);
final function1Float = ffiTestFunctions
    .lookupFunction<NativeFunction1Float, Function1double>('Function1Float');

typedef NativeFunction2Float = Float Function(Float, Float);
typedef Function2double = double Function(double, double);
final function2Float = ffiTestFunctions
    .lookupFunction<NativeFunction2Float, Function2double>('Function2Float');

typedef NativeFunction4Float = Float Function(Float, Float, Float, Float);
typedef Function4double = double Function(double, double, double, double);
final function4Float = ffiTestFunctions
    .lookupFunction<NativeFunction4Float, Function4double>('Function4Float');

typedef NativeFunction10Float = Float Function(
    Float, Float, Float, Float, Float, Float, Float, Float, Float, Float);
typedef Function10double = double Function(double, double, double, double,
    double, double, double, double, double, double);
final function10Float = ffiTestFunctions
    .lookupFunction<NativeFunction10Float, Function10double>('Function10Float');

typedef NativeFunction20Float = Float Function(
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float,
    Float);
typedef Function20double = double Function(
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double,
    double);
final function20Float = ffiTestFunctions
    .lookupFunction<NativeFunction20Float, Function20double>('Function20Float');

typedef NativeFunction1Double = Double Function(Double);
final function1Double = ffiTestFunctions
    .lookupFunction<NativeFunction1Double, Function1double>('Function1Double');

typedef NativeFunction2Double = Double Function(Double, Double);
final function2Double = ffiTestFunctions
    .lookupFunction<NativeFunction2Double, Function2double>('Function1Double');

typedef NativeFunction4Double = Double Function(Double, Double, Double, Double);
final function4Double = ffiTestFunctions
    .lookupFunction<NativeFunction4Double, Function4double>('Function1Double');

typedef NativeFunction10Double = Double Function(Double, Double, Double, Double,
    Double, Double, Double, Double, Double, Double);
Function10double function10Double =
    ffiTestFunctions.lookupFunction<NativeFunction10Double, Function10double>(
        'Function10Double');

typedef NativeFunction20Double = Double Function(
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double);
Function20double function20Double =
    ffiTestFunctions.lookupFunction<NativeFunction20Double, Function20double>(
        'Function20Double');

typedef Function1PointerUint8 = Pointer<Uint8> Function(Pointer<Uint8>);
final function1PointerUint8 = ffiTestFunctions.lookupFunction<
    Function1PointerUint8, Function1PointerUint8>('Function1PointerUint8');

typedef Function2PointerUint8 = Pointer<Uint8> Function(
    Pointer<Uint8>, Pointer<Uint8>);
final function2PointerUint8 = ffiTestFunctions.lookupFunction<
    Function2PointerUint8, Function2PointerUint8>('Function2PointerUint8');

typedef Function4PointerUint8 = Pointer<Uint8> Function(
    Pointer<Uint8>, Pointer<Uint8>, Pointer<Uint8>, Pointer<Uint8>);
final function4PointerUint8 = ffiTestFunctions.lookupFunction<
    Function4PointerUint8, Function4PointerUint8>('Function4PointerUint8');

typedef Function10PointerUint8 = Pointer<Uint8> Function(
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>);
final function10PointerUint8 = ffiTestFunctions.lookupFunction<
    Function10PointerUint8, Function10PointerUint8>('Function10PointerUint8');

typedef Function20PointerUint8 = Pointer<Uint8> Function(
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>,
    Pointer<Uint8>);
final function20PointerUint8 = ffiTestFunctions.lookupFunction<
    Function20PointerUint8, Function20PointerUint8>('Function20PointerUint8');

final function1handle = ffiTestFunctions.lookupFunction<Handle Function(Handle),
    Object Function(Object)>('Function1Handle');

final function2handle = ffiTestFunctions.lookupFunction<
    Handle Function(Handle, Handle),
    Object Function(Object, Object)>('Function2Handle');

final function4handle = ffiTestFunctions.lookupFunction<
    Handle Function(Handle, Handle, Handle, Handle),
    Object Function(Object, Object, Object, Object)>('Function4Handle');

final function10handle = ffiTestFunctions.lookupFunction<
    Handle Function(Handle, Handle, Handle, Handle, Handle, Handle, Handle,
        Handle, Handle, Handle),
    Object Function(Object, Object, Object, Object, Object, Object, Object,
        Object, Object, Object)>('Function10Handle');

final function20handle = ffiTestFunctions.lookupFunction<
    Handle Function(
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle,
        Handle),
    Object Function(
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object,
        Object)>('Function20Handle');

//
// Trampoline call.
//

int doCall1Uint8(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function1Uint8(17);
  }
  return x;
}

int doCall1Uint16(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function1Uint16(17);
  }
  return x;
}

int doCall1Uint32(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function1Uint32(i);
  }
  return x;
}

int doCall1Uint64(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function1Uint64(i);
  }
  return x;
}

int doCall1Int8(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function1Int8(17);
  }
  return x;
}

int doCall1Int16(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function1Int16(17);
  }
  return x;
}

int doCall1Int32(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function1Int32(i);
  }
  return x;
}

int doCall2Int32(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function2Int32(i, i);
  }
  return x;
}

int doCall4Int32(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function4Int32(i, i, i, i);
  }
  return x;
}

int doCall10Int32(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function10Int32(i, i, i, i, i, i, i, i, i, i);
  }
  return x;
}

int doCall20Int32(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function20Int32(
        i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
  }
  return x;
}

int doCall1Int64(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function1Int64(i);
  }
  return x;
}

int doCall2Int64(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function2Int64(i, i);
  }
  return x;
}

int doCall4Int64(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function4Int64(i, i, i, i);
  }
  return x;
}

int doCall10Int64(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function10Int64(i, i, i, i, i, i, i, i, i, i);
  }
  return x;
}

int doCall20Int64(int length) {
  int x = 0;
  for (int i = 0; i < length; i++) {
    x += function20Int64(
        i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
  }
  return x;
}

int doCall1Int64Mint(int length) {
  int x = 0x7FFFFFFF00000000;

  for (int i = 0; i < length; i++) {
    x = function1Int64(x);
  }
  return x;
}

double doCall1Float(int length) {
  double x = 0.0;
  for (int i = 0; i < length; i++) {
    x += function1Float(17.0);
  }
  return x;
}

double doCall2Float(int length) {
  double x = 0;
  for (int i = 0; i < length; i++) {
    x += function2Float(1.0, 2.0);
  }
  return x;
}

double doCall4Float(int length) {
  double x = 0;
  for (int i = 0; i < length; i++) {
    x += function4Float(1.0, 2.0, 3.0, 4.0);
  }
  return x;
}

double doCall10Float(int length) {
  double x = 0;
  for (int i = 0; i < length; i++) {
    x += function10Float(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
  }
  return x;
}

double doCall20Float(int length) {
  double x = 0;
  for (int i = 0; i < length; i++) {
    x += function20Float(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
        11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0);
  }
  return x;
}

double doCall1Double(int length) {
  double x = 0.0;
  for (int i = 0; i < length; i++) {
    x += function1Double(17.0);
  }
  return x;
}

double doCall2Double(int length) {
  double x = 0;
  for (int i = 0; i < length; i++) {
    x += function2Double(1.0, 2.0);
  }
  return x;
}

double doCall4Double(int length) {
  double x = 0;
  for (int i = 0; i < length; i++) {
    x += function4Double(1.0, 2.0, 3.0, 4.0);
  }
  return x;
}

double doCall10Double(int length) {
  double x = 0;
  for (int i = 0; i < length; i++) {
    x += function10Double(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
  }
  return x;
}

double doCall20Double(int length) {
  double x = 0;
  for (int i = 0; i < length; i++) {
    x += function20Double(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,
        11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0);
  }
  return x;
}

Pointer<Uint8> doCall1PointerUint8(int length, Pointer<Uint8> p1) {
  Pointer<Uint8> x = p1;
  for (int i = 0; i < length; i++) {
    x = function1PointerUint8(x);
  }
  return x;
}

Pointer<Uint8> doCall2PointerUint8(
    int length, Pointer<Uint8> p1, Pointer<Uint8> p2) {
  Pointer<Uint8> x = p1;
  for (int i = 0; i < length; i++) {
    x = function2PointerUint8(x, p2);
  }
  return x;
}

Pointer<Uint8> doCall4PointerUint8(int length, Pointer<Uint8> p1,
    Pointer<Uint8> p2, Pointer<Uint8> p3, Pointer<Uint8> p4) {
  Pointer<Uint8> x = p1;
  for (int i = 0; i < length; i++) {
    x = function4PointerUint8(x, p2, p3, p4);
  }
  return x;
}

Pointer<Uint8> doCall10PointerUint8(
    int length,
    Pointer<Uint8> p1,
    Pointer<Uint8> p2,
    Pointer<Uint8> p3,
    Pointer<Uint8> p4,
    Pointer<Uint8> p5,
    Pointer<Uint8> p6,
    Pointer<Uint8> p7,
    Pointer<Uint8> p8,
    Pointer<Uint8> p9,
    Pointer<Uint8> p10) {
  Pointer<Uint8> x = p1;
  for (int i = 0; i < length; i++) {
    x = function10PointerUint8(x, p2, p3, p4, p5, p6, p7, p8, p9, p10);
  }
  return x;
}

Pointer<Uint8> doCall20PointerUint8(
    int length,
    Pointer<Uint8> p1,
    Pointer<Uint8> p2,
    Pointer<Uint8> p3,
    Pointer<Uint8> p4,
    Pointer<Uint8> p5,
    Pointer<Uint8> p6,
    Pointer<Uint8> p7,
    Pointer<Uint8> p8,
    Pointer<Uint8> p9,
    Pointer<Uint8> p10,
    Pointer<Uint8> p11,
    Pointer<Uint8> p12,
    Pointer<Uint8> p13,
    Pointer<Uint8> p14,
    Pointer<Uint8> p15,
    Pointer<Uint8> p16,
    Pointer<Uint8> p17,
    Pointer<Uint8> p18,
    Pointer<Uint8> p19,
    Pointer<Uint8> p20) {
  Pointer<Uint8> x = p1;
  for (int i = 0; i < length; i++) {
    x = function20PointerUint8(x, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12,
        p13, p14, p15, p16, p17, p18, p19, p20);
  }
  return x;
}

Object doCall1Handle(int length, Object p1) {
  Object x = p1;
  for (int i = 0; i < length; i++) {
    x = function1handle(x);
  }
  return x;
}

Object doCall2Handle(int length, Object p1, Object p2) {
  Object x = p1;
  for (int i = 0; i < length; i++) {
    x = function2handle(x, p2);
  }
  return x;
}

Object doCall4Handle(int length, Object p1, Object p2, Object p3, Object p4) {
  Object x = p1;
  for (int i = 0; i < length; i++) {
    x = function4handle(x, p2, p3, p4);
  }
  return x;
}

Object doCall10Handle(int length, Object p1, Object p2, Object p3, Object p4,
    Object p5, Object p6, Object p7, Object p8, Object p9, Object p10) {
  Object x = p1;
  for (int i = 0; i < length; i++) {
    x = function10handle(x, p2, p3, p4, p5, p6, p7, p8, p9, p10);
  }
  return x;
}

Object doCall20Handle(
    int length,
    Object p1,
    Object p2,
    Object p3,
    Object p4,
    Object p5,
    Object p6,
    Object p7,
    Object p8,
    Object p9,
    Object p10,
    Object p11,
    Object p12,
    Object p13,
    Object p14,
    Object p15,
    Object p16,
    Object p17,
    Object p18,
    Object p19,
    Object p20) {
  Object x = p1;
  for (int i = 0; i < length; i++) {
    x = function20handle(x, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13,
        p14, p15, p16, p17, p18, p19, p20);
  }
  return x;
}

//
// Benchmark fixtures.
//

// Number of repeats: 1000
//  * CPU: Intel(R) Xeon(R) Gold 6154
//    * Architecture: x64
//      * 200 - 1100 us
const N = 1000;

class Uint8x01 extends BenchmarkBase {
  Uint8x01() : super('FfiCall.Uint8x01');

  @override
  void run() {
    final int x = doCall1Uint8(N);
    if (x != N * 17 + N * 42) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Uint16x01 extends BenchmarkBase {
  Uint16x01() : super('FfiCall.Uint16x01');

  @override
  void run() {
    final int x = doCall1Uint16(N);
    if (x != N * 17 + N * 42) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Uint32x01 extends BenchmarkBase {
  Uint32x01() : super('FfiCall.Uint32x01');

  @override
  void run() {
    final int x = doCall1Uint32(N);
    if (x != N * (N - 1) / 2 + N * 42) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Uint64x01 extends BenchmarkBase {
  Uint64x01() : super('FfiCall.Uint64x01');

  @override
  void run() {
    final int x = doCall1Uint64(N);
    if (x != N * (N - 1) / 2 + N * 42) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int8x01 extends BenchmarkBase {
  Int8x01() : super('FfiCall.Int8x01');

  @override
  void run() {
    final int x = doCall1Int8(N);
    if (x != N * 17 + N * 42) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int16x01 extends BenchmarkBase {
  Int16x01() : super('FfiCall.Int16x01');

  @override
  void run() {
    final int x = doCall1Int16(N);
    if (x != N * 17 + N * 42) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int32x01 extends BenchmarkBase {
  Int32x01() : super('FfiCall.Int32x01');

  @override
  void run() {
    final int x = doCall1Int32(N);
    if (x != N * (N - 1) / 2 + N * 42) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int32x02 extends BenchmarkBase {
  Int32x02() : super('FfiCall.Int32x02');

  @override
  void run() {
    final int x = doCall2Int32(N);
    if (x != N * (N - 1) * 2 / 2) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int32x04 extends BenchmarkBase {
  Int32x04() : super('FfiCall.Int32x04');

  @override
  void run() {
    final int x = doCall4Int32(N);
    if (x != N * (N - 1) * 4 / 2) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int32x10 extends BenchmarkBase {
  Int32x10() : super('FfiCall.Int32x10');

  @override
  void run() {
    final int x = doCall10Int32(N);
    if (x != N * (N - 1) * 10 / 2) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int32x20 extends BenchmarkBase {
  Int32x20() : super('FfiCall.Int32x20');

  @override
  void run() {
    final int x = doCall20Int32(N);
    if (x != N * (N - 1) * 20 / 2) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int64x01 extends BenchmarkBase {
  Int64x01() : super('FfiCall.Int64x01');

  @override
  void run() {
    final int x = doCall1Int64(N);
    if (x != N * (N - 1) / 2 + N * 42) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int64x02 extends BenchmarkBase {
  Int64x02() : super('FfiCall.Int64x02');

  @override
  void run() {
    final int x = doCall2Int64(N);
    if (x != N * (N - 1) * 2 / 2) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int64x04 extends BenchmarkBase {
  Int64x04() : super('FfiCall.Int64x04');

  @override
  void run() {
    final int x = doCall4Int64(N);
    if (x != N * (N - 1) * 4 / 2) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int64x10 extends BenchmarkBase {
  Int64x10() : super('FfiCall.Int64x10');

  @override
  void run() {
    final int x = doCall10Int64(N);
    if (x != N * (N - 1) * 10 / 2) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int64x20 extends BenchmarkBase {
  Int64x20() : super('FfiCall.Int64x20');

  @override
  void run() {
    final int x = doCall20Int64(N);
    if (x != N * (N - 1) * 20 / 2) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Int64Mintx01 extends BenchmarkBase {
  Int64Mintx01() : super('FfiCall.Int64Mintx01');

  @override
  void run() {
    final int x = doCall1Int64Mint(N);
    if (x != 0x7FFFFFFF00000000 + N * 42) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Floatx01 extends BenchmarkBase {
  Floatx01() : super('FfiCall.Floatx01');

  @override
  void run() {
    final double x = doCall1Float(N);
    final double expected = N * (N - 1) / 2 + N * 42;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Floatx02 extends BenchmarkBase {
  Floatx02() : super('FfiCall.Floatx02');

  @override
  void run() {
    final double x = doCall2Float(N);
    final double expected = N * 55.0;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Floatx04 extends BenchmarkBase {
  Floatx04() : super('FfiCall.Floatx04');

  @override
  void run() {
    final double x = doCall4Float(N);
    final double expected = N * 55.0;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Floatx10 extends BenchmarkBase {
  Floatx10() : super('FfiCall.Floatx10');

  @override
  void run() {
    final double x = doCall10Float(N);
    final double expected = N * 55.0;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Floatx20 extends BenchmarkBase {
  Floatx20() : super('FfiCall.Floatx20');

  @override
  void run() {
    final double x = doCall20Float(N);
    final double expected = N * 220.0;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Doublex01 extends BenchmarkBase {
  Doublex01() : super('FfiCall.Doublex01');

  @override
  void run() {
    final double x = doCall1Double(N);
    final double expected = N * (N - 1) / 2 + N * 42;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Doublex02 extends BenchmarkBase {
  Doublex02() : super('FfiCall.Doublex02');

  @override
  void run() {
    final double x = doCall2Double(N);
    final double expected = N * 55.0;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Doublex04 extends BenchmarkBase {
  Doublex04() : super('FfiCall.Doublex04');

  @override
  void run() {
    final double x = doCall4Double(N);
    final double expected = N * 55.0;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Doublex10 extends BenchmarkBase {
  Doublex10() : super('FfiCall.Doublex10');

  @override
  void run() {
    final double x = doCall10Double(N);
    final double expected = N * 55.0;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Doublex20 extends BenchmarkBase {
  Doublex20() : super('FfiCall.Doublex20');

  @override
  void run() {
    final double x = doCall20Double(N);
    final double expected = N * 220.0;
    if (0.999 * expected > x && x > 1.001 * expected) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class PointerUint8x01 extends BenchmarkBase {
  PointerUint8x01() : super('FfiCall.PointerUint8x01');

  Pointer<Uint8> pointer;
  @override
  void setup() => pointer = allocate(count: N + 1);
  @override
  void teardown() => free(pointer);

  @override
  void run() {
    final Pointer<Uint8> x = doCall1PointerUint8(N, pointer);
    if (x.address != pointer.address + N) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class PointerUint8x02 extends BenchmarkBase {
  PointerUint8x02() : super('FfiCall.PointerUint8x02');

  Pointer<Uint8> pointer, pointer2;

  @override
  void setup() {
    pointer = allocate(count: N + 1);
    pointer2 = pointer.elementAt(1);
  }

  @override
  void teardown() {
    free(pointer);
  }

  @override
  void run() {
    final Pointer<Uint8> x = doCall2PointerUint8(N, pointer, pointer2);
    if (x.address != pointer.address + N * sizeOf<Uint8>()) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class PointerUint8x04 extends BenchmarkBase {
  PointerUint8x04() : super('FfiCall.PointerUint8x04');

  Pointer<Uint8> pointer, pointer2, pointer3, pointer4;

  @override
  void setup() {
    pointer = allocate(count: N + 1);
    pointer2 = pointer.elementAt(1);
    pointer3 = pointer.elementAt(2);
    pointer4 = pointer.elementAt(3);
  }

  @override
  void teardown() {
    free(pointer);
  }

  @override
  void run() {
    final Pointer<Uint8> x =
        doCall4PointerUint8(N, pointer, pointer2, pointer3, pointer4);
    if (x.address != pointer.address + N * sizeOf<Uint8>()) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class PointerUint8x10 extends BenchmarkBase {
  PointerUint8x10() : super('FfiCall.PointerUint8x10');

  Pointer<Uint8> pointer,
      pointer2,
      pointer3,
      pointer4,
      pointer5,
      pointer6,
      pointer7,
      pointer8,
      pointer9,
      pointer10;

  @override
  void setup() {
    pointer = allocate(count: N + 1);
    pointer2 = pointer.elementAt(1);
    pointer3 = pointer.elementAt(2);
    pointer4 = pointer.elementAt(3);
    pointer5 = pointer.elementAt(4);
    pointer6 = pointer.elementAt(5);
    pointer7 = pointer.elementAt(6);
    pointer8 = pointer.elementAt(7);
    pointer9 = pointer.elementAt(8);
    pointer10 = pointer.elementAt(9);
  }

  @override
  void teardown() {
    free(pointer);
  }

  @override
  void run() {
    final Pointer<Uint8> x = doCall10PointerUint8(
        N,
        pointer,
        pointer2,
        pointer3,
        pointer4,
        pointer5,
        pointer6,
        pointer7,
        pointer8,
        pointer9,
        pointer10);
    if (x.address != pointer.address + N * sizeOf<Uint8>()) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class PointerUint8x20 extends BenchmarkBase {
  PointerUint8x20() : super('FfiCall.PointerUint8x20');

  Pointer<Uint8> pointer,
      pointer2,
      pointer3,
      pointer4,
      pointer5,
      pointer6,
      pointer7,
      pointer8,
      pointer9,
      pointer10,
      pointer11,
      pointer12,
      pointer13,
      pointer14,
      pointer15,
      pointer16,
      pointer17,
      pointer18,
      pointer19,
      pointer20;

  @override
  void setup() {
    pointer = allocate(count: N + 1);
    pointer2 = pointer.elementAt(1);
    pointer3 = pointer.elementAt(2);
    pointer4 = pointer.elementAt(3);
    pointer5 = pointer.elementAt(4);
    pointer6 = pointer.elementAt(5);
    pointer7 = pointer.elementAt(6);
    pointer8 = pointer.elementAt(7);
    pointer9 = pointer.elementAt(8);
    pointer10 = pointer.elementAt(9);
    pointer11 = pointer.elementAt(10);
    pointer12 = pointer.elementAt(11);
    pointer13 = pointer.elementAt(12);
    pointer14 = pointer.elementAt(13);
    pointer15 = pointer.elementAt(14);
    pointer16 = pointer.elementAt(15);
    pointer17 = pointer.elementAt(16);
    pointer18 = pointer.elementAt(17);
    pointer19 = pointer.elementAt(18);
    pointer20 = pointer.elementAt(19);
  }

  @override
  void teardown() {
    free(pointer);
  }

  @override
  void run() {
    final Pointer<Uint8> x = doCall20PointerUint8(
        N,
        pointer,
        pointer2,
        pointer3,
        pointer4,
        pointer5,
        pointer6,
        pointer7,
        pointer8,
        pointer9,
        pointer10,
        pointer11,
        pointer12,
        pointer13,
        pointer14,
        pointer15,
        pointer16,
        pointer17,
        pointer18,
        pointer19,
        pointer20);
    if (x.address != pointer.address + N * sizeOf<Uint8>()) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class MyClass {
  int a;
  MyClass(this.a);
}

class Handlex01 extends BenchmarkBase {
  Handlex01() : super('FfiCall.Handlex01');

  @override
  void run() {
    final p1 = MyClass(123);
    final x = doCall1Handle(N, p1);

    if (!identical(p1, x)) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Handlex02 extends BenchmarkBase {
  Handlex02() : super('FfiCall.Handlex02');

  @override
  void run() {
    final p1 = MyClass(123);
    final p2 = MyClass(2);
    final x = doCall2Handle(N, p1, p2);

    if (!identical(p1, x)) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Handlex04 extends BenchmarkBase {
  Handlex04() : super('FfiCall.Handlex04');

  @override
  void run() {
    final p1 = MyClass(123);
    final p2 = MyClass(2);
    final p3 = MyClass(3);
    final p4 = MyClass(4);
    final x = doCall4Handle(N, p1, p2, p3, p4);

    if (!identical(p1, x)) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Handlex10 extends BenchmarkBase {
  Handlex10() : super('FfiCall.Handlex10');

  @override
  void run() {
    final p1 = MyClass(123);
    final p2 = MyClass(2);
    final p3 = MyClass(3);
    final p4 = MyClass(4);
    final p5 = MyClass(5);
    final p6 = MyClass(6);
    final p7 = MyClass(7);
    final p8 = MyClass(8);
    final p9 = MyClass(9);
    final p10 = MyClass(10);
    final x = doCall10Handle(N, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);

    if (!identical(p1, x)) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

class Handlex20 extends BenchmarkBase {
  Handlex20() : super('FfiCall.Handlex20');

  @override
  void run() {
    final p1 = MyClass(123);
    final p2 = MyClass(2);
    final p3 = MyClass(3);
    final p4 = MyClass(4);
    final p5 = MyClass(5);
    final p6 = MyClass(6);
    final p7 = MyClass(7);
    final p8 = MyClass(8);
    final p9 = MyClass(9);
    final p10 = MyClass(10);
    final p11 = MyClass(11);
    final p12 = MyClass(12);
    final p13 = MyClass(13);
    final p14 = MyClass(14);
    final p15 = MyClass(15);
    final p16 = MyClass(16);
    final p17 = MyClass(17);
    final p18 = MyClass(18);
    final p19 = MyClass(19);
    final p20 = MyClass(20);
    final x = doCall20Handle(N, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11,
        p12, p13, p14, p15, p16, p17, p18, p19, p20);

    if (!identical(p1, x)) {
      throw Exception('$name: Unexpected result: $x');
    }
  }
}

//
// Main driver.
//

void main() {
  final benchmarks = [
    () => Uint8x01(),
    () => Uint16x01(),
    () => Uint32x01(),
    () => Uint64x01(),
    () => Int8x01(),
    () => Int16x01(),
    () => Int32x01(),
    () => Int32x02(),
    () => Int32x04(),
    () => Int32x10(),
    () => Int32x20(),
    () => Int64x01(),
    () => Int64x02(),
    () => Int64x04(),
    () => Int64x10(),
    () => Int64x20(),
    () => Int64Mintx01(),
    () => Floatx01(),
    () => Floatx02(),
    () => Floatx04(),
    () => Floatx10(),
    () => Floatx20(),
    () => Doublex01(),
    () => Doublex02(),
    () => Doublex04(),
    () => Doublex10(),
    () => Doublex20(),
    () => PointerUint8x01(),
    () => PointerUint8x02(),
    () => PointerUint8x04(),
    () => PointerUint8x10(),
    () => PointerUint8x20(),
    () => Handlex01(),
    () => Handlex02(),
    () => Handlex04(),
    () => Handlex10(),
    () => Handlex20(),
  ];
  for (final benchmark in benchmarks) {
    benchmark().report();
  }
}
