commit f1507b1ff6bb1b5655ded6a42253ff5981ec7b5f
parent b0c76f4d1af96ba63c18417310a3d01f1f313d41
Author: Tomas Hlavaty <tom@logand.com>
Date:   Sat, 26 Dec 2015 22:56:22 +0100
remove tabs
Diffstat:
5 files changed, 268 insertions(+), 270 deletions(-)
diff --git a/src/jmultimethod/AsteroidTest.java b/src/jmultimethod/AsteroidTest.java
@@ -4,81 +4,81 @@ package jmultimethod;
 
 public class AsteroidTest {
 
-	class Asteroid {}
-
-	class Spaceship {}
-
-	@Multi("collide")
-	public void collideOO(Object X, Object Y) {
-	   log("?? Bang, what happened? ", X, Y);
-	}
-
-	@Multi("collide")
-	public void collideAA(Asteroid X, Asteroid Y) {
-		log("AA Look at the beautiful fireworks! ", X, Y);
-	}
-
-	@Multi("collide")
-	public void collideAS(Asteroid X, Spaceship Y) {
-		log("AS Is it fatal? ", X, Y);
-	}
-
-	@Multi("collide")
-	public void collideSA(Spaceship X, Asteroid Y) {
-		log("SA Is it fatal? ", X, Y);
-	}
-
-	@Multi("collide")
-	public void collideSS(Spaceship X, Spaceship Y) {
-		log("SS Who's fault was it? ", X, Y);
-	}
-
-	@Multi("collide")
-	public void collide1S(String X, Spaceship Y) {
-		log("1S any string? ", X, Y);
-	}
-
-	@Multi("collide")
-	public void collide2S(@V("hi") String X, Spaceship Y) {
-		log("2S 'hi' value? ", X, Y);
-	}
-
-	protected Multimethod mm = new Multimethod("collide", getClass());
-
-	public void collide(Object X, Object Y) {
-		mm.invoke(this, X, Y);
-	}
-
-	public void run() {
-		Object A = new Asteroid();
-		Object S = new Spaceship();
-		collide(A, A);
-		collide(A, S);
-		collide(S, A);
-		collide(S, S);
-		collide(A, 1);
-		collide(2, A);
-		collide(S, 3);
-		collide(4, S);
-		collide(5, null);
-		collide(null, null);
-		collide("hi", S);
-		collide("hello", S);
-	}
-
-	public void log(Object... args) {
-		for(Object o: args) {
-			if(o instanceof String) {
-				System.out.print(" " + (String) o);
-			} else {
-				System.out.print(" " + o);
-			}
-		}
-		System.out.println();
-	}
-
-	public static void main(String[] args) throws Exception {
-		AsteroidTest t = new AsteroidTest();
-		t.run();
-	}
+    class Asteroid {}
+
+    class Spaceship {}
+
+    @Multi("collide")
+    public void collideOO(Object X, Object Y) {
+        log("?? Bang, what happened? ", X, Y);
+    }
+
+    @Multi("collide")
+    public void collideAA(Asteroid X, Asteroid Y) {
+        log("AA Look at the beautiful fireworks! ", X, Y);
+    }
+
+    @Multi("collide")
+    public void collideAS(Asteroid X, Spaceship Y) {
+        log("AS Is it fatal? ", X, Y);
+    }
+
+    @Multi("collide")
+    public void collideSA(Spaceship X, Asteroid Y) {
+        log("SA Is it fatal? ", X, Y);
+    }
+
+    @Multi("collide")
+    public void collideSS(Spaceship X, Spaceship Y) {
+        log("SS Who's fault was it? ", X, Y);
+    }
+
+    @Multi("collide")
+    public void collide1S(String X, Spaceship Y) {
+        log("1S any string? ", X, Y);
+    }
+
+    @Multi("collide")
+    public void collide2S(@V("hi") String X, Spaceship Y) {
+        log("2S 'hi' value? ", X, Y);
+    }
+
+    protected Multimethod mm = new Multimethod("collide", getClass());
+
+    public void collide(Object X, Object Y) {
+        mm.invoke(this, X, Y);
+    }
+
+    public void run() {
+        Object A = new Asteroid();
+        Object S = new Spaceship();
+        collide(A, A);
+        collide(A, S);
+        collide(S, A);
+        collide(S, S);
+        collide(A, 1);
+        collide(2, A);
+        collide(S, 3);
+        collide(4, S);
+        collide(5, null);
+        collide(null, null);
+        collide("hi", S);
+        collide("hello", S);
+    }
+
+    public void log(Object... args) {
+        for(Object o: args) {
+            if(o instanceof String) {
+                System.out.print(" " + (String) o);
+            } else {
+                System.out.print(" " + o);
+            }
+        }
+        System.out.println();
+    }
+
+    public static void main(String[] args) throws Exception {
+        AsteroidTest t = new AsteroidTest();
+        t.run();
+    }
 }
diff --git a/src/jmultimethod/CarTest.java b/src/jmultimethod/CarTest.java
@@ -4,97 +4,97 @@ package jmultimethod;
 
 public class CarTest {
 
-	interface CarElement {}
-
-	class Wheel implements CarElement {
-	    private String name;
-	    Wheel(String name) {
-	        this.name = name;
-	    }
-	    String getName() {
-	        return this.name;
-	    }
-	}
-
-	class Engine implements CarElement {}
-
-	class Body implements CarElement {}
-
-	class Car {
-	    CarElement[] elements;
-	    public CarElement [] getElements() {
-	        return elements.clone();
-	    }
-	    public Car() {
-	        this.elements = new CarElement[]
-	          { new Wheel("front left"), new Wheel("front right"),
-	            new Wheel("back left") , new Wheel("back right"),
-	            new Body(), new Engine()};
-	    }
-	}
-
-	@Multi("visit")
-	public void visitP(Wheel wheel, @V("print") String mode) {
-		System.out.println("Visiting "+ wheel.getName() + " wheel");
-	}
-
-	@Multi("visit")
-	public void visitP(Engine engine, @V("print") String mode) {
-		System.out.println("Visiting engine");
-	}
-
-	@Multi("visit")
-	public void visitP(Body body, @V("print") String mode) {
-		System.out.println("Visiting body");
-	}
-
-	@Multi("visit")
-	public void visitP(Car car, @V("print") String mode) {
-		System.out.println("\nVisiting car");
-		for(CarElement element : car.getElements()) {
-			visit(element, mode);
-		}
-		System.out.println("Visited car");
-	}
-
-	@Multi("visit")
-	public void visitD(Wheel wheel, @V("do") String mode) {
-		System.out.println("Kicking my "+ wheel.getName());
-	}
-
-	@Multi("visit")
-	public void visitD(Engine engine, @V("do") String mode) {
-		System.out.println("Starting my engine");
-	}
-
-	@Multi("visit")
-	public void visitD(Body body, @V("do") String mode) {
-		System.out.println("Moving my body");
-	}
-
-	@Multi("visit")
-	public void visitD(Car car, @V("do") String mode) {
-		System.out.println("\nStarting my car");
-		for(CarElement element : car.getElements()) {
-			visit(element, mode);
-		}
-		System.out.println("Started car");
-	}
-
-	protected Multimethod mm = new Multimethod("visit", getClass());
-
-	public void visit(Object any, String mode) {
-		mm.invoke(this, any, mode);
-	}
-
-	public void run() {
-		Car car = new Car();
-		visit(car, "print");
-		visit(car, "do");
-	}
-
-	static public void main(String[] args){
-		CarTest t = new CarTest();
-		t.run();
-	}
+    interface CarElement {}
+
+    class Wheel implements CarElement {
+        private String name;
+        Wheel(String name) {
+            this.name = name;
+        }
+        String getName() {
+            return this.name;
+        }
+    }
+
+    class Engine implements CarElement {}
+
+    class Body implements CarElement {}
+
+    class Car {
+        CarElement[] elements;
+        public CarElement [] getElements() {
+            return elements.clone();
+        }
+        public Car() {
+            this.elements = new CarElement[]
+                { new Wheel("front left"), new Wheel("front right"),
+                  new Wheel("back left") , new Wheel("back right"),
+                  new Body(), new Engine()};
+        }
+    }
+
+    @Multi("visit")
+    public void visitP(Wheel wheel, @V("print") String mode) {
+        System.out.println("Visiting "+ wheel.getName() + " wheel");
+    }
+
+    @Multi("visit")
+    public void visitP(Engine engine, @V("print") String mode) {
+        System.out.println("Visiting engine");
+    }
+
+    @Multi("visit")
+    public void visitP(Body body, @V("print") String mode) {
+        System.out.println("Visiting body");
+    }
+
+    @Multi("visit")
+    public void visitP(Car car, @V("print") String mode) {
+        System.out.println("\nVisiting car");
+        for(CarElement element : car.getElements()) {
+            visit(element, mode);
+        }
+        System.out.println("Visited car");
+    }
+
+    @Multi("visit")
+    public void visitD(Wheel wheel, @V("do") String mode) {
+        System.out.println("Kicking my "+ wheel.getName());
+    }
+
+    @Multi("visit")
+    public void visitD(Engine engine, @V("do") String mode) {
+        System.out.println("Starting my engine");
+    }
+
+    @Multi("visit")
+    public void visitD(Body body, @V("do") String mode) {
+        System.out.println("Moving my body");
+    }
+
+    @Multi("visit")
+    public void visitD(Car car, @V("do") String mode) {
+        System.out.println("\nStarting my car");
+        for(CarElement element : car.getElements()) {
+            visit(element, mode);
+        }
+        System.out.println("Started car");
+    }
+
+    protected Multimethod mm = new Multimethod("visit", getClass());
+
+    public void visit(Object any, String mode) {
+        mm.invoke(this, any, mode);
+    }
+
+    public void run() {
+        Car car = new Car();
+        visit(car, "print");
+        visit(car, "do");
+    }
+
+    static public void main(String[] args){
+        CarTest t = new CarTest();
+        t.run();
+    }
 }
diff --git a/src/jmultimethod/Multi.java b/src/jmultimethod/Multi.java
@@ -8,6 +8,5 @@ import java.lang.annotation.Target;
 @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Multi {
-
-	public String value();
+    public String value();
 }
diff --git a/src/jmultimethod/Multimethod.java b/src/jmultimethod/Multimethod.java
@@ -8,107 +8,107 @@ import java.util.Comparator;
 
 public class Multimethod {
 
-	protected String name;
-	protected final ArrayList<Method> methods = new ArrayList<Method>();
-	protected final MethodComparator methodComparator = new MethodComparator();
+    protected String name;
+    protected final ArrayList<Method> methods = new ArrayList<Method>();
+    protected final MethodComparator methodComparator = new MethodComparator();
 
-	public Multimethod(String name, Class... classes) {
-		this.name = name;
-		for(Class c: classes) {
-			add(c);
-		}
-	}
+    public Multimethod(String name, Class... classes) {
+        this.name = name;
+        for(Class c: classes) {
+            add(c);
+        }
+    }
 
-	public void add(Class c) {
-		for(Method m: c.getMethods()) {
-			for(Annotation ma: m.getAnnotations()) {
-				if(ma instanceof Multi) {
-					Multi g = (Multi) ma;
-					if(this.name.equals(g.value())) {
-						methods.add(m);
-					}
-				}
-			}
-		}
-		sort();
-	}
+    public void add(Class c) {
+        for(Method m: c.getMethods()) {
+            for(Annotation ma: m.getAnnotations()) {
+                if(ma instanceof Multi) {
+                    Multi g = (Multi) ma;
+                    if(this.name.equals(g.value())) {
+                        methods.add(m);
+                    }
+                }
+            }
+        }
+        sort();
+    }
 
-	protected void sort() {
-		Method[] a = new Method[methods.size()];
-		methods.toArray(a);
-		Arrays.sort(a, methodComparator);
-		methods.clear();
-		for(Method m: a) {
-			methods.add(m);
-		}
-	}
+    protected void sort() {
+        Method[] a = new Method[methods.size()];
+        methods.toArray(a);
+        Arrays.sort(a, methodComparator);
+        methods.clear();
+        for(Method m: a) {
+            methods.add(m);
+        }
+    }
 
-	protected class MethodComparator implements Comparator<Method> {
-		@Override
-		public int compare(Method l, Method r) {
-			// most specific methods first
-			Class[] lc = l.getParameterTypes();
-			Class[] rc = r.getParameterTypes();
-			for(int i = 0; i < lc.length; i++) {
-				String lv = value(l, i);
-				String rv = value(r, i);
-				if(lv == null) {
-					if(rv != null) {
-						return 1;
-					}
-				}
-				if(lc[i].isAssignableFrom(rc[i])) {
-					return 1;
-				}
-			}
-			return -1;
-		}
-	}
+    protected class MethodComparator implements Comparator<Method> {
+        @Override
+        public int compare(Method l, Method r) {
+            // most specific methods first
+            Class[] lc = l.getParameterTypes();
+            Class[] rc = r.getParameterTypes();
+            for(int i = 0; i < lc.length; i++) {
+                String lv = value(l, i);
+                String rv = value(r, i);
+                if(lv == null) {
+                    if(rv != null) {
+                        return 1;
+                    }
+                }
+                if(lc[i].isAssignableFrom(rc[i])) {
+                    return 1;
+                }
+            }
+            return -1;
+        }
+    }
 
-	protected String value(Method method, int arg) {
-		Annotation[] a = method.getParameterAnnotations()[arg];
-		for(Annotation p: a) {
-			if(p instanceof V) {
-				V v = (V) p;
-				return v.value();
-			}
-		}
-		return null;
-	}
+    protected String value(Method method, int arg) {
+        Annotation[] a = method.getParameterAnnotations()[arg];
+        for(Annotation p: a) {
+            if(p instanceof V) {
+                V v = (V) p;
+                return v.value();
+            }
+        }
+        return null;
+    }
 
-	protected boolean isApplicable(Method method, Object... args) {
-		Class[] c = method.getParameterTypes();
-		for(int i = 0; i < c.length; i++) {
-			// must be instanceof and equal to annotated value if present
-			if(c[i].isInstance(args[i])) {
-				String v = value(method, i);
-				if(v != null && !v.equals(args[i])) {
-					return false;
-				}
-			} else {
-				if(args[i] != null || !Object.class.equals(c[i])) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
+    protected boolean isApplicable(Method method, Object... args) {
+        Class[] c = method.getParameterTypes();
+        for(int i = 0; i < c.length; i++) {
+            // must be instanceof and equal to annotated value if present
+            if(c[i].isInstance(args[i])) {
+                String v = value(method, i);
+                if(v != null && !v.equals(args[i])) {
+                    return false;
+                }
+            } else {
+                if(args[i] != null || !Object.class.equals(c[i])) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
 
-	public Object invoke(Object self, Object... args) {
-		Method m = null; // first applicable method (most specific)
-		for(Method method: methods) {
-			if(isApplicable(method, args)) {
-				m = method;
-				break;
-			}
-		}
-		if(m == null) {
-			throw new RuntimeException("No applicable method '" + name + "'.");
-		}
-		try {
-			return m.invoke(self, args);
-		} catch (Exception e) {
-			throw new RuntimeException("Method invocation failed '" + name + "'.");
-		}
-	}
+    public Object invoke(Object self, Object... args) {
+        Method m = null; // first applicable method (most specific)
+        for(Method method: methods) {
+            if(isApplicable(method, args)) {
+                m = method;
+                break;
+            }
+        }
+        if(m == null) {
+            throw new RuntimeException("No applicable method '" + name + "'.");
+        }
+        try {
+            return m.invoke(self, args);
+        } catch (Exception e) {
+            throw new RuntimeException("Method invocation failed '" + name + "'.");
+        }
+    }
 }
diff --git a/src/jmultimethod/V.java b/src/jmultimethod/V.java
@@ -8,6 +8,5 @@ import java.lang.annotation.Target;
 @Target(ElementType.PARAMETER)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface V {
-
-	public String value();
+    public String value();
 }