library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;

import "dart:ffi";
import "package:ffi/ffi.dart";

@#C7
class Coordinate extends ffi::Struct {
  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::Coordinate
    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
    ;
  @#C8
  get x() → core::double
    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C10).{core::List::[]}(ffi::_abi()));
  @#C8
  set x(core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C10).{core::List::[]}(ffi::_abi()), #externalFieldValue);
  @#C8
  get y() → core::double
    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()));
  @#C8
  set y(core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}, (#C12).{core::List::[]}(ffi::_abi()), #externalFieldValue);
  get next() → ffi::Pointer<self::Coordinate>
    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi())));
  set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void
    return ffi::_storeIntPtr(this.{ffi::_Compound::_typedDataBase}, (#C14).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
  static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
    return let final self::Coordinate #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate>(self::Coordinate::#sizeOf)!) in block {
      #t1.{self::Coordinate::x} = x;
      #t1.{self::Coordinate::y} = y;
      #t1.{self::Coordinate::next} = next;
    } =>#t1;
  }
  @#C16
  static get #sizeOf() → core::int*
    return (#C19).{core::List::[]}(ffi::_abi());
}
static method main() → dynamic {}

constants  {
  #C1 = "vm:ffi:struct-fields"
  #C2 = TypeLiteralConstant(ffi::Double)
  #C3 = TypeLiteralConstant(ffi::Pointer<ffi::NativeType>)
  #C4 = <core::Type>[#C2, #C2, #C3]
  #C5 = null
  #C6 = ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
  #C7 = core::pragma {name:#C1, options:#C6}
  #C8 = ffi::Double {}
  #C9 = 0
  #C10 = <core::int*>[#C9, #C9, #C9]
  #C11 = 8
  #C12 = <core::int*>[#C11, #C11, #C11]
  #C13 = 16
  #C14 = <core::int*>[#C13, #C13, #C13]
  #C15 = "vm:prefer-inline"
  #C16 = core::pragma {name:#C15, options:#C5}
  #C17 = 24
  #C18 = 20
  #C19 = <core::int*>[#C17, #C18, #C17]
}


Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
