/// <summary> /// Deserializes an shapes index from the given stream. /// </summary> public static ShapesArray CreateFrom(Stream stream, bool copy, out long size, bool hasElevation = false) { var initialPosition = stream.Position; size = 0; var longBytes = new byte[8]; stream.Read(longBytes, 0, 8); size += 8; var indexLength = BitConverter.ToInt64(longBytes, 0); stream.Read(longBytes, 0, 8); size += 8; var coordinatesLength = BitConverter.ToInt64(longBytes, 0); ArrayBase <ulong> index; ArrayBase <float> coordinates; ArrayBase <short> elevation = null; if (copy) { // just create arrays and read the data. index = Context.ArrayFactory.CreateMemoryBackedArray <ulong>(indexLength); index.CopyFrom(stream); size += indexLength * 8; coordinates = Context.ArrayFactory.CreateMemoryBackedArray <float>(coordinatesLength); size += coordinatesLength * 4; coordinates.CopyFrom(stream); if (hasElevation) { elevation = Context.ArrayFactory.CreateMemoryBackedArray <short>(coordinatesLength / 2); size += coordinatesLength; elevation.CopyFrom(stream); } } else { // create accessors over the exact part of the stream that represents vertices/edges. var position = stream.Position; var map1 = new MemoryMapStream(new CappedStream(stream, position, indexLength * 8)); index = new Array <ulong>(map1.CreateUInt64(indexLength)); size += indexLength * 8; var map2 = new MemoryMapStream(new CappedStream(stream, position + indexLength * 8, coordinatesLength * 4)); coordinates = new Array <float>(map2.CreateSingle(coordinatesLength)); size += coordinatesLength * 4; if (hasElevation) { var map3 = new MemoryMapStream(new CappedStream(stream, position + indexLength * 8 + coordinatesLength * 4, coordinatesLength)); elevation = new Array <short>(map3.CreateInt16(coordinatesLength / 2)); size += coordinatesLength; } } // make stream is positioned correctly. stream.Seek(initialPosition + size, System.IO.SeekOrigin.Begin); return(new ShapesArray(index, coordinates, elevation)); }
/// <summary> /// Deserializes a graph from the stream. /// </summary> public static GeometricGraph Deserialize(System.IO.Stream stream, GeometricGraphProfile profile) { var version = stream.ReadByte(); if (version != 1) { throw new Exception(string.Format("Cannot deserialize geometric graph: Invalid version #: {0}.", version)); } var graph = Graph.Deserialize(stream, profile == null ? null : profile.GraphProfile); var initialPosition = stream.Position; var size = 0L; ArrayBase <float> coordinates; ShapesArray shapes; if (profile == null) { // don't use the stream, the read from it. coordinates = Context.ArrayFactory.CreateMemoryBackedArray <float>(graph.VertexCount * 2); coordinates.CopyFrom(stream); size += graph.VertexCount * 2 * 4; long shapeSize; shapes = ShapesArray.CreateFrom(stream, true, out shapeSize); size += shapeSize; } else { // use the stream as a map. var position = stream.Position; var map = new MemoryMapStream(new CappedStream(stream, position, graph.VertexCount * 4 * 2)); coordinates = new Array <float>(map.CreateSingle(graph.VertexCount * 2), profile.CoordinatesProfile); size += graph.VertexCount * 2 * 4; stream.Seek(position + graph.VertexCount * 4 * 2, System.IO.SeekOrigin.Begin); long shapeSize; shapes = ShapesArray.CreateFrom(stream, false, out shapeSize); size += shapeSize; } // make stream is positioned correctly. stream.Seek(initialPosition + size, System.IO.SeekOrigin.Begin); return(new GeometricGraph(graph, coordinates, shapes)); }