/// <summary> /// Reads this buffer to the given graph. /// </summary> public void ReadTo <V, E>(HeGraph <V, E> graph, Action <V, VA> setVertexAttributes = null, Action <E, EA> setHedgeAttributes = null) where V : HeGraph <V, E> .Vertex where E : HeGraph <V, E> .Halfedge { var verts = graph.Vertices; var hedges = graph.Halfedges; int nv = verts.Count; int nhe = hedges.Count; // add new vertices for (int i = 0; i < _vertexRefs.Length; i++) { graph.AddVertex(); } // add new halfedges for (int i = 0; i < _hedgeRefs.Length; i += 2) { graph.AddEdge(); } // link up vertices for (int i = 0; i < _vertexRefs.Length; i++) { var v = verts[i + nv]; var first = _vertexRefs[i]; if (first > -1) { v.First = hedges[first + nhe]; } } // link up halfedges for (int i = 0; i < _hedgeRefs.Length; i++) { var he = hedges[i + nhe]; var refs = _hedgeRefs[i]; var prev = refs[0]; if (prev != -1) { he.Previous = hedges[prev + nhe]; } he.Next = hedges[refs[1] + nhe]; var start = refs[2]; if (start > -1) { he.Start = verts[start + nhe]; } } // TODO validate topology? // set vertex attributes if (setVertexAttributes != null) { for (int i = 0; i < _vertexAttributes.Length; i++) { setVertexAttributes(verts[i + nv], _vertexAttributes[i]); } } // set vertex attributes if (setHedgeAttributes != null) { for (int i = 0; i < _hedgeAttributes.Length; i++) { setHedgeAttributes(hedges[i + nhe], _hedgeAttributes[i]); } } }