| // 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 i 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 i 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>); | 
 |     // `.ref` returns a reference which gives access to the fields. | 
 |     print(c.ref is Coordinate); | 
 |     calloc.free(c); | 
 |   } | 
 |  | 
 |   print("end main"); | 
 | } |