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

library FfiTestCoordinateBare;

import 'dart:ffi' as ffi;

/// Large sample struct for dart:ffi library.
@ffi.struct
class VeryLargeStruct extends ffi.Pointer<ffi.Void> {
  @ffi.Int8()
  int a;

  @ffi.Int16()
  int b;

  @ffi.Int32()
  int c;

  @ffi.Int64()
  int d;

  @ffi.Uint8()
  int e;

  @ffi.Uint16()
  int f;

  @ffi.Uint32()
  int g;

  @ffi.Uint64()
  int h;

  @ffi.IntPtr()
  int i;

  @ffi.Float()
  double j;

  @ffi.Double()
  double k;

  @ffi.Pointer()
  VeryLargeStruct parent;

  @ffi.IntPtr()
  int numChidlren;

  @ffi.Pointer()
  VeryLargeStruct children;

  @ffi.Int8()
  int smallLastField;

  // generated by @ffi.struct annotation
  external static int sizeOf();

  VeryLargeStruct offsetBy(int offsetInBytes) =>
      super.offsetBy(offsetInBytes).cast();

  VeryLargeStruct elementAt(int index) => offsetBy(sizeOf() * index);

  static VeryLargeStruct allocate({int count: 1}) =>
      ffi.allocate<ffi.Uint8>(count: count * sizeOf()).cast();
}
