Move stream_impl to Traversable
authorMaciej Piechotka <uzytkownik2@gmail.com>
Sun, 19 Aug 2012 02:53:44 +0000 (19:53 -0700)
committerMaciej Piechotka <uzytkownik2@gmail.com>
Sun, 19 Aug 2012 02:53:44 +0000 (19:53 -0700)
15 files changed:
gee/abstractmultiset.vala
gee/arraylist.vala
gee/arrayqueue.vala
gee/concurrentlist.vala
gee/hashmap.vala
gee/hashset.vala
gee/iterable.vala
gee/iterator.vala
gee/linkedlist.vala
gee/priorityqueue.vala
gee/traversable.vala
gee/treemap.vala
gee/treeset.vala
gee/unfolditerator.vala
tests/testcollection.vala

index 1a5e55b..088b19d 100644 (file)
@@ -165,9 +165,5 @@ public abstract class Gee.AbstractMultiSet<G> : AbstractCollection<G>, MultiSet<
                public Type element_type {
                        get { return typeof (G); }
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, G> f) {
-                       return Gee.Iterator.stream_impl<G, A>(this, (owned)f);
-               }
        }
 }
index 017eebe..fb59d5d 100644 (file)
@@ -402,10 +402,6 @@ public class Gee.ArrayList<G> : AbstractBidirList<G> {
                        }
                        _index = _list._size;
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, G> f) {
-                       return Gee.Iterator.stream_impl<G, A>(this, (owned)f);
-               }
        }
 }
 
index 0e18473..01b1d56 100644 (file)
@@ -322,10 +322,6 @@ public class Gee.ArrayQueue<G> : Gee.AbstractQueue<G>, Deque<G> {
                        }
                }
 
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<G, A> f) {
-                       return Gee.Iterator.stream_impl<G, A> (this, (owned)f);
-               }
-
                private ArrayQueue _queue;
                private int _stamp;
                private int _offset = -1;
index 5ef30c9..fa5acf9 100644 (file)
@@ -357,10 +357,6 @@ public class Gee.ConcurrentList<G> : AbstractList<G> {
                        }
                }
 
-               public Gee.Iterator<G> stream<A> (owned StreamFunc<G, A> f) {
-                       return Gee.Iterator.stream_impl<G, A> (this, (owned)f);
-               }
-
                private bool _started;
                private bool _removed;
                private int _index;
index eef1c18..c7d988b 100644 (file)
@@ -568,10 +568,6 @@ public class Gee.HashMap<K,V> : Gee.AbstractMap<K,V> {
                                        break;
                        } while(true);
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, K> f) {
-                       return Gee.Iterator.stream_impl<K, A>(this, (owned)f);
-               }
        }
 
        private class MapIterator<K,V> : NodeIterator<K,V>, Gee.MapIterator<K,V> {
@@ -657,10 +653,6 @@ public class Gee.HashMap<K,V> : Gee.AbstractMap<K,V> {
                                        break;
                        } while(true);
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, V> f) {
-                       return Gee.Iterator.stream_impl<V, A>(this, (owned)f);
-               }
        }
 
        private class EntryIterator<K,V> : NodeIterator<K,V>, Traversable<Map.Entry<K,V>>, Iterator<Map.Entry<K,V>> {
@@ -700,10 +692,6 @@ public class Gee.HashMap<K,V> : Gee.AbstractMap<K,V> {
                                        break;
                        } while(true);
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<Map.Entry<K,V>, A> f) {
-                       return Gee.Iterator.stream_impl<Map.Entry<K,V>, A>(this, (owned)f);
-               }
        }
 }
 
index b17d415..9af1a2c 100644 (file)
@@ -305,10 +305,6 @@ public class Gee.HashSet<G> : AbstractSet<G> {
                                }
                        }
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, G> f) {
-                       return Gee.Iterator.stream_impl<G, A>(this, (owned)f);
-               }
        }
 }
 
index 965bdab..5330c2f 100644 (file)
@@ -27,11 +27,6 @@ using GLib;
  */
 public interface Gee.Iterable<G> : Object, Traversable<G> {
        /**
-        * The type of the elements in this collection.
-        */
-       public abstract Type element_type { get; }
-
-       /**
         * Returns a {@link Iterator} that can be used for simple iteration over a
         * collection.
         *
index 65bd8af..b22fa10 100644 (file)
@@ -78,70 +78,6 @@ public interface Gee.Iterator<G> : Object, Traversable<G> {
        public abstract bool read_only { get; }
 
        /**
-        * Default implementation of {@link Traversable.stream}.
-        *
-        * @param self Current Iterator
-        * @param f Stream function
-        * @return Transformed stream
-        * @see Traversable.stream
-        */
-       public static Iterator<A> stream_impl<G, A> (Iterator<G> self, owned StreamFunc<G, A> f) {
-               Traversable.Stream str;
-               Lazy<A>? initial = null;
-               bool need_next = true;
-               str = f (Traversable.Stream.YIELD, null, out initial);
-               switch (str) {
-               case Traversable.Stream.CONTINUE:
-                       if (self.valid) {
-                               str = f (Traversable.Stream.CONTINUE, new Lazy<G> (() => {return self.get ();}), out initial);
-                               switch (str) {
-                               case Traversable.Stream.YIELD:
-                               case Traversable.Stream.CONTINUE:
-                                       break;
-                               case Traversable.Stream.END:
-                                       return unfold<A> (() => {return null;});
-                               default:
-                                       assert_not_reached ();
-                               }
-                       }
-                       break;
-               case Traversable.Stream.YIELD:
-                       if (self.valid)
-                               need_next = false;
-                       break;
-               case Traversable.Stream.END:
-                       return unfold<A> (() => {return null;});
-               default:
-                       assert_not_reached ();
-               }
-               return unfold<A> (() => {
-                       Lazy<A>? val = null;
-                       if (str != Traversable.Stream.CONTINUE)
-                               str = f (Traversable.Stream.YIELD, null, out val);
-                       while (str == Traversable.Stream.CONTINUE) {
-                               if (need_next) {
-                                       if (!self.next ()) {
-                                               str = f (Traversable.Stream.END, null, out val);
-                                               assert (str != Traversable.Stream.CONTINUE);
-                                               break;
-                                       }
-                               } else {
-                                       need_next = true;
-                               }
-                               str = f (Traversable.Stream.CONTINUE, new Lazy<G> (() => {return self.get ();}), out val);
-                       }
-                       switch (str) {
-                       case Traversable.Stream.YIELD:
-                               return val;
-                       case Traversable.Stream.END:
-                               return null;
-                       default:
-                               assert_not_reached ();
-                       }
-               }, initial);
-       }
-
-       /**
         * Create iterator from unfolding function. The lazy value is
         * force-evaluated before progressing to next element.
         *
index 0bc17e5..26e8a68 100644 (file)
@@ -623,10 +623,6 @@ public class Gee.LinkedList<G> : AbstractBidirList<G>, Queue<G>, Deque<G> {
                        }
                        position = _list._tail;
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, G> f) {
-                       return Gee.Iterator.stream_impl<G, A>(this, (owned)f);
-               }
        }
 
        private unowned Node<G>? _get_node_at (int index) {
index 67c764a..c865dc6 100644 (file)
@@ -1045,9 +1045,5 @@ public class Gee.PriorityQueue<G> : Gee.AbstractQueue<G> {
                        while (next ())
                                f (position.data);
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, G> f) {
-                       return Gee.Iterator.stream_impl<G, A>(this, (owned)f);
-               }
        }
 }
index c3d53bb..7b5cea6 100644 (file)
@@ -102,7 +102,70 @@ public interface Gee.Traversable<G> : Object {
         * @param f function generating stream
         * @return iterator containing values yielded by stream
         */
-       public abstract Iterator<A> stream<A> (owned StreamFunc<G, A> f);
+       public virtual Iterator<A> stream<A> (owned StreamFunc<G, A> f) {
+               Iterator<G>? self;
+               Iterable<G>? iself;
+               // Yes - I've heard of polimorphism ;) but I don't want users to need to implement the method.
+               if ((self = this as Iterator<G>) != null) { 
+                       Traversable.Stream str;
+                       Lazy<A>? initial = null;
+                       bool need_next = true;
+                       str = f (Stream.YIELD, null, out initial);
+                       switch (str) {
+                       case Stream.CONTINUE:
+                               if (self.valid) {
+                                       str = f (Stream.CONTINUE, new Lazy<G> (() => {return self.get ();}), out initial);
+                                       switch (str) {
+                                       case Stream.YIELD:
+                                       case Stream.CONTINUE:
+                                               break;
+                                       case Stream.END:
+                                               return Iterator.unfold<A> (() => {return null;});
+                                       default:
+                                               assert_not_reached ();
+                                       }
+                               }
+                               break;
+                       case Stream.YIELD:
+                               if (self.valid)
+                                       need_next = false;
+                               break;
+                       case Stream.END:
+                               return Iterator.unfold<A> (() => {return null;});
+                       default:
+                               assert_not_reached ();
+                       }
+                       return Iterator.unfold<A> (() => {
+                               Lazy<A>? val = null;
+                               if (str != Stream.CONTINUE)
+                                       str = f (Traversable.Stream.YIELD, null, out val);
+                               while (str == Stream.CONTINUE) {
+                                       if (need_next) {
+                                               if (!self.next ()) {
+                                                       str = f (Traversable.Stream.END, null, out val);
+                                                       assert (str != Traversable.Stream.CONTINUE);
+                                                       break;
+                                               }
+                                       } else {
+                                               need_next = true;
+                                       }
+                                       str = f (Stream.CONTINUE, new Lazy<G> (() => {return self.get ();}), out val);
+                               }
+                               switch (str) {
+                               case Stream.YIELD:
+                                       return val;
+                               case Stream.END:
+                                       return null;
+                               default:
+                                       assert_not_reached ();
+                               }
+                       }, initial);
+               } else if ((iself = this as Iterable<G>) != null) {
+                       return iself.iterator().stream<A> ((owned) f);
+               } else {
+                       assert_not_reached ();
+               }
+       }
 
        /**
         * Standard aggregation function.
@@ -300,6 +363,12 @@ public interface Gee.Traversable<G> : Object {
                });
        }
 
+       
+       /**
+        * The type of the elements in this collection.
+        */
+       public virtual Type element_type { get { return typeof (G); } }
+
        public enum Stream {
                YIELD,
                CONTINUE,
index a5bda43..ec47a22 100644 (file)
@@ -1650,10 +1650,6 @@ public class Gee.TreeMap<K,V> : Gee.AbstractBidirSortedMap<K,V> {
                        for (; current != null; current = current.next)
                                f (current.key);
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, K> f) {
-                       return Gee.Iterator.stream_impl<K, A>(this, (owned)f);
-               }
        }
 
        private class SubKeyIterator<K,V> : SubNodeIterator<K,V>, Traversable<K>, Gee.Iterator<K>, BidirIterator<K> {
@@ -1680,10 +1676,6 @@ public class Gee.TreeMap<K,V> : Gee.AbstractBidirSortedMap<K,V> {
                        while (iterator.next ())
                                f (iterator.current.key);
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, K> f) {
-                       return Gee.Iterator.stream_impl<K, A>(this, (owned)f);
-               }
        }
 
        private class ValueIterator<K,V> : NodeIterator<K,V>, Traversable<V>, Gee.Iterator<V>, Gee.BidirIterator<V> {
@@ -1722,10 +1714,6 @@ public class Gee.TreeMap<K,V> : Gee.AbstractBidirSortedMap<K,V> {
                        for (; current != null; current = current.next)
                                f (current.key);
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, V> f) {
-                       return Gee.Iterator.stream_impl<V, A>(this, (owned)f);
-               }
        }
 
        private class SubValueIterator<K,V> : SubNodeIterator<K,V>, Traversable<V>, Gee.Iterator<V>, BidirIterator<V> {
@@ -1752,10 +1740,6 @@ public class Gee.TreeMap<K,V> : Gee.AbstractBidirSortedMap<K,V> {
                        while (iterator.next ())
                                f (iterator.current.key);
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, V> f) {
-                       return Gee.Iterator.stream_impl<V, A>(this, (owned)f);
-               }
        }
 
        private class EntryIterator<K,V> : NodeIterator<K,V>, Traversable<Map.Entry<K, V>>, Gee.Iterator<Map.Entry<K,V>>, Gee.BidirIterator<Map.Entry<K,V>> {
@@ -1798,10 +1782,6 @@ public class Gee.TreeMap<K,V> : Gee.AbstractBidirSortedMap<K,V> {
                        for (; current != null; current = current.next)
                                f (Entry.entry_for<K,V> (current));
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<Map.Entry<K, V>, A> f) {
-                       return Gee.Iterator.stream_impl<Map.Entry<K, V>, A>(this, (owned)f);
-               }
        }
 
        private class SubEntryIterator<K,V> : SubNodeIterator<K,V>, Traversable<Map.Entry<K, V>>, Gee.Iterator<Map.Entry<K,V>>, Gee.BidirIterator<Map.Entry<K,V>> {
@@ -1832,10 +1812,6 @@ public class Gee.TreeMap<K,V> : Gee.AbstractBidirSortedMap<K,V> {
                        while (iterator.next ())
                                f (Entry.entry_for<K,V> (iterator.current));
                }
-
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<Map.Entry<K, V>, A> f) {
-                       return Gee.Iterator.stream_impl<Map.Entry<K, V>, A>(this, (owned)f);
-               }
        }
 
        private class MapIterator<K,V> : NodeIterator<K,V>, Gee.MapIterator<K,V>, BidirMapIterator<K,V> {
index 771879e..4b7e06b 100644 (file)
@@ -734,10 +734,6 @@ public class Gee.TreeSet<G> : AbstractBidirSortedSet<G> {
                        }
                }
 
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, G> f) {
-                       return Gee.Iterator.stream_impl<G, A>(this, (owned)f);
-               }
-
                private weak Node<G>? current = null;
                private weak Node<G>? _next = null;
                private weak Node<G>? _prev = null;
@@ -1133,10 +1129,6 @@ public class Gee.TreeSet<G> : AbstractBidirSortedSet<G> {
                                f(get());
                }
 
-               public Gee.Iterator<A> stream<A> (owned StreamFunc<A, G> f) {
-                       return Gee.Iterator.stream_impl<G, A>(this, (owned)f);
-               }
-
                private new TreeSet<G> set;
                private Range<G> range;
                private Iterator<G>? iterator = null;
index 3a4c6c6..8ca4ee8 100644 (file)
@@ -90,10 +90,6 @@ internal class Gee.UnfoldIterator<G> : Object, Traversable<G>, Iterator<G> {
                _end = true;
        }
 
-       public Iterator<A> stream<A> (owned StreamFunc<A, G> f) {
-               return Iterator.stream_impl<G, A>(this, (owned)f);
-       }
-
        private UnfoldFunc<G> _func;
        private Lazy<G>? _current;
        private Lazy<G>? _next;
index 0794369..bf90eaf 100644 (file)
@@ -739,11 +739,6 @@ public abstract class CollectionTests : Gee.TestCase {
                assert (test_collection != null);
                Value value;
 
-               value = Value (typeof (Type));
-               test_collection.get_property ("element-type", ref value);
-               assert (value.get_gtype () == test_collection.element_type);
-               value.unset ();
-
                value = Value (typeof (int));
                test_collection.get_property ("size", ref value);
                assert (value.get_int () == test_collection.size);