library;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;
import "package:ffi/src/allocation.dart" as all;

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

@#C3
class Coordinate extends ffi::Struct {
  @#C3
  static final field core::int* #sizeOf = (#C6).{core::List::[]}(ffi::_abi());
  @#C3
  constructor #fromPointer(dynamic #pointer) → dynamic
    : super ffi::Struct::_fromPointer(#pointer)
    ;
  static factory allocate(core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate* {
    return let final self::Coordinate* #t1 = ffi::StructPointer|get#ref<self::Coordinate*>(all::allocate<self::Coordinate*>()) in block {
      #t1.{self::Coordinate::x} = x;
      #t1.{self::Coordinate::y} = y;
      #t1.{self::Coordinate::next} = next;
    } =>#t1;
  }
  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*; -> ffi::Struct::_addressOf
  abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
  get x() → core::double*
    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()));
  set x(core::double* #v) → void
    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C8).{core::List::[]}(ffi::_abi()), #v);
  get y() → core::double*
    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()));
  set y(core::double* #v) → void
    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C10).{core::List::[]}(ffi::_abi()), #v);
  get next() → ffi::Pointer<self::Coordinate*>*
    return ffi::_fromAddress<self::Coordinate*>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi())));
  set next(ffi::Pointer<self::Coordinate*>* #v) → void
    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C12).{core::List::[]}(ffi::_abi()), #v.{=ffi::Pointer::address});
}
static method main() → dynamic {}

constants  {
  #C1 = "vm:entry-point"
  #C2 = null
  #C3 = core::pragma {name:#C1, options:#C2}
  #C4 = 24
  #C5 = 20
  #C6 = <core::int*>[#C4, #C5, #C4]
  #C7 = 0
  #C8 = <core::int*>[#C7, #C7, #C7]
  #C9 = 8
  #C10 = <core::int*>[#C9, #C9, #C9]
  #C11 = 16
  #C12 = <core::int*>[#C11, #C11, #C11]
}
