// 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. import 'dart:ffi'; import 'package:ffi/ffi.dart'; import 'coordinate.dart'; main() { print('start main'); { // Allocates each coordinate separately in c memory. final c1 = calloc() ..ref.x = 10.0 ..ref.y = 10.0; final c2 = calloc() ..ref.x = 20.0 ..ref.y = 20.0 ..ref.next = c1; final c3 = calloc() ..ref.x = 30.0 ..ref.y = 30.0 ..ref.next = c2; c1.ref.next = c3; Coordinate currentCoordinate = c1.ref; for (var _ in [0, 1, 2, 3, 4]) { currentCoordinate = currentCoordinate.next.ref; print("${currentCoordinate.x}; ${currentCoordinate.y}"); } calloc.free(c1); calloc.free(c2); calloc.free(c3); } { // Allocates coordinates consecutively in c memory. Pointer c1 = calloc(3); Pointer c2 = c1.elementAt(1); Pointer c3 = c1.elementAt(2); c1.ref.x = 10.0; c1.ref.y = 10.0; c1.ref.next = c3; c2.ref.x = 20.0; c2.ref.y = 20.0; c2.ref.next = c1; c3.ref.x = 30.0; c3.ref.y = 30.0; c3.ref.next = c2; Coordinate currentCoordinate = c1.ref; for (var _ in [0, 1, 2, 3, 4]) { currentCoordinate = currentCoordinate.next.ref; print("${currentCoordinate.x}; ${currentCoordinate.y}"); } calloc.free(c1); } { // Allocating in native memory returns a pointer. final c = calloc(); print(c is Pointer); // ignore: unnecessary_type_check // `.ref` returns a reference which gives access to the fields. print(c.ref is Coordinate); // ignore: unnecessary_type_check calloc.free(c); } print("end main"); }