library;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;
import "dart:typed_data" as typ;

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

@#C3
@#C9
final class Coordinate extends ffi::Struct {
  constructor #fromTypedDataBase(synthesized core::Object #typedDataBase, synthesized core::int #offsetInBytes) → self::Coordinate
    : super ffi::Struct::_fromTypedDataBase(#typedDataBase, #offsetInBytes)
    ;
  @#C11
  constructor #fromTypedData(synthesized typ::TypedData #typedData, synthesized core::int #offset, synthesized core::int #sizeInBytes) → self::Coordinate
    : super ffi::Struct::_fromTypedData(#typedData, #offset, #sizeInBytes)
    ;
  @#C12
  @#C11
  get x() → core::double
    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::x#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
  @#C12
  @#C11
  set x(synthesized core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::x#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #externalFieldValue);
  @#C12
  @#C11
  get y() → core::double
    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::y#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
  @#C12
  @#C11
  set y(synthesized core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::y#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #externalFieldValue);
  @#C11
  get next() → ffi::Pointer<self::Coordinate>
    return ffi::_loadPointer<self::Coordinate>(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::next#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
  @#C11
  set next(synthesized ffi::Pointer<self::Coordinate> #externalFieldValue) → void
    return ffi::_storePointer<self::Coordinate>(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::next#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #externalFieldValue);
  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){(core::int, {alignment: core::int?}) → ffi::Pointer<self::Coordinate>}!, #C13) in block {
      #t1.{self::Coordinate::x} = x;
      #t1.{self::Coordinate::y} = y;
      #t1.{self::Coordinate::next} = next;
    } =>#t1;
  }
  @#C11
  static synthetic get x#offsetOf() → core::int
    return #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int};
  @#C11
  static synthetic get y#offsetOf() → core::int
    return #C16.{core::List::[]}(ffi::_abi()){(core::int) → core::int};
  @#C11
  static synthetic get next#offsetOf() → core::int
    return #C18.{core::List::[]}(ffi::_abi()){(core::int) → core::int};
  @#C11
  static get #sizeOf() → core::int
    return #C21.{core::List::[]}(ffi::_abi()){(core::int) → core::int};
}
static method main() → dynamic {}

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


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