mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 09:40:21 +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;
|
|
}
|
|
|
|
}
|
|
|