// Copyright (c) 2022, 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.

import 'dart:io';

Future<void> main() async {
  final contents = [
    header,
    for (final size in sizes) generateSize(size),
  ].join('\n');

  final uri = Platform.script.resolve('dart/benchmark_generated.dart');

  await File.fromUri(uri).writeAsString(contents);
}

const sizes = [1, 32, 1024, 1024 * 32];

const header =
    '''// Copyright (c) 2022, 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.

import 'dart:ffi';

import 'package:ffi/ffi.dart';

import 'FfiStructCopy.dart';
''';

String generateSize(int size) => '''
final class Struct${size}Bytes extends Struct {
  @Array($size)
  external Array<Uint8> a0;
}

final class Struct${size}BytesWrapper extends Struct {
  external Struct${size}Bytes nested;
}

final class Copy${size}Bytes extends StructCopyBenchmark {
  @override
  Pointer<Struct${size}BytesWrapper> from = nullptr;
  @override
  Pointer<Struct${size}BytesWrapper> to = nullptr;

  Copy${size}Bytes() : super('FfiStructCopy.Copy${size}Bytes');

  @override
  int get copySizeInBytes => sizeOf<Struct${size}BytesWrapper>();

  @override
  void setup(int batchSize) {
    from = calloc(batchSize);
    to = calloc(batchSize);
  }

  @override
  void run(int batchSize) {
    for (int i = 0; i < batchSize; i++) {
      to[i].nested = from[i].nested;
    }
  }
}
''';
