mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			198 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| /**
 | |
|  *   Copyright (c) Rich Hickey. All rights reserved.
 | |
|  *   The use and distribution terms for this software are covered by the
 | |
|  *   Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
 | |
|  *   which can be found in the file epl-v10.html at the root of this distribution.
 | |
|  *   By using this software in any fashion, you are agreeing to be bound by
 | |
|  * 	 the terms of this license.
 | |
|  *   You must not remove this notice, or any other, from this software.
 | |
|  **/
 | |
| 
 | |
| /* rich Apr 19, 2008 */
 | |
| 
 | |
| package clojure.lang;
 | |
| 
 | |
| import java.lang.ref.Reference;
 | |
| import java.math.BigInteger;
 | |
| import java.util.Map;
 | |
| import java.util.concurrent.ConcurrentHashMap;
 | |
| import java.lang.ref.SoftReference;
 | |
| import java.lang.ref.ReferenceQueue;
 | |
| 
 | |
| public class Util{
 | |
| static public boolean equiv(Object k1, Object k2){
 | |
| 	if(k1 == k2)
 | |
| 		return true;
 | |
| 	if(k1 != null)
 | |
| 		{
 | |
| 		if(k1 instanceof Number && k2 instanceof Number)
 | |
| 			return Numbers.equal((Number)k1, (Number)k2);
 | |
| 		else if(k1 instanceof IPersistentCollection || k2 instanceof IPersistentCollection)
 | |
| 			return pcequiv(k1,k2);
 | |
| 		return k1.equals(k2);
 | |
| 		}
 | |
| 	return false;
 | |
| }
 | |
| 
 | |
| static public boolean equiv(long k1, long k2){
 | |
| 	return k1 == k2;
 | |
| }
 | |
| 
 | |
| static public boolean equiv(Object k1, long k2){
 | |
| 	return equiv(k1, (Object)k2);
 | |
| }
 | |
| 
 | |
| static public boolean equiv(long k1, Object k2){
 | |
| 	return equiv((Object)k1, k2);
 | |
| }
 | |
| 
 | |
| static public boolean equiv(double k1, double k2){
 | |
| 	return k1 == k2;
 | |
| }
 | |
| 
 | |
| static public boolean equiv(Object k1, double k2){
 | |
| 	return equiv(k1, (Object)k2);
 | |
| }
 | |
| 
 | |
| static public boolean equiv(double k1, Object k2){
 | |
| 	return equiv((Object)k1, k2);
 | |
| }
 | |
| 
 | |
| static public boolean equiv(boolean k1, boolean k2){
 | |
| 	return k1 == k2;
 | |
| }
 | |
| 
 | |
| static public boolean equiv(Object k1, boolean k2){
 | |
| 	return equiv(k1, (Object)k2);
 | |
| }
 | |
| 
 | |
| static public boolean equiv(boolean k1, Object k2){
 | |
| 	return equiv((Object)k1, k2);
 | |
| }
 | |
| 
 | |
| static public boolean equiv(char c1, char c2) {
 | |
|     return c1 == c2;
 | |
| }
 | |
| 
 | |
| static public boolean pcequiv(Object k1, Object k2){
 | |
| 	if(k1 instanceof IPersistentCollection)
 | |
| 		return ((IPersistentCollection)k1).equiv(k2);
 | |
| 	return ((IPersistentCollection)k2).equiv(k1);
 | |
| }
 | |
| 
 | |
| static public boolean equals(Object k1, Object k2){
 | |
| 	if(k1 == k2)
 | |
| 		return true;
 | |
| 	return k1 != null && k1.equals(k2);
 | |
| }
 | |
| 
 | |
| static public boolean identical(Object k1, Object k2){
 | |
| 	return k1 == k2;
 | |
| }
 | |
| 
 | |
| static public Class classOf(Object x){
 | |
| 	if(x != null)
 | |
| 		return x.getClass();
 | |
| 	return null;
 | |
| }
 | |
| 
 | |
| static public int compare(Object k1, Object k2){
 | |
| 	if(k1 == k2)
 | |
| 		return 0;
 | |
| 	if(k1 != null)
 | |
| 		{
 | |
| 		if(k2 == null)
 | |
| 			return 1;
 | |
| 		if(k1 instanceof Number)
 | |
| 			return Numbers.compare((Number) k1, (Number) k2);
 | |
| 		return ((Comparable) k1).compareTo(k2);
 | |
| 		}
 | |
| 	return -1;
 | |
| }
 | |
| 
 | |
| static public int hash(Object o){
 | |
| 	if(o == null)
 | |
| 		return 0;
 | |
| 	return o.hashCode();
 | |
| }
 | |
| 
 | |
| static public int hasheq(Object o){
 | |
| 	if(o == null)
 | |
| 		return 0;
 | |
| 	if(o instanceof Number)
 | |
| 		return Numbers.hasheq((Number)o);
 | |
| 	else if(o instanceof IHashEq)
 | |
| 		return ((IHashEq)o).hasheq();
 | |
| 	return o.hashCode();
 | |
| }
 | |
| 
 | |
| static public int hashCombine(int seed, int hash){
 | |
| 	//a la boost
 | |
| 	seed ^= hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
 | |
| 	return seed;
 | |
| }
 | |
| 
 | |
| static public boolean isPrimitive(Class c){
 | |
| 	return c != null && c.isPrimitive() && !(c == Void.TYPE);
 | |
| }
 | |
| 
 | |
| static public boolean isInteger(Object x){
 | |
| 	return x instanceof Integer
 | |
| 			|| x instanceof Long
 | |
| 	        || x instanceof BigInt
 | |
| 			|| x instanceof BigInteger;
 | |
| }
 | |
| 
 | |
| static public Object ret1(Object ret, Object nil){
 | |
| 		return ret;
 | |
| }
 | |
| 
 | |
| static public ISeq ret1(ISeq ret, Object nil){
 | |
| 		return ret;
 | |
| }
 | |
| 
 | |
| static public <K,V> void clearCache(ReferenceQueue rq, ConcurrentHashMap<K, Reference<V>> cache){
 | |
| 		//cleanup any dead entries
 | |
| 	if(rq.poll() != null)
 | |
| 		{
 | |
| 		while(rq.poll() != null)
 | |
| 			;
 | |
| 		for(Map.Entry<K, Reference<V>> e : cache.entrySet())
 | |
| 			{
 | |
|             Reference<V> val = e.getValue();
 | |
| 			if(val != null && val.get() == null)
 | |
| 				cache.remove(e.getKey(), val);
 | |
| 			}
 | |
| 		}
 | |
| }
 | |
| 
 | |
| static public RuntimeException runtimeException(String s){
 | |
| 	return new RuntimeException(s);
 | |
| }
 | |
| 
 | |
| static public RuntimeException runtimeException(String s, Throwable e){
 | |
| 	return new RuntimeException(s, e);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Throw even checked exceptions without being required
 | |
|  * to declare them or catch them. Suggested idiom:
 | |
|  * <p>
 | |
|  * <code>throw sneakyThrow( some exception );</code>
 | |
|  */
 | |
| static public RuntimeException sneakyThrow(Throwable t) {
 | |
|     // http://www.mail-archive.com/javaposse@googlegroups.com/msg05984.html
 | |
| 	if (t == null)
 | |
| 		throw new NullPointerException();
 | |
| 	Util.<RuntimeException>sneakyThrow0(t);
 | |
| 	return null;
 | |
| }
 | |
| 
 | |
| @SuppressWarnings("unchecked")
 | |
| static private <T extends Throwable> void sneakyThrow0(Throwable t) throws T {
 | |
| 	throw (T) t;
 | |
| }
 | |
| 
 | |
| }
 | |
| 
 |