public int Compare(Connection x, Connection y) { //Equals is fast to check, lets do it before we //do more intense stuff : if (x.Equals(y)) { return(0); } if ((x.Address is AHAddress) && (y.Address is AHAddress)) { AHAddress add_x = (AHAddress)x.Address; AHAddress add_y = (AHAddress)y.Address; /** * We compute the distances with the given zero * dist_x : distance from zero to x * dist_y : distance from zero to y * * The AHAddress.RightDistanceTo function gives * the distance as measured from the node in count-clockwise. * * We can use this to set the "zero" we want : */ BigInteger dist_x = _zero.RightDistanceTo(add_x); BigInteger dist_y = _zero.RightDistanceTo(add_y); //Since we know they are not equal, either n_x is bigger //that n_y or vice-versa : if (dist_x > dist_y) { //Then dist_x - dist_y > 0, and n_x is the bigger return(1); } else { return(-1); } } else { /** * If addresses are not AHAddress, throw an exception */ throw new Exception( String.Format("The addresses are not AHAddress. Only AHAddress can be compared.")); } }
/* * Check to see if any of this node's neighbors * should be neighbors of us. If they should, connect * to the closest such nodes on each side. * * @param structs a ConnectionList of ConnectionType.Structured * @param neighbors an IEnumerable of NodeInfo objects * @param nltarget an address of a node that should be on our left * @param nrtarget an address of a node that should be on our right */ protected void CheckForNearerNeighbors(ConnectionList structs, IEnumerable neighbors, out Address nltarget, out Address nrtarget) { BigInteger ldist = null; BigInteger rdist = null; nltarget = null; nrtarget = null; AHAddress local = (AHAddress)_node.Address; foreach (NodeInfo ni in neighbors) { if (!(_node.Address.Equals(ni.Address) || structs.Contains(ni.Address))) { AHAddress adr = (AHAddress)ni.Address; int n_left = structs.LeftInclusiveCount(_node.Address, adr); int n_right = structs.RightInclusiveCount(_node.Address, adr); if (n_left < DESIRED_NEIGHBORS || n_right < DESIRED_NEIGHBORS) { //We should connect to this node! if we are not already: BigInteger adr_dist = local.LeftDistanceTo(adr); if ((null == ldist) || adr_dist < ldist) { ldist = adr_dist; nltarget = adr; } adr_dist = local.RightDistanceTo(adr); if ((null == rdist) || adr_dist < rdist) { rdist = adr_dist; nrtarget = adr; } } } } }
public void Test() { byte[] buf1 = new byte[20]; for (int i = 0; i <= 18; i++) { buf1[i] = 0x00; } buf1[19] = 0x0A; AHAddress test_address_1 = new AHAddress( MemBlock.Reference(buf1, 0, buf1.Length) ); byte[] buf2 = new byte[20]; for (int i = 0; i <= 18; i++) { buf2[i] = 0xFF; } buf2[19] = 0xFE; AHAddress test_address_2 = new AHAddress( MemBlock.Reference(buf2, 0, buf2.Length) ); //test_address_1 is to the left of test_address_2 //because it only a few steps in the clockwise direction: Assert.IsTrue( test_address_1.IsLeftOf( test_address_2 ), "IsLeftOf"); Assert.IsTrue( test_address_2.IsRightOf( test_address_1 ), "IsRightOf"); //This distance is twelve: Assert.AreEqual( test_address_2.DistanceTo( test_address_1), new BigInteger(12), "DistanceTo"); Assert.IsTrue( test_address_1.CompareTo(test_address_2) < 0, "CompareTo"); Assert.IsTrue( test_address_2.CompareTo(test_address_1) > 0, "CompareTo"); byte[] buf3 = new byte[Address.MemSize]; test_address_2.CopyTo(buf3); AHAddress test3 = new AHAddress(MemBlock.Reference(buf3,0,buf3.Length)); Assert.IsTrue( test3.CompareTo( test_address_2 ) == 0 , "CompareTo"); Assert.IsTrue( test3.CompareTo( test3 ) == 0, "CompareTo"); //As long as the address does not wrap around, adding should increase it: AHAddress a4 = new AHAddress( test_address_1.ToBigInteger() + 100 ); Assert.IsTrue( a4.CompareTo( test_address_1 ) > 0, "adding increases"); Assert.IsTrue( a4.CompareTo( test_address_2 ) < 0, "smaller than biggest"); //Here are some consistency tests: for( int i = 0; i < 1000; i++) { System.Random r = new Random(); byte[] b1 = new byte[Address.MemSize]; r.NextBytes(b1); //Make sure it is class 0: Address.SetClass(b1, 0); byte[] b2 = new byte[Address.MemSize]; r.NextBytes(b2); //Make sure it is class 0: Address.SetClass(b2, 0); byte[] b3 = new byte[Address.MemSize]; r.NextBytes(b3); //Make sure it is class 0: Address.SetClass(b3, 0); AHAddress a5 = new AHAddress( MemBlock.Reference(b1,0,b1.Length) ); AHAddress a6 = new AHAddress( MemBlock.Reference(b2,0,b2.Length) ); AHAddress a7 = new AHAddress( MemBlock.Reference(b3,0,b3.Length) ); Assert.IsTrue( a5.CompareTo(a6) == -1 * a6.CompareTo(a5), "consistency"); //Nothing is between the same address: Assert.IsFalse( a5.IsBetweenFromLeft(a6, a6), "Empty Between Left"); Assert.IsFalse( a5.IsBetweenFromRight(a7, a7), "Empty Between Right"); //Endpoints are not between: Assert.IsFalse( a6.IsBetweenFromLeft(a6, a7), "End point Between Left"); Assert.IsFalse( a6.IsBetweenFromRight(a6, a7), "End point Between Right"); Assert.IsFalse( a7.IsBetweenFromLeft(a6, a7), "End point Between Left"); Assert.IsFalse( a7.IsBetweenFromRight(a6, a7), "End point Between Right"); if ( a5.IsBetweenFromLeft(a6, a7) ) { //Then the following must be true: Assert.IsTrue( a6.LeftDistanceTo(a5) < a6.LeftDistanceTo(a7), "BetweenLeft true"); } else { //Then the following must be false: Assert.IsFalse( a6.LeftDistanceTo(a5) < a6.LeftDistanceTo(a7), "BetweenLeft false"); } if ( a5.IsBetweenFromRight(a6, a7) ) { //Then the following must be true: Assert.IsTrue( a6.RightDistanceTo(a5) < a6.RightDistanceTo(a7), "BetweenRight true"); } else { //Then the following must be false: Assert.IsFalse( a6.RightDistanceTo(a5) < a6.RightDistanceTo(a7), "BetweenRight false"); } if( a5.IsCloserToFirst(a6, a7) ) { Assert.IsTrue( a5.DistanceTo(a6).abs() < a5.DistanceTo(a7).abs(), "IsCloser 1"); } else { Assert.IsFalse( a5.DistanceTo(a6).abs() < a5.DistanceTo(a7).abs(), "IsCloser 2"); } Assert.IsFalse(a5.IsCloserToFirst(a6, a7) && a5.IsCloserToFirst(a7,a6), "can only be closer to one!"); if( false == a5.Equals(a6) ) { Assert.IsTrue(a5.IsCloserToFirst(a5, a6), "Always closer to self"); } Assert.IsFalse(a5.IsBetweenFromLeft(a6, a7) == a5.IsBetweenFromRight(a6, a7), "can't be between left and between right"); } }
public void Test() { byte[] buf1 = new byte[20]; for (int i = 0; i <= 18; i++) { buf1[i] = 0x00; } buf1[19] = 0x0A; AHAddress test_address_1 = new AHAddress(MemBlock.Reference(buf1, 0, buf1.Length)); byte[] buf2 = new byte[20]; for (int i = 0; i <= 18; i++) { buf2[i] = 0xFF; } buf2[19] = 0xFE; AHAddress test_address_2 = new AHAddress(MemBlock.Reference(buf2, 0, buf2.Length)); //test_address_1 is to the left of test_address_2 //because it only a few steps in the clockwise direction: Assert.IsTrue(test_address_1.IsLeftOf(test_address_2), "IsLeftOf"); Assert.IsTrue(test_address_2.IsRightOf(test_address_1), "IsRightOf"); //This distance is twelve: Assert.AreEqual(test_address_2.DistanceTo(test_address_1), new BigInteger(12), "DistanceTo"); Assert.IsTrue(test_address_1.CompareTo(test_address_2) < 0, "CompareTo"); Assert.IsTrue(test_address_2.CompareTo(test_address_1) > 0, "CompareTo"); byte[] buf3 = new byte[Address.MemSize]; test_address_2.CopyTo(buf3); AHAddress test3 = new AHAddress(MemBlock.Reference(buf3, 0, buf3.Length)); Assert.IsTrue(test3.CompareTo(test_address_2) == 0, "CompareTo"); Assert.IsTrue(test3.CompareTo(test3) == 0, "CompareTo"); //As long as the address does not wrap around, adding should increase it: AHAddress a4 = new AHAddress(test_address_1.ToBigInteger() + 100); Assert.IsTrue(a4.CompareTo(test_address_1) > 0, "adding increases"); Assert.IsTrue(a4.CompareTo(test_address_2) < 0, "smaller than biggest"); //Here are some consistency tests: for (int i = 0; i < 1000; i++) { System.Random r = new Random(); byte[] b1 = new byte[Address.MemSize]; r.NextBytes(b1); //Make sure it is class 0: Address.SetClass(b1, 0); byte[] b2 = new byte[Address.MemSize]; r.NextBytes(b2); //Make sure it is class 0: Address.SetClass(b2, 0); byte[] b3 = new byte[Address.MemSize]; r.NextBytes(b3); //Make sure it is class 0: Address.SetClass(b3, 0); AHAddress a5 = new AHAddress(MemBlock.Reference(b1, 0, b1.Length)); AHAddress a6 = new AHAddress(MemBlock.Reference(b2, 0, b2.Length)); AHAddress a7 = new AHAddress(MemBlock.Reference(b3, 0, b3.Length)); Assert.IsTrue(a5.CompareTo(a6) == -1 * a6.CompareTo(a5), "consistency"); //Nothing is between the same address: Assert.IsFalse(a5.IsBetweenFromLeft(a6, a6), "Empty Between Left"); Assert.IsFalse(a5.IsBetweenFromRight(a7, a7), "Empty Between Right"); //Endpoints are not between: Assert.IsFalse(a6.IsBetweenFromLeft(a6, a7), "End point Between Left"); Assert.IsFalse(a6.IsBetweenFromRight(a6, a7), "End point Between Right"); Assert.IsFalse(a7.IsBetweenFromLeft(a6, a7), "End point Between Left"); Assert.IsFalse(a7.IsBetweenFromRight(a6, a7), "End point Between Right"); if (a5.IsBetweenFromLeft(a6, a7)) { //Then the following must be true: Assert.IsTrue(a6.LeftDistanceTo(a5) < a6.LeftDistanceTo(a7), "BetweenLeft true"); } else { //Then the following must be false: Assert.IsFalse(a6.LeftDistanceTo(a5) < a6.LeftDistanceTo(a7), "BetweenLeft false"); } if (a5.IsBetweenFromRight(a6, a7)) { //Then the following must be true: Assert.IsTrue(a6.RightDistanceTo(a5) < a6.RightDistanceTo(a7), "BetweenRight true"); } else { //Then the following must be false: Assert.IsFalse(a6.RightDistanceTo(a5) < a6.RightDistanceTo(a7), "BetweenRight false"); } if (a5.IsCloserToFirst(a6, a7)) { Assert.IsTrue(a5.DistanceTo(a6).abs() < a5.DistanceTo(a7).abs(), "IsCloser 1"); } else { Assert.IsFalse(a5.DistanceTo(a6).abs() < a5.DistanceTo(a7).abs(), "IsCloser 2"); } Assert.IsFalse(a5.IsCloserToFirst(a6, a7) && a5.IsCloserToFirst(a7, a6), "can only be closer to one!"); if (false == a5.Equals(a6)) { Assert.IsTrue(a5.IsCloserToFirst(a5, a6), "Always closer to self"); } Assert.IsFalse(a5.IsBetweenFromLeft(a6, a7) == a5.IsBetweenFromRight(a6, a7), "can't be between left and between right"); } }