|
|
@@ -6,8 +6,11 @@
|
|
|
*/
|
|
|
package net.ranides.assira.reflection.impl;
|
|
|
|
|
|
-import net.ranides.assira.reflection.IClass;
|
|
|
-import static net.ranides.assira.reflection.impl.AClass.NULL;
|
|
|
+import java.io.Serializable;
|
|
|
+import java.util.List;
|
|
|
+import net.ranides.assira.collection.lists.ListUtils;
|
|
|
+import net.ranides.assira.reflection.util.ClassTraits;
|
|
|
+import net.ranides.assira.reflection.*;
|
|
|
|
|
|
/**
|
|
|
*
|
|
|
@@ -19,32 +22,18 @@ public final class RCompareUtils {
|
|
|
/* utility class */
|
|
|
}
|
|
|
|
|
|
- // @todo (assira #0) reflective compare
|
|
|
-
|
|
|
- // @todo (assira #0) reflective issubclass
|
|
|
-
|
|
|
public static int hashcode(IClass iclass) {
|
|
|
return iclass.name().hashCode();
|
|
|
}
|
|
|
|
|
|
- public static int compare(IClass isuper, IClass iclass) {
|
|
|
- if(isuper == AClass.NULL) {
|
|
|
- return (NULL==iclass) ? 0 : -1;
|
|
|
- }
|
|
|
- boolean sw = (isuper instanceof RWClass);
|
|
|
- boolean cw = (iclass instanceof RWClass);
|
|
|
- if(sw && cw) {
|
|
|
- return compare((RWClass)isuper, (RWClass)iclass);
|
|
|
- }
|
|
|
- else if(sw && !cw) {
|
|
|
- return compare((RWClass)isuper, (RClass)iclass);
|
|
|
+ public static int compare(IClass a, IClass b) {
|
|
|
+ if(a == AClass.NULL) {
|
|
|
+ return (AClass.NULL==b) ? 0 : -1;
|
|
|
}
|
|
|
- else if(!sw && cw) {
|
|
|
- return compare((RClass)isuper, (RWClass)iclass);
|
|
|
- }
|
|
|
- else {
|
|
|
- return compare((RClass)isuper, (RClass)iclass);
|
|
|
+ if(isSuper(a, b)) {
|
|
|
+ return isSuper(b, a) ? a.name().compareTo(b.name()) : -1;
|
|
|
}
|
|
|
+ return a.name().compareTo(b.name());
|
|
|
}
|
|
|
|
|
|
public static boolean equals(IClass a, IClass b) {
|
|
|
@@ -52,59 +41,76 @@ public final class RCompareUtils {
|
|
|
}
|
|
|
|
|
|
public static boolean isSubclass(IClass iclass, IClass isuper) {
|
|
|
- return isSuper(isuper, iclass);
|
|
|
+ return isSuper(false, isuper, iclass);
|
|
|
}
|
|
|
|
|
|
public static boolean isSuper(IClass isuper, IClass iclass) {
|
|
|
+ return isSuper(false, isuper, iclass);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static boolean isInstance(IClass type, Object object) {
|
|
|
+ return isSuper(true, type, IClass.typefor(object));
|
|
|
+ }
|
|
|
+
|
|
|
+ private static boolean isSuper(boolean box, IClass isuper, IClass iclass) {
|
|
|
if(isuper == AClass.NULL) {
|
|
|
return !iclass.isPrimitive();
|
|
|
}
|
|
|
boolean sw = (isuper instanceof RWClass);
|
|
|
boolean cw = (iclass instanceof RWClass);
|
|
|
if(sw && cw) {
|
|
|
- return isSuper((RWClass)isuper, (RWClass)iclass);
|
|
|
+ return isSuper(box, (RWClass)isuper, (RWClass)iclass);
|
|
|
}
|
|
|
else if(sw && !cw) {
|
|
|
- return isSuper((RWClass)isuper, (RClass)iclass);
|
|
|
+ return isSuper(box, (RWClass)isuper, (RClass)iclass);
|
|
|
}
|
|
|
else if(!sw && cw) {
|
|
|
- return isSuper((RClass)isuper, (RWClass)iclass);
|
|
|
+ return isSuper(box, (RClass)isuper, (RWClass)iclass);
|
|
|
}
|
|
|
else {
|
|
|
- return isSuper((RClass)isuper, (RClass)iclass);
|
|
|
+ return isSuper(box, (RClass)isuper, (RClass)iclass);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private static int compare(RWClass a, RWClass b) {
|
|
|
- throw new UnsupportedOperationException("rw-rw" + a + " " +b);
|
|
|
- }
|
|
|
-
|
|
|
- private static int compare(RWClass a, RClass b) {
|
|
|
- throw new UnsupportedOperationException("rw-rc" + a + " " +b);
|
|
|
- }
|
|
|
-
|
|
|
- private static int compare(RClass a, RWClass b) {
|
|
|
- throw new UnsupportedOperationException("rc-rw" + a + " " +b);
|
|
|
- }
|
|
|
-
|
|
|
- private static int compare(RClass a, RClass b) {
|
|
|
- if(isSuper(a, b)) {
|
|
|
- return isSuper(b, a) ? a.name().compareTo(b.name()) : -1;
|
|
|
+ private static <T extends String & CharSequence> boolean isSuper(boolean box, RWClass isuper, RWClass iclass) {
|
|
|
+ // czy isuper.lower isSuper iclass.upper ?
|
|
|
+ // czy iclass.lower isSuper isuper.upper ?
|
|
|
+
|
|
|
+ for(IClass c : isuper.lower()) {
|
|
|
+ for(IClass p : iclass.upper()) {
|
|
|
+ if( !isSuper(c, p) ) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- return a.name().compareTo(b.name());
|
|
|
- }
|
|
|
-
|
|
|
- private static boolean isSuper(RWClass isuper, RWClass iclass) {
|
|
|
- throw new UnsupportedOperationException("rw-rw" + isuper + " " + iclass);
|
|
|
+
|
|
|
+ for(IClass c : iclass.lower()) {
|
|
|
+ for(IClass p : isuper.upper()) {
|
|
|
+ if( !isSuper(c, p) ) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return isSuperList(false, isuper.params(), iclass.params());
|
|
|
}
|
|
|
|
|
|
- private static boolean isSuper(RWClass isuper, RClass iclass) {
|
|
|
- throw new UnsupportedOperationException("rw-rc" + isuper + " " + iclass);
|
|
|
+ private static boolean isSuper(boolean box, RWClass isuper, RClass iclass) {
|
|
|
+ for(IClass c : isuper.lower()) {
|
|
|
+ if(!isSubclass(iclass,c)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(IClass c : isuper.upper()) {
|
|
|
+ if(!isSuper(iclass, c)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return isSuperList(false, isuper.params(), iclass.params());
|
|
|
}
|
|
|
|
|
|
- private static boolean isSuper(RClass isuper, RWClass iclass) {
|
|
|
+ private static boolean isSuper(boolean box, RClass isuper, RWClass iclass) {
|
|
|
for(IClass c : iclass.lower()) {
|
|
|
- if(!isSuper(isuper, c)) {
|
|
|
+ if(!isSubclass(isuper,c)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
@@ -113,11 +119,22 @@ public final class RCompareUtils {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
- return true;
|
|
|
+ return isSuperList(false, isuper.params(), iclass.params());
|
|
|
+ }
|
|
|
+
|
|
|
+ private static boolean isSuper(boolean box, RClass isuper, RClass iclass) {
|
|
|
+ if(!isSuperRaw(box, isuper.reflective(), iclass.reflective())) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return isSuperList(box, isuper.params(), iclass.params());
|
|
|
+ }
|
|
|
+
|
|
|
+ private static boolean isSuperRaw(boolean box, Class<?> isuper, Class<?> iclass) {
|
|
|
+ return box ? ClassTraits.isSuper(isuper, iclass) : isuper.isAssignableFrom(iclass);
|
|
|
}
|
|
|
|
|
|
- private static boolean isSuper(RClass isuper, RClass iclass) {
|
|
|
- throw new UnsupportedOperationException("rc-rc" + isuper + " " + iclass);
|
|
|
+ private static boolean isSuperList(boolean box, List<IClass> list1, List<IClass> list2) {
|
|
|
+ return ListUtils.equals(list1, list2, (a,b) -> RCompareUtils.isSuper(box,a,b));
|
|
|
}
|
|
|
|
|
|
}
|