|  | // 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<Coordinate>() | 
|  | ..ref.x = 10.0 | 
|  | ..ref.y = 10.0; | 
|  | final c2 = calloc<Coordinate>() | 
|  | ..ref.x = 20.0 | 
|  | ..ref.y = 20.0 | 
|  | ..ref.next = c1; | 
|  | final c3 = calloc<Coordinate>() | 
|  | ..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<Coordinate> c1 = calloc<Coordinate>(3); | 
|  | Pointer<Coordinate> c2 = c1.elementAt(1); | 
|  | Pointer<Coordinate> 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<Coordinate>(); | 
|  | print(c is Pointer<Coordinate>); // 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"); | 
|  | } |