From 49b438a050ef896e00c9627822886d17d91327ea Mon Sep 17 00:00:00 2001 From: Maciej Piechotka Date: Sun, 2 Dec 2012 02:46:47 +0000 Subject: [PATCH] Small improvement to ConcurrentList.Iterator --- gee/concurrentlist.vala | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/gee/concurrentlist.vala b/gee/concurrentlist.vala index 9dadd3a..1a50172 100644 --- a/gee/concurrentlist.vala +++ b/gee/concurrentlist.vala @@ -261,7 +261,6 @@ public class Gee.ConcurrentList : AbstractList { private class Iterator : Object, Gee.Traversable, Gee.Iterator, ListIterator { public Iterator (Node head) { - _started = false; _removed = false; _index = -1; _prev = null; @@ -274,9 +273,8 @@ public class Gee.ConcurrentList : AbstractList { bool success = Node.proceed (ref _prev, ref _curr); if (success) { if (_removed) - _prev = _old_prev; + _prev = (owned)_old_prev; _removed = false; - _started = true; _index++; } return success; @@ -285,7 +283,7 @@ public class Gee.ConcurrentList : AbstractList { public bool has_next () { HazardPointer.Context ctx = new HazardPointer.Context (); Node? prev = _prev; - Node? curr = _curr; + Node curr = _curr; return Node.proceed (ref prev, ref curr); } @@ -316,7 +314,10 @@ public class Gee.ConcurrentList : AbstractList { } public bool valid { - get { return _started && !_removed && _curr != null; } + get { + assert (_curr != null); + return _prev != null && !_removed; + } } public bool read_only { get { return false; } } @@ -341,7 +342,7 @@ public class Gee.ConcurrentList : AbstractList { public new bool foreach (ForallFunc f) { HazardPointer.Context ctx = new HazardPointer.Context (); - if (_started && !_removed) { + if (_prev != null && !_removed) { if (!f (HazardPointer.get_pointer (&_curr._data))) { return false; } @@ -349,9 +350,8 @@ public class Gee.ConcurrentList : AbstractList { Node? _old_prev = _removed ? _prev : null; while (Node.proceed (ref _prev, ref _curr)) { if (_removed) - _prev = _old_prev; + _prev = (owned)_old_prev; _removed = false; - _started = true; _index++; if (!f (HazardPointer.get_pointer (&_curr._data))) { return false; @@ -360,11 +360,10 @@ public class Gee.ConcurrentList : AbstractList { return true; } - private bool _started; private bool _removed; private int _index; - private Node _prev; - private Node? _curr; + private Node? _prev; + private Node _curr; } private class Node { -- 2.7.4