summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-06-11 21:07:38 +0000
committerRich Hickey <richhickey@gmail.com>2006-06-11 21:07:38 +0000
commit48bd0825f45f2255d851ba0f3236a454f6178ae0 (patch)
tree0a0fc414d2e80b70e9c4f8a318d7073978904024
parent8671005cec92c0ad806828eb4df605b17aadae4c (diff)
made Objs based upon ArrayIdentityMap, allowed out-of-transaction reads of current vals
-rw-r--r--src/cli/runtime/IObj.cs22
-rw-r--r--src/cli/runtime/Obj.cs43
-rw-r--r--src/cli/runtime/TObj.cs33
-rw-r--r--src/cli/runtime/Transaction.cs7
-rw-r--r--src/jvm/clojure/lang/IObj.java18
-rw-r--r--src/jvm/clojure/lang/Obj.java30
-rw-r--r--src/jvm/clojure/lang/TObj.java28
-rw-r--r--src/jvm/clojure/lang/Transaction.java5
8 files changed, 108 insertions, 78 deletions
diff --git a/src/cli/runtime/IObj.cs b/src/cli/runtime/IObj.cs
index c94ef5dc..6e101dbb 100644
--- a/src/cli/runtime/IObj.cs
+++ b/src/cli/runtime/IObj.cs
@@ -10,11 +10,17 @@
using System;
namespace clojure.lang
- {
- interface IObj
- {
- object put( IComparable key, object val);
- object get( IComparable key);
- bool has( IComparable key);
- }
- }
+ {
+ interface IObj
+ {
+ Object put(Object key, Object val);
+
+ Object get(Object key);
+
+ bool has(Object key);
+
+ IPersistentMap attrs();
+
+ void remove(Object key);
+ }
+ }
diff --git a/src/cli/runtime/Obj.cs b/src/cli/runtime/Obj.cs
index 269a4156..32684a6b 100644
--- a/src/cli/runtime/Obj.cs
+++ b/src/cli/runtime/Obj.cs
@@ -11,37 +11,38 @@
/* rich Mar 25, 2006 3:44:58 PM */
using System;
-using System.Collections.Specialized;
namespace clojure.lang
{
public class Obj : IObj
{
-
-HybridDictionary attrs;
-public static int INITIAL_SIZE = 7;
+volatile IPersistentMap _attrs = PersistentArrayIdentityMap.EMPTY;
-public Object put( IComparable key, Object val)
- {
- if(attrs == null)
- attrs = new HybridDictionary(INITIAL_SIZE);
- attrs[key] = val;
- return val;
+public Object put( Object key, Object val)
+ {
+ _attrs = _attrs.put(key, val);
+ return val;
}
-public Object get( IComparable key)
- {
- if(attrs == null)
- return null;
- return attrs[key];
+public Object get( Object key)
+ {
+ return _attrs.get(key);
}
-public bool has( IComparable key)
- {
- if (attrs == null)
- return false;
- return attrs.Contains(key);
- }
+public bool has( Object key){
+ return _attrs.contains(key);
+ }
+
+
+public IPersistentMap attrs() {
+ return _attrs;
+}
+
+public void remove(Object key) {
+ _attrs = _attrs.remove(key);
}
+
+}
+
} \ No newline at end of file
diff --git a/src/cli/runtime/TObj.cs b/src/cli/runtime/TObj.cs
index e9116cab..dcee3060 100644
--- a/src/cli/runtime/TObj.cs
+++ b/src/cli/runtime/TObj.cs
@@ -14,27 +14,38 @@ namespace clojure.lang
{
public class TObj : IObj{
-TRef attrs;
+TRef _attrs;
-public TObj() {
- this.attrs = Transaction.tref(new PersistentTree());
+public TObj(){
+ this._attrs = Transaction.tref(PersistentArrayIdentityMap.EMPTY);
}
-public Object put( IComparable key, Object val) {
- PersistentTree t = (PersistentTree) Transaction.get2( attrs);
- t = (PersistentTree) t.put(key, val);
- Transaction.set2(attrs,t);
+
+public Object put( Object key, Object val) {
+ IPersistentMap t = (IPersistentMap) Transaction.get2( _attrs);
+ t = t.put(key, val);
+ Transaction.set2(_attrs,t);
return val;
}
-public Object get( IComparable key) {
- PersistentTree t = (PersistentTree) Transaction.get2( attrs);
+public Object get( Object key) {
+ IPersistentMap t = (IPersistentMap) Transaction.get2( _attrs);
return t.get(key);
}
-public bool has( IComparable key) {
- PersistentTree t = (PersistentTree) Transaction.get2( attrs);
+public bool has( Object key) {
+ IPersistentMap t = (IPersistentMap) Transaction.get2( _attrs);
return t.contains(key);
}
+
+public IPersistentMap attrs() {
+ return (IPersistentMap) Transaction.get2(_attrs);
+}
+
+public void remove(Object key) {
+ IPersistentMap t = (IPersistentMap) Transaction.get2( _attrs);
+ t = t.remove(key);
+ Transaction.set2(_attrs,t);
+}
}
}
diff --git a/src/cli/runtime/Transaction.cs b/src/cli/runtime/Transaction.cs
index 21ff35bc..aaaac9dc 100644
--- a/src/cli/runtime/Transaction.cs
+++ b/src/cli/runtime/Transaction.cs
@@ -71,8 +71,11 @@ static public TRef tref(Object val) {
}
static public Object get2(TRef tref) {
- 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) {
return ThreadLocalData.getTransaction().set(tref,val);
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{