public void Remove() { IntSet hashSet = CreateTestHashSet(); hashSet.Remove(1); Assert.IsFalse(hashSet.Contains(1)); }
public static int Pop(this IntSet self) { if (self.Count == 0) { throw new InvalidOperationException(); } int result = self.First(); self.Remove(result); return(result); }
static void Main(string[] args) { IntSet mySet = new IntSet(); HashSet<int> systemSet = new HashSet<int>(); for (int i = 0; i < 10000000; i++) { int a = rand.Next(0, 100); mySet.Add(a); systemSet.Add(a); int b = rand.Next(0, 100); mySet.Remove(b); systemSet.Remove(b); } int[] systemSetArray = systemSet.ToArray(); Array.Sort(systemSetArray); int[] mySetArray = mySet.ToArray(); Console.WriteLine(systemSetArray.SequenceEqual(mySetArray) ? "test passed" : "test failed"); }
/// <summary> /// Clips the mesh with the given plane. /// The part on the positive hals will remain. /// Will return null when everything is clipped. /// Cap-faces will be built on everything that is cut open by the plane (non-convex cap faces are not handled properly). /// Only works for meshes without Face-/FaceVertexAttributes -> attributes will be invalid for generated faces. /// </summary> public PolyMesh ClipByPlane(Plane3d plane, double epsilon = 1e-7) { var clippedMesh = SplitOnPlane(plane, epsilon).Item2; // in case everything is clipped away if (clippedMesh == null) { return(null); } // 1. go trough all edges // 2. if edge on plane -> test if there is an open face along the plane (border edges) var vertexOnPlane = clippedMesh.PositionArray.Map(clippedMesh.VertexCount, p => plane.Height(p).Abs() <= epsilon); clippedMesh.BuildTopology(); // use indices so an edge can be removed no matter what "ref" var edges = new IntSet(clippedMesh.EdgeCount); foreach (var e in clippedMesh.Edges) { if (e.IsValid) { edges.Add(e.Index); } } var capFaceEdges = new List <PolyMesh.Edge>(); var capFaceEdgeSet = new IntSet(); while (edges.Count > 0) { var e = clippedMesh.GetEdge(edges.First()); edges.Remove(e.Index); if (e.IsAnyBorder && vertexOnPlane[e.FromVertexIndex] && vertexOnPlane[e.ToVertexIndex]) { // try to find other edges along the plane // keep set of all edges so in case there the loop runs into a degenerated case an exit is possible (will generate degenerated face) capFaceEdges.Clear(); capFaceEdgeSet.Clear(); var currEdge = e; do { if (currEdge.IsValid) { capFaceEdges.Add(currEdge); capFaceEdgeSet.Add(currEdge.Index); } // find next edge at start-vertex along plane // the new cap face should have winding order start<-to becaues it is on the opposite of the current face-edge currEdge = currEdge.FromVertex.Edges .Select(x => x.FromVertexIndex == currEdge.FromVertexIndex ? x.Opposite : x) .FirstOrDefault(x => x.IsAnyBorder && x.Index != currEdge.Index && vertexOnPlane[x.FromVertexIndex], PolyMesh.Edge.Invalid); } while (currEdge.IsValid && currEdge.Index != e.Index && !capFaceEdgeSet.Contains(currEdge.Index)); if (capFaceEdges.Count > 2) { // add cap-face foreach (var fe in capFaceEdges.Skip(1)) { edges.Remove(fe.Index); } clippedMesh.AddFace(capFaceEdges.Select(fe => fe.ToVertexIndex).ToArray()); } } } // clear topology (is invalid if face has been added) clippedMesh.ClearTopology(); return(clippedMesh); }
public void TestEverything() { IntSet intSet; IEnumerator <IntSet.Range> ranges; int index; // {3-5} - {4} = {3,5} intSet = new IntSet(); intSet.AddRange(3, 5); intSet.Remove(4); Assert.True(intSet.Count == 2); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 3 && ranges.Current.Max == 3 && ranges.Current.PreviousItemsCount == 0); ranges.MoveNext(); Assert.True(ranges.Current.Min == 5 && ranges.Current.Max == 5 && ranges.Current.PreviousItemsCount == 1); Verify(intSet); // {3,5} + {4} = {3-5} intSet.Add(4); Assert.True(intSet.Count == 3); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 3 && ranges.Current.Max == 5 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {3-5} + {6-9} = {3-9} intSet.AddRange(6, 9); Assert.True(intSet.Count == 7); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 3 && ranges.Current.Max == 9 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {3-9} - {4} - {5} - {3} = {6-9} intSet.Remove(4); intSet.Remove(5); intSet.Remove(3); Assert.True(intSet.Count == 4); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 6 && ranges.Current.Max == 9 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {6-9} + {13-13} + {11} + {10-12} = {6-13} intSet.AddRange(13, 13); intSet.Add(11); Assert.True(intSet.Contains(6)); Assert.True(intSet.Contains(7)); Assert.True(intSet.Contains(8)); Assert.True(intSet.Contains(9)); Assert.True(intSet.Contains(11)); Assert.True(intSet.Contains(13)); Assert.True(intSet.Contains(6, out index) && index == 0); Assert.True(intSet.Contains(7, out index) && index == 1); Assert.True(intSet.Contains(8, out index) && index == 2); Assert.True(intSet.Contains(9, out index) && index == 3); Assert.True(intSet.Contains(11, out index) && index == 4); Assert.True(intSet.Contains(13, out index) && index == 5); Assert.False(intSet.Contains(5)); Assert.False(intSet.Contains(14)); Assert.False(intSet.Contains(10)); Assert.False(intSet.Contains(12)); intSet.AddRange(10, 12); Assert.True(intSet.Contains(6)); Assert.True(intSet.Contains(7)); Assert.True(intSet.Contains(8)); Assert.True(intSet.Contains(9)); Assert.True(intSet.Contains(10)); Assert.True(intSet.Contains(11)); Assert.True(intSet.Contains(12)); Assert.True(intSet.Contains(13)); Assert.False(intSet.Contains(5)); Assert.False(intSet.Contains(14)); Assert.True(intSet.Count == 8); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 6 && ranges.Current.Max == 13 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {6-13} - {6-12} = {13} intSet.RemoveRange(6, 12); Assert.True(intSet.Count == 1); Assert.True(intSet.Contains(13)); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 13 && ranges.Current.Max == 13 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {13} - {13-13} = {} intSet.RemoveRange(13, 13); Assert.True(intSet.Count == 0); Assert.False(intSet.Contains(13)); ranges = intSet.Ranges.GetEnumerator(); Assert.False(ranges.MoveNext()); Verify(intSet); // {} + {5-9} - {6-7} = {5,8-9} intSet.AddRange(5, 9); intSet.RemoveRange(6, 7); Assert.True(intSet.Count == 3); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 5 && ranges.Current.Max == 5 && ranges.Current.PreviousItemsCount == 0); ranges.MoveNext(); Assert.True(ranges.Current.Min == 8 && ranges.Current.Max == 9 && ranges.Current.PreviousItemsCount == 1); Assert.False(ranges.MoveNext()); Verify(intSet); // test Clear() intSet.Clear(); Verify(intSet); // randomly add and remove Random rnd = new Random(0); for (int i = 0; i < 1000; i++) { int one; int begin; int end; begin = rnd.Next(0, 100); end = begin + rnd.Next(0, 7); intSet.AddRange(begin, end); one = rnd.Next(0, 100); intSet.Add(one); begin = rnd.Next(0, 100); end = begin + rnd.Next(0, 7); intSet.RemoveRange(begin, end); one = rnd.Next(0, 100); intSet.Remove(one); Verify(intSet); } // test locking intSet.Lock(); Assert.Throws <NotSupportedException>(delegate { intSet.Add(20); }); Assert.Throws <NotSupportedException>(delegate { intSet.AddRange(20, 20); }); Assert.Throws <NotSupportedException>(delegate { intSet.Remove(6); }); Assert.Throws <NotSupportedException>(delegate { intSet.RemoveRange(1, 20); }); Verify(intSet); }
public void TestEverything() { IntSet intSet; IEnumerator<IntSet.Range> ranges; int index; // {3-5} - {4} = {3,5} intSet = new IntSet(); intSet.AddRange(3, 5); intSet.Remove(4); Assert.True(intSet.Count == 2); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 3 && ranges.Current.Max == 3 && ranges.Current.PreviousItemsCount == 0); ranges.MoveNext(); Assert.True(ranges.Current.Min == 5 && ranges.Current.Max == 5 && ranges.Current.PreviousItemsCount == 1); Verify(intSet); // {3,5} + {4} = {3-5} intSet.Add(4); Assert.True(intSet.Count == 3); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 3 && ranges.Current.Max == 5 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {3-5} + {6-9} = {3-9} intSet.AddRange(6, 9); Assert.True(intSet.Count == 7); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 3 && ranges.Current.Max == 9 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {3-9} - {4} - {5} - {3} = {6-9} intSet.Remove(4); intSet.Remove(5); intSet.Remove(3); Assert.True(intSet.Count == 4); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 6 && ranges.Current.Max == 9 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {6-9} + {13-13} + {11} + {10-12} = {6-13} intSet.AddRange(13, 13); intSet.Add(11); Assert.True(intSet.Contains(6)); Assert.True(intSet.Contains(7)); Assert.True(intSet.Contains(8)); Assert.True(intSet.Contains(9)); Assert.True(intSet.Contains(11)); Assert.True(intSet.Contains(13)); Assert.True(intSet.Contains(6, out index) && index == 0); Assert.True(intSet.Contains(7, out index) && index == 1); Assert.True(intSet.Contains(8, out index) && index == 2); Assert.True(intSet.Contains(9, out index) && index == 3); Assert.True(intSet.Contains(11, out index) && index == 4); Assert.True(intSet.Contains(13, out index) && index == 5); Assert.False(intSet.Contains(5)); Assert.False(intSet.Contains(14)); Assert.False(intSet.Contains(10)); Assert.False(intSet.Contains(12)); intSet.AddRange(10, 12); Assert.True(intSet.Contains(6)); Assert.True(intSet.Contains(7)); Assert.True(intSet.Contains(8)); Assert.True(intSet.Contains(9)); Assert.True(intSet.Contains(10)); Assert.True(intSet.Contains(11)); Assert.True(intSet.Contains(12)); Assert.True(intSet.Contains(13)); Assert.False(intSet.Contains(5)); Assert.False(intSet.Contains(14)); Assert.True(intSet.Count == 8); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 6 && ranges.Current.Max == 13 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {6-13} - {6-12} = {13} intSet.RemoveRange(6, 12); Assert.True(intSet.Count == 1); Assert.True(intSet.Contains(13)); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 13 && ranges.Current.Max == 13 && ranges.Current.PreviousItemsCount == 0); Assert.False(ranges.MoveNext()); Verify(intSet); // {13} - {13-13} = {} intSet.RemoveRange(13, 13); Assert.True(intSet.Count == 0); Assert.False(intSet.Contains(13)); ranges = intSet.Ranges.GetEnumerator(); Assert.False(ranges.MoveNext()); Verify(intSet); // {} + {5-9} - {6-7} = {5,8-9} intSet.AddRange(5, 9); intSet.RemoveRange(6, 7); Assert.True(intSet.Count == 3); ranges = intSet.Ranges.GetEnumerator(); ranges.MoveNext(); Assert.True(ranges.Current.Min == 5 && ranges.Current.Max == 5 && ranges.Current.PreviousItemsCount == 0); ranges.MoveNext(); Assert.True(ranges.Current.Min == 8 && ranges.Current.Max == 9 && ranges.Current.PreviousItemsCount == 1); Assert.False(ranges.MoveNext()); Verify(intSet); // test Clear() intSet.Clear(); Verify(intSet); // randomly add and remove Random rnd = new Random(0); for (int i = 0; i < 1000; i++) { int one; int begin; int end; begin = rnd.Next(0, 100); end = begin + rnd.Next(0, 7); intSet.AddRange(begin, end); one = rnd.Next(0, 100); intSet.Add(one); begin = rnd.Next(0, 100); end = begin + rnd.Next(0, 7); intSet.RemoveRange(begin, end); one = rnd.Next(0, 100); intSet.Remove(one); Verify(intSet); } // test locking intSet.Lock(); Assert.Throws<NotSupportedException>(delegate { intSet.Add(20); }); Assert.Throws<NotSupportedException>(delegate { intSet.AddRange(20, 20); }); Assert.Throws<NotSupportedException>(delegate { intSet.Remove(6); }); Assert.Throws<NotSupportedException>(delegate { intSet.RemoveRange(1, 20); }); Verify(intSet); }