diff options
author | Rich Hickey <richhickey@gmail.com> | 2006-06-05 17:25:36 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2006-06-05 17:25:36 +0000 |
commit | 526f5470cfa19f27039e287434eb6d26a7671bdd (patch) | |
tree | edd8f742d3dacc8fe167415b481e3c96264e3513 /src/org/clojure | |
parent | 0eb8b48657c82fa2d301fef08180e51cddd3d3ff (diff) |
distinguished inner/leaf entries
Diffstat (limited to 'src/org/clojure')
-rw-r--r-- | src/org/clojure/runtime/PersistentArray.java | 33 |
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(); } |