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

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

class Coordinate extends ffi::Struct {
  @#C1
  field core::double* x = null;
  @#C1
  field core::double* y = null;
  field ffi::Pointer<self::Coordinate*>* next = null;
  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 let final void #t2 = #t1.{self::Coordinate::x} = x in let final void #t3 = #t1.{self::Coordinate::y} = y in let final void #t4 = #t1.{self::Coordinate::next} = next in #t1;
  }
  abstract member-signature get _addressOf() → ffi::Pointer<ffi::Struct*>*;
  abstract member-signature get _identityHashCode() → core::int*;
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*;
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*;
  abstract member-signature operator ==(dynamic other) → core::bool*;
  abstract member-signature get hashCode() → core::int*;
  abstract member-signature method toString() → core::String*;
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic;
  abstract member-signature get runtimeType() → core::Type*;
}
static method main() → dynamic {}

constants  {
  #C1 = ffi::Double {}
}
