diff options
author | Rich Hickey <richhickey@gmail.com> | 2006-06-11 21:07:38 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2006-06-11 21:07:38 +0000 |
commit | 48bd0825f45f2255d851ba0f3236a454f6178ae0 (patch) | |
tree | 0a0fc414d2e80b70e9c4f8a318d7073978904024 /src/jvm/clojure | |
parent | 8671005cec92c0ad806828eb4df605b17aadae4c (diff) |
made Objs based upon ArrayIdentityMap, allowed out-of-transaction reads of current vals
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/IObj.java | 18 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Obj.java | 30 | ||||
-rw-r--r-- | src/jvm/clojure/lang/TObj.java | 28 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Transaction.java | 5 |
4 files changed, 45 insertions, 36 deletions
diff --git a/src/jvm/clojure/lang/IObj.java b/src/jvm/clojure/lang/IObj.java index 51eeba88..7ff70288 100644 --- a/src/jvm/clojure/lang/IObj.java +++ b/src/jvm/clojure/lang/IObj.java @@ -10,17 +10,15 @@ package clojure.lang;
-/**
- * Created by IntelliJ IDEA.
- * User: rich
- * Date: May 31, 2006
- * Time: 3:41:10 PM
- * To change this template use File | Settings | File Templates.
- */
+
public interface IObj {
-Object put( Comparable key, Object val) throws Exception;
+Object put( Object key, Object val) throws Exception;
+
+Object get( Object key) throws Exception;
+
+boolean has( Object key) throws Exception;
-Object get( Comparable key) throws Exception;
+IPersistentMap attrs() throws Exception;
-boolean has( Comparable key) throws Exception;
+void remove(Object key) throws Exception;
}
diff --git a/src/jvm/clojure/lang/Obj.java b/src/jvm/clojure/lang/Obj.java index 30569bb7..a15d912c 100644 --- a/src/jvm/clojure/lang/Obj.java +++ b/src/jvm/clojure/lang/Obj.java @@ -12,33 +12,31 @@ package clojure.lang; -import java.util.IdentityHashMap; - public class Obj implements IObj { -IdentityHashMap attrs; -public static final int INITIAL_SIZE = 7; +volatile IPersistentMap _attrs = PersistentArrayIdentityMap.EMPTY; -public Object put( Comparable key, Object val) +public Object put( Object key, Object val) { - if(attrs == null) - attrs = new IdentityHashMap(INITIAL_SIZE); - attrs.put(key, val); + _attrs = _attrs.put(key, val); return val; } -public Object get( Comparable key) +public Object get( Object key) { - if(attrs == null) - return null; - return attrs.get(key); + return _attrs.get(key); } -public boolean has( Comparable key){ - if(attrs == null) - return false; - return attrs.containsKey(key); +public boolean has( Object key){ + return _attrs.contains(key); } +public IPersistentMap attrs() { + return _attrs; +} + +public void remove(Object key) { + _attrs = _attrs.remove(key); +} } diff --git a/src/jvm/clojure/lang/TObj.java b/src/jvm/clojure/lang/TObj.java index dfa65152..05dead2e 100644 --- a/src/jvm/clojure/lang/TObj.java +++ b/src/jvm/clojure/lang/TObj.java @@ -11,27 +11,37 @@ package clojure.lang;
public class TObj implements IObj{
-TRef attrs;
+TRef _attrs;
public TObj() throws Exception{
- this.attrs = Transaction.tref(new PersistentTree());
+ this._attrs = Transaction.tref(PersistentArrayIdentityMap.EMPTY);
}
-public Object put( Comparable key, Object val) throws Exception {
- PersistentTree t = (PersistentTree) Transaction.get2( attrs);
+public Object put( Object key, Object val) throws Exception {
+ IPersistentMap t = (IPersistentMap) Transaction.get2( _attrs);
t = t.put(key, val);
- Transaction.set2(attrs,t);
+ Transaction.set2(_attrs,t);
return val;
}
-public Object get( Comparable key) throws Exception {
- PersistentTree t = (PersistentTree) Transaction.get2( attrs);
+public Object get( Object key) throws Exception {
+ IPersistentMap t = (IPersistentMap) Transaction.get2( _attrs);
return t.get(key);
}
-public boolean has( Comparable key) throws Exception {
- PersistentTree t = (PersistentTree) Transaction.get2( attrs);
+public boolean has( Object key) throws Exception {
+ IPersistentMap t = (IPersistentMap) Transaction.get2( _attrs);
return t.contains(key);
}
+
+public IPersistentMap attrs() throws Exception {
+ return (IPersistentMap) Transaction.get2(_attrs);
+}
+
+public void remove(Object key) throws Exception {
+ IPersistentMap t = (IPersistentMap) Transaction.get2( _attrs);
+ t = t.remove(key);
+ Transaction.set2(_attrs,t);
+}
}
diff --git a/src/jvm/clojure/lang/Transaction.java b/src/jvm/clojure/lang/Transaction.java index dcff2077..3f7862a2 100644 --- a/src/jvm/clojure/lang/Transaction.java +++ b/src/jvm/clojure/lang/Transaction.java @@ -69,7 +69,10 @@ static public TRef tref(Object val) throws Exception{ //* static public Object get2(TRef tref) throws Exception{ - return ThreadLocalData.getTransaction().get(tref); + Transaction trans = ThreadLocalData.getTransaction(); + if(trans != null) + return trans.get(tref); + return getCurrent(tref).val; } static public Object set2(TRef tref, Object val) throws Exception{ |