summaryrefslogtreecommitdiff
path: root/src/org/clojure
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2006-06-05 17:25:36 +0000
committerRich Hickey <richhickey@gmail.com>2006-06-05 17:25:36 +0000
commit526f5470cfa19f27039e287434eb6d26a7671bdd (patch)
treeedd8f742d3dacc8fe167415b481e3c96264e3513 /src/org/clojure
parent0eb8b48657c82fa2d301fef08180e51cddd3d3ff (diff)
distinguished inner/leaf entries
Diffstat (limited to 'src/org/clojure')
-rw-r--r--src/org/clojure/runtime/PersistentArray.java33
1 files changed, 27 insertions, 6 deletions
diff --git a/src/org/clojure/runtime/PersistentArray.java b/src/org/clojure/runtime/PersistentArray.java
index 30fd2636..9a0acc6d 100644
--- a/src/org/clojure/runtime/PersistentArray.java
+++ b/src/org/clojure/runtime/PersistentArray.java
@@ -74,13 +74,34 @@ static class Master{
static class Entry{
final int rev;
final Object val;
- final Entry rest;
- Entry(int rev,Object val,Entry rest){
+ Entry(int rev,Object val){
this.rev = rev;
this.val = val;
- this.rest = rest;
}
+
+ Entry rest(){
+ return null;
+ }
+
+ static Entry create(int rev,Object val,Entry rest){
+ if(rest == null)
+ return new Entry(rev,val);
+ return new EntryLink(rev, val, rest);
+ }
+}
+
+static class EntryLink extends Entry{
+ final Entry _rest;
+
+ EntryLink(int rev,Object val,Entry rest){
+ super(rev,val);
+ this._rest = rest;
+ }
+
+ Entry rest(){
+ return _rest;
+ }
}
static class ValIter implements Iterator{
@@ -157,7 +178,7 @@ public PersistentArray resize(int newLength) {
Entry e = getEntry(i);
if(e != null)
{
- ret.master.array.set(i,new Entry(0,e.val, null));
+ ret.master.array.set(i,Entry.create(0,e.val, null));
++load;
}
}
@@ -180,7 +201,7 @@ public PersistentArray isolate() {
}
Entry getEntry(int i){
- for(Entry e = (Entry) master.array.get(i);e != null;e = e.rest)
+ for(Entry e = (Entry) master.array.get(i);e != null;e = e.rest())
{
if(e.rev <= rev)
{
@@ -205,7 +226,7 @@ void doSet(int i, Object val){
do
{
oldEntry = (Entry) master.array.get(i);
- newEntry = new Entry(rev, val, oldEntry);
+ newEntry = Entry.create(rev, val, oldEntry);
} while(!master.array.compareAndSet(i, oldEntry, newEntry));
master.load.incrementAndGet();
}