private bool TryFetchNode(TransportNodeIdInterop nodeIdInterop, out TransportNode node) { int incidentDirectedEdgeCount = NativeTransportApi_GetIncidentDirectedEdgeCountForNode(NativePluginRunner.API, nodeIdInterop); if (incidentDirectedEdgeCount < 0) { node = TransportNode.MakeEmpty(); return(false); } var incidentDirectedEdgeIdInteropBuffer = new TransportDirectedEdgeIdInterop[incidentDirectedEdgeCount]; var incidentDirectedEdgeIdInteropBufferGCHandle = GCHandle.Alloc(incidentDirectedEdgeIdInteropBuffer, GCHandleType.Pinned); var incidentDirectedEdgeIdInteropPtr = incidentDirectedEdgeIdInteropBufferGCHandle.AddrOfPinnedObject(); var nodeInterop = new TransportNodeInterop() { Id = nodeIdInterop, IncidentDirectedEdgeIdsSize = incidentDirectedEdgeCount, IncidentDirectedEdgeIds = incidentDirectedEdgeIdInteropPtr }; bool success = NativeTransportApi_TryGetNode(NativePluginRunner.API, ref nodeInterop); if (!success) { node = TransportNode.MakeEmpty(); return(false); } var incidedDirectedEdgeIds = incidentDirectedEdgeIdInteropBuffer.Select(_x => _x.FromInterop()).ToList(); node = new TransportNode( nodeInterop.Id.FromInterop(), nodeInterop.Point, incidedDirectedEdgeIds ); incidentDirectedEdgeIdInteropBufferGCHandle.Free(); return(true); }
private static extern bool NativeTransportApi_TryGetNode(IntPtr ptr, ref TransportNodeInterop nodeInterop);