Kaynağa Gözat

change: PackageScanner - refactor
new: MathUtils # gcd
new: MathUtils # lcm

ranides atterwim 11 yıl önce
ebeveyn
işleme
d3abaec765

+ 1 - 1
pom.xml

@@ -5,7 +5,7 @@
 
     <groupId>net.ranides</groupId>
     <artifactId>assira</artifactId>
-    <version>0.70.3</version>
+    <version>0.70.4</version>
     <packaging>jar</packaging>
 
     <name>assira</name>

+ 48 - 0
src/main/java/net/ranides/assira/math/MathUtils.java

@@ -181,5 +181,53 @@ public final class MathUtils {
     public static int log2ceil(long x) {
         return 64 - Long.numberOfLeadingZeros(x - 1);
     }
+    
+    public static int gcd(int a, int b) { 
+        return b==0 ? a : gcd(b, a % b); 
+    }
+    
+    public static int gcd(int... values) {
+        int ret = gcd(values[0], values[1]);
+        for(int i=2; i<values.length; i++) {
+            ret = gcd(ret, values[i]);
+        }
+        return ret;
+    }
+    
+    public static long gcd(long a, long b) { 
+        return b==0 ? a : gcd(b, a % b); 
+    }
+    
+    public static long gcd(long... values) {
+        long ret = gcd(values[0], values[1]);
+        for(int i=2; i<values.length; i++) {
+            ret = gcd(ret, values[i]);
+        }
+        return ret;
+    }
+    
+    public static int lcm(int a, int b) {
+        return (a / gcd(a,b)) * b;
+    }
+    
+    public static int lcm(int... values) {
+        int ret = lcm(values[0], values[1]);
+        for(int i=2; i<values.length; i++) {
+            ret = lcm(ret, values[i]);
+        }
+        return ret;
+    }
+    
+    public static long lcm(long a, long b) {
+        return (a/ gcd(a,b) ) * b;
+    }
+    
+    public static long lcm(long... values) {
+        long ret = lcm(values[0], values[1]);
+        for(int i=2; i<values.length; i++) {
+            ret = lcm(ret, values[i]);
+        }
+        return ret;
+    }
 }
 

+ 16 - 19
src/main/java/net/ranides/assira/reflection/PackageScanner.java

@@ -37,31 +37,29 @@ public final class PackageScanner {
     private final ClassLoader loader;
     private final String packageName;
     private final String packagePath;
-    private Set<Class<?>> target;
-    private Set<Class<?>> result;
+    private final Set<Class<?>> target;
 
-    public PackageScanner(String packageName) {
-        this(packageName, Thread.currentThread().getContextClassLoader());
-    }
-
-    public PackageScanner(String packageName, ClassLoader loader) {
+    private PackageScanner(String packageName, ClassLoader loader) {
         this.loader = loader;
         this.packageName = packageName;
         this.packagePath = packageName.replace('.', '/');
+        this.target = new HashSet<>();
+    }
+    
+    public static Set<Class<?>> list(String packageName) throws IOException, ClassNotFoundException, URISyntaxException {
+        return list(packageName, Thread.currentThread().getContextClassLoader());
+    }
+    
+    public static Set<Class<?>> list(String packageName, ClassLoader loader) throws IOException, ClassNotFoundException, URISyntaxException {
+        return new PackageScanner(packageName, loader).list();
     }
 
-    public Set<Class<?>> list() throws IOException, ClassNotFoundException, URISyntaxException {
-        if( null != result ) {
-            return result;
-        }
+    private Set<Class<?>> list() throws IOException, ClassNotFoundException, URISyntaxException {
         Enumeration<URL> resources = loader.getResources(packagePath);
         if (resources == null) {
-            result = Collections.emptySet();
-            return result;
+            return target;
         }
 
-        target = new HashSet<>();
-
         while (resources.hasMoreElements()) {
             String path = URLDecoder.decode(resources.nextElement().getPath(), TextEncoding.IO_DEFAULT);
             File file = new File(path);
@@ -72,11 +70,10 @@ public final class PackageScanner {
             }
         }
 
-        result = Collections.unmodifiableSet(target);
-        return result;
+        return target;
     }
 
-    void getFromDirectory(File directory) {
+    private void getFromDirectory(File directory) {
         for(File file : DirectoryHelper.find(directory, "*.class")) {
             try {
                 String cname = packageName + '.' + path2name(PathHelper.asRelative(directory, file));
@@ -90,7 +87,7 @@ public final class PackageScanner {
         }
     }
 
-    void getFromJARFile(String jar) {
+    private void getFromJARFile(String jar) {
         try {
             JarInputStream jarFile = new JarInputStream(new FileInputStream(jar));
             while(true) {

+ 19 - 0
src/test/java/net/ranides/assira/math/MathUtilsTest.java

@@ -16,6 +16,25 @@ import static org.junit.Assert.*;
  */
 public class MathUtilsTest {
 
+    @Test
+    public void testGCD() {
+        assertEquals(1, MathUtils.gcd(7,3));
+        assertEquals(2, MathUtils.gcd(2*3*7, 2*2));
+        assertEquals(6, MathUtils.gcd(2*3*7, 2*3*5));
+        
+        assertEquals(6, MathUtils.gcd(2*3*7, 2*3*5, 2*3*11));
+        assertEquals(2, MathUtils.gcd(2*3*7, 2*3*5, 2*11));
+    }
+    
+    @Test
+    public void testLCM() {
+        assertEquals(21, MathUtils.lcm(7,3));
+        assertEquals(84, MathUtils.lcm(2*3*7, 2*2));
+        assertEquals(210, MathUtils.lcm(2*3*7, 2*3*5));
+        
+        assertEquals(2310, MathUtils.lcm(2*3*7, 2*3*5, 2*3*11));
+        assertEquals(2310, MathUtils.lcm(2*3*7, 2*3*5, 2*11));
+    }
 
     @Test
     public void testLog2floor() {

+ 5 - 5
src/test/java/net/ranides/assira/reflection/PackageScannerTest.java

@@ -24,17 +24,17 @@ public class PackageScannerTest {
     public void testScan() throws Exception {
 
         int i = 1;
-        for(Class<?> clazz : new PackageScanner("net.ranides").list()) {
+        for(Class<?> clazz : PackageScanner.list("net.ranides")) {
             LoggerUtils.dump("   - %d. %s\n", i++, clazz);
         }
 
-        LoggerUtils.dump("count = %d \n", new PackageScanner("net.ranides").list().size() );
+        LoggerUtils.dump("count = %d \n", PackageScanner.list("net.ranides").size() );
 
-        LoggerUtils.dump("count = %d \n", new PackageScanner("net.ranides.assira").list().size() );
+        LoggerUtils.dump("count = %d \n", PackageScanner.list("net.ranides.assira").size() );
 
-        LoggerUtils.dump("count = %d \n", new PackageScanner("net.ranides.assira.collection").list().size() );
+        LoggerUtils.dump("count = %d \n", PackageScanner.list("net.ranides.assira.collection").size() );
 
-        LoggerUtils.dump("count = %d \n", new PackageScanner("net.ranides.assira.collection.map").list().size() );
+        LoggerUtils.dump("count = %d \n", PackageScanner.list("net.ranides.assira.collection.map").size() );
 
         assertTrue(true);
     }