/// <summary> /// Gets sequence 1, the first vertices right after the start vertex with a maximum of n. /// </summary> public static uint[] GetSequence1 <T>(this EdgePath <T> path, DirectedDynamicGraph.EdgeEnumerator enumerator, int n) where T : struct { if (path.From == null) { return(Constants.EMPTY_SEQUENCE); } var s = new List <uint>(); s.Add(path.Vertex); while (true) { if (path.IsOriginal(enumerator)) { // current segment is original. if (s == null) { s = new List <uint>(); } if (path.From.From != null) { // we need more vertices and there are some more available. s.Add(path.From.Vertex); path = path.From; } else { // we have enough. var result = s.ToArray(); if (n < result.Length) { // TODO: this can be way more efficient by creating only one array. result = result.SubArray(result.Length - n, n); } result.Reverse(); return(result); } } else { // not an original edge, just return the start sequence. var sequence = enumerator.GetSequence1(); if (path.From.From == null) { if (sequence.Length > n) { sequence = sequence.SubArray(sequence.Length - n, n); } return(sequence); } s.Clear(); sequence.Reverse(); s.AddRange(sequence); s.Add(path.From.Vertex); path = path.From; } } }
/// <summary> /// Gets sequence 2, the last vertices right before the end vertex with a maximum of n. /// </summary> public static uint[] GetSequence2 <T>(this EdgePath <T> path, DirectedDynamicGraph.EdgeEnumerator enumerator, int n) where T : struct { if (path.From == null) { return(Constants.EMPTY_SEQUENCE); } List <uint> s = null; while (true) { if (path.IsOriginal(enumerator)) { // current segment is original. if (s == null) { s = new List <uint>(); } s.Add(path.From.Vertex); if (s.Count < n && path.From.From != null) { // we need more vertices and there are some more available. path = path.From; } else { // we have enough. var result = s.ToArray(); result.Reverse(); return(result); } } else { // not an original edge, just return the start sequence. if (s != null) { var s2 = enumerator.GetSequence2(); var result = new uint[s.Count + s2.Length]; for (var i = 0; i < s.Count; i++) { result[result.Length - 1 - i] = s[i]; } for (var i = 0; i < s2.Length; i++) { result[i] = s2[i]; } return(result); } return(enumerator.GetSequence2()); } } }