Przeglądaj źródła

fix: reflective: compare / equals
fix: HashUtils: better #hashPair

Ranides Atterwim 10 lat temu
rodzic
commit
b9f573f323

+ 3 - 1
assira/src/main/java/net/ranides/assira/generic/HashUtils.java

@@ -84,7 +84,9 @@ public final class HashUtils {
     }
     
     public static int hashPair(Object value1, Object value2) {
-        return (value1 == null ? 0 : value1.hashCode()) ^ (value2 == null ? 0 : value2.hashCode());
+        int a = value1 == null ? 0 : value1.hashCode();
+        int b = value2 == null ? 0 : value2.hashCode();
+        return murmurHash3(a) ^ murmurHash3(b);
     }
     
     /**

+ 1 - 1
assira/src/main/java/net/ranides/assira/reflection/IMethod.java

@@ -17,7 +17,7 @@ import net.ranides.assira.reflection.impl.RMethod;
 /**
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public interface IMethod extends IElement, Comparable<IMethod> {
+public interface IMethod extends IElement {
     
     /**
      * Collect information using java.reflection API

+ 2 - 3
assira/src/main/java/net/ranides/assira/reflection/impl/AElements.java

@@ -8,7 +8,6 @@ package net.ranides.assira.reflection.impl;
 
 import java.util.Iterator;
 import java.util.List;
-import java.util.Objects;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -91,12 +90,12 @@ public abstract class AElements<T> implements IElements<T> {
     }
 
     @Override
-    public int hashCode() {
+    public final int hashCode() {
         return 0;
     }
 
     @Override
-    public boolean equals(Object object) {
+    public final boolean equals(Object object) {
         if(object instanceof IElements<?>) {
             IElements<?> that = (IElements<?>)object;
             return this.list().equals(that.list());

+ 18 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/AHints.java

@@ -10,6 +10,7 @@ import java.util.AbstractSet;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Set;
+import net.ranides.assira.generic.HashUtils;
 import net.ranides.assira.reflection.*;
 
 /**
@@ -79,6 +80,23 @@ public class AHints implements IHints {
         return require.contains(IAttribute.DECLARED);
     }
 
+    @Override
+    public int hashCode() {
+        return HashUtils.hashPair(require,discard);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof IHints)) {
+            return false;
+        }
+        AHints that = (AHints) object;
+        return this.require().equals(that.require()) && this.discard().equals(that.discard());
+    }
+    
     @Override
     public String toString() {
         return "AHints{" + "require=" + require + ", discard=" + discard + '}';

+ 11 - 22
assira/src/main/java/net/ranides/assira/reflection/impl/AMethod.java

@@ -48,34 +48,23 @@ public abstract class AMethod implements IMethod {
         };
 	}
     
-	
-	@Override
-	public final int compareTo(IMethod that) {
-        int a = this.name().compareTo(that.name());
-        if(a != 0) {
-            return a;
-        }
-        // @todo (assira #0) reflective: compareTo
-        // sprawdzić porównanie wszystkich IElements oraz class / method / field / params / etc
-        int b = ListUtils.compare(
-                this.arguments().types().list(),
-                that.arguments().types().list(),
-                RCompareUtils::compare
-        );
-        if(b != 0) {
-            return b;
-        }
-        return RCompareUtils.compare(this.returns(), that.returns());
-	}
-
     @Override
     public final int hashCode() {
         return name().hashCode();
     }
 
     @Override
-    public final boolean equals(Object that) {
-        return (that instanceof IMethod) && 0 == compareTo((IMethod)that);
+    public final boolean equals(Object object) {
+        if(object == this) {
+            return true;
+        }
+        if(!(object instanceof IMethod)) {
+            return false;
+        }
+        IMethod that = (IMethod)object;
+        return this.name().equals(that.name())
+            && this.arguments().equals(that.arguments())
+            && this.returns().equals(that.returns());
     }
     
     @Override

+ 10 - 0
assira/src/main/java/net/ranides/assira/reflection/impl/CArgument.java

@@ -87,4 +87,14 @@ public class CArgument implements IArgument {
         return AAnnotations.EMPTY;
     }
 
+    @Override
+    public final int hashCode() {
+        return this.type().hashCode();
+    }
+
+    @Override
+    public final boolean equals(Object object) {
+        return (object instanceof IArgument) && ((IArgument)object).type().equals(type());
+    }
+    
 }

+ 6 - 12
assira/src/main/java/net/ranides/assira/reflection/impl/RArgument.java

@@ -65,24 +65,18 @@ public class RArgument implements IArgument {
     }
 
     @Override
-    public boolean equals(Object object) {
-        if(!(object instanceof IArgument)) {
-            return false;
-        }
-        IArgument that = (IArgument)object;
-        return this.type().equals(that.type()) && this.name().equals(that.name());
+    public final boolean equals(Object object) {
+        return (object instanceof IArgument) && ((IArgument)object).type().equals(type());
     }
-
+    
     @Override
-    public int hashCode() {
-        return super.hashCode(); //To change body of generated methods, choose Tools | Templates.
+    public final int hashCode() {
+        return this.type().hashCode();
     }
-    
+
     @Override
     public String toString() {
         return type() + " " + param.getName();
     }
     
-    
-    
 }

+ 1 - 1
assira/src/main/java/net/ranides/assira/reflection/impl/RConstructor.java

@@ -27,7 +27,7 @@ import net.ranides.assira.collection.query.CQueryBuilder;
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public final class RConstructor extends AMethod implements IMethod {
+public final class RConstructor extends AMethod {
     	
 	private final Constructor<?> method;
     private final Supplier<MethodHandle> handle;

+ 10 - 5
assira/src/test/java/net/ranides/assira/generic/HashUtilsTest.java

@@ -48,11 +48,16 @@ public class HashUtilsTest {
 	
 	@Test
 	public void testHashPair() {
-		assertEquals(0 ^ 11, HashUtils.hashPair(0, 11));
-		assertEquals(0 ^ 11, HashUtils.hashPair(null, 11));
-		assertEquals(99 ^ 1037, HashUtils.hashPair(99, 1037));
-		assertEquals(99 ^ 0, HashUtils.hashPair(99, 0));
-		assertEquals(99 ^ 0, HashUtils.hashPair(99, null));
+		assertEquals(-1818165756, HashUtils.hashPair(0, 11));
+		assertEquals(-1818165756, HashUtils.hashPair(null, 11));
+		assertEquals(-1818165756, HashUtils.hashPair(11, 0));
+		assertEquals(-1818165756, HashUtils.hashPair(11, null));
+        
+		assertEquals(1755047892, HashUtils.hashPair(99, 1037));
+		assertEquals(1755047892, HashUtils.hashPair(1037, 99));
+        
+		assertEquals(-1672646182, HashUtils.hashPair(99, 0));
+		assertEquals(-1672646182, HashUtils.hashPair(99, null));
 	}