Kaynağa Gözat

Add EnumerableInfo structure

Billy Barrow 3 hafta önce
ebeveyn
işleme
6c94f7628d

+ 6 - 2
src/lib/DataStructures/BinaryData.vala

@@ -18,6 +18,10 @@ namespace Invercargill.DataStructures {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer(this, EnumerableCategory.COMPUTED, chunks);
+        }
+
         public override Tracker<uint8> get_tracker () {
             return chunks.select_many<uint8>(s => s).get_tracker();
         }
@@ -55,7 +59,7 @@ namespace Invercargill.DataStructures {
 
         public void append_all(Enumerable<Enumerable<uint8>> data) {
             lock(chunks) {
-                chunks = chunks.concat(data);
+                chunks = chunks.concat(data.to_vector());
             }
         }
 
@@ -67,7 +71,7 @@ namespace Invercargill.DataStructures {
 
         public void prepend_all(Enumerable<Enumerable<uint8>> data) {
             lock(chunks) {
-                chunks = data.concat(chunks);
+                chunks = data.concat(chunks.to_vector());
             }
         }
 

+ 4 - 0
src/lib/DataStructures/Dictionary.vala

@@ -12,6 +12,10 @@ namespace Invercargill.DataStructures {
             return hash_set.peek_count();
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.IN_MEMORY);
+        }
+
         public Dictionary(HashDelegate<TKey>? key_hash_func = null, EqualityDelegate<TKey>? key_equal_func = null) {
             hash_func = key_hash_func ?? Operators.hash<TKey>();
             equal_func = key_equal_func ?? Operators.equality<TKey>();

+ 4 - 0
src/lib/DataStructures/Fifo.vala

@@ -11,6 +11,10 @@ namespace Invercargill.DataStructures {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.EXTERNAL);
+        }
+
         public void unblock() {
             mutex.lock();
             is_blocking = false;

+ 4 - 0
src/lib/DataStructures/HashSet.vala

@@ -106,6 +106,10 @@ namespace Invercargill.DataStructures {
             return n_items;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.IN_MEMORY);
+        }
+
         public override Tracker<T> get_tracker () {
             return range(0, n_items).select<T>(i => read_item(i)).get_tracker();
         }

+ 4 - 0
src/lib/DataStructures/Series.vala

@@ -32,6 +32,10 @@ namespace Invercargill.DataStructures {
             return n_items;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.IN_MEMORY);
+        }
+
         public override Tracker<T> get_tracker() {
             return new SeriesTracker<T>(root);
         }

+ 4 - 0
src/lib/DataStructures/Vector.vala

@@ -19,6 +19,10 @@ namespace Invercargill.DataStructures {
             return n_items;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.IN_MEMORY);
+        }
+
         public override Tracker<T> get_tracker() {
             return new AddressableTracker<T>(this);
         }

+ 1 - 0
src/lib/Enumerable.vala

@@ -8,6 +8,7 @@ namespace Invercargill {
 
         public abstract Tracker<T> get_tracker();
         public abstract int? peek_count();
+        public abstract EnumerableInfo get_info();
 
         // Returns false if iteration was interrupted
         // Returns true if iteration reached natural end

+ 62 - 0
src/lib/EnumerableInfo.vala

@@ -0,0 +1,62 @@
+
+namespace Invercargill {
+
+    public class EnumerableInfo {
+
+        public int? count { get; private set; }
+        public Type enumerable_type { get; private set; }
+        public Type element_type { get; private set; }
+        public EnumerableCategory category { get; private set; }
+        public Enumerable<EnumerableInfo> sources { get; private set; }
+        public Enumerable<EnumerableInfo> ultimate_sources { get; private set; }
+
+        public EnumerableInfo(int? count, Type enumerable_type, Type value_type, EnumerableCategory category, ReadOnlyCollection<EnumerableInfo> sources, Enumerable<EnumerableInfo> ultimate_sources) {
+            this.count = count;
+            this.enumerable_type = enumerable_type;
+            this.element_type = value_type;
+            this.category = category;
+            this.sources = sources;
+            this.ultimate_sources = ultimate_sources.cache();
+        }
+
+        public EnumerableInfo.infer(Enumerable enumerable, EnumerableCategory category, Enumerable<Enumerable> sources) {
+            this.count = enumerable.peek_count();
+            this.enumerable_type = enumerable.get_type();
+            this.element_type = enumerable.element_type;
+            this.category = category;
+            this.sources = sources.select<EnumerableInfo>(s => s.get_info()).to_series().seal();
+            this.ultimate_sources = this.sources
+                .where(s => s.ultimate_sources.no())
+                .concat(this.sources.select_many(s => s.ultimate_sources));
+        }
+
+        public EnumerableInfo.infer_single(Enumerable enumerable, EnumerableCategory category, Enumerable source) {
+            this.count = enumerable.peek_count();
+            this.enumerable_type = enumerable.get_type();
+            this.element_type = enumerable.element_type;
+            this.category = category;
+            var source_info = source.get_info();
+            this.sources = single(source_info);
+            this.ultimate_sources = source_info.sources.any() ? source_info.ultimate_sources : single(source_info);
+        }
+
+        public EnumerableInfo.infer_ultimate(Enumerable enumerable, EnumerableCategory category) {
+            this.count = enumerable.peek_count();
+            this.enumerable_type = enumerable.get_type();
+            this.element_type = enumerable.element_type;
+            this.category = category;
+            this.sources = empty<EnumerableInfo>();
+            this.ultimate_sources = this.sources;
+        }
+
+    }
+
+    public enum EnumerableCategory {
+        IN_MEMORY,
+        EXTERNAL,
+        COMPUTED,
+        CACHED,
+        PROXY;
+    }
+
+}

+ 4 - 0
src/lib/EnumerableProxy.vala

@@ -7,6 +7,10 @@ namespace Invercargill {
 
         protected Enumerable<T> inner { get; set; }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.PROXY, inner);
+        }
+
         public override int? peek_count() {
             return inner.peek_count();
         }

+ 4 - 0
src/lib/Generators/Directory.vala

@@ -13,6 +13,10 @@ namespace Invercargill.Generators {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.EXTERNAL);
+        }
+
         public override Tracker<string> get_tracker() {
             return new AdvanceTracker<string>((out obj) => {
                 var name = dir.read_name();

+ 4 - 0
src/lib/Generators/Empty.vala

@@ -7,6 +7,10 @@ namespace Invercargill.Generators {
             return 0;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.IN_MEMORY);
+        }
+
         public override Tracker<T> get_tracker() {
             return new LambdaTracker<T>(
                 () => {

+ 4 - 0
src/lib/Generators/Function.vala

@@ -8,6 +8,10 @@ namespace Invercargill.Generators {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.COMPUTED);
+        }
+
         private GeneratorDelegate<T> func;
         private bool completed = false;
         private GeneratorResult<T>? next_result = null;

+ 4 - 0
src/lib/Generators/Range.vala

@@ -17,6 +17,10 @@ namespace Invercargill.Generators {
             return (stop - start) / stride;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.COMPUTED);
+        }
+
         public override Tracker<int> get_tracker() {
             var i = start;
 

+ 4 - 0
src/lib/Modifiers/Cache.vala

@@ -17,6 +17,10 @@ namespace Invercargill.Modifiers {
             return inner.peek_count();
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.CACHED, inner);
+        }
+
         public override Tracker<T> get_tracker () {
             var i = 0;
             return new AssertingLambdaTracker<T>(() => has_nth(i), () => vector[i++]);

+ 4 - 0
src/lib/Modifiers/Concat.vala

@@ -19,6 +19,10 @@ namespace Invercargill.Modifiers {
             return c1 + c2;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer(this, EnumerableCategory.COMPUTED, Convert.ate(new Enumerable[] {e1, e2}));
+        }
+
         public override Tracker<T> get_tracker() {
             var tracker1 = e1.get_tracker();
             var tracker2 = e2.get_tracker();

+ 4 - 0
src/lib/Modifiers/Filter.vala

@@ -13,6 +13,10 @@ namespace Invercargill.Modifiers {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }        
+
         public override Tracker<T> get_tracker() {
             var tracker = input.get_tracker();
 

+ 4 - 0
src/lib/Modifiers/FilterTransform.vala

@@ -13,6 +13,10 @@ namespace Invercargill.Modifiers {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<Tout> get_tracker() {
             var tracker = input.get_tracker();
 

+ 4 - 0
src/lib/Modifiers/From.vala

@@ -13,6 +13,10 @@ namespace Invercargill.Modifiers {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<T> get_tracker() {
             var tracker = input.get_tracker();
             var condition_met = false;

+ 4 - 0
src/lib/Modifiers/Interleave.vala

@@ -18,6 +18,10 @@ namespace Invercargill.Modifiers {
             return c1 + c2;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer(this, EnumerableCategory.COMPUTED, Convert.ate(new Enumerable[] {e1, e2}));
+        }
+
         public override Tracker<T> get_tracker() {
             var t1 = e1.get_tracker();
             var t2 = e2.get_tracker();

+ 4 - 0
src/lib/Modifiers/Merge.vala

@@ -14,6 +14,10 @@ namespace Invercargill.Modifiers {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<T> get_tracker() {
             var outer_tracker = input.get_tracker();
             Tracker<T> inner_tracker = null;

+ 4 - 0
src/lib/Modifiers/Parallel.vala

@@ -16,6 +16,10 @@ namespace Invercargill.Modifiers {
             return input.peek_count();
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<Tout> get_tracker() {
             return new ParallelTracker<Tin, Tout>(i => transform_func(i), workers, input.get_tracker());
         }

+ 4 - 0
src/lib/Modifiers/Position.vala

@@ -11,6 +11,10 @@ namespace Invercargill.Modifiers {
             return input.peek_count();
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<PositionItemPair<T>> get_tracker() {
             return new PositionTracker<T>(input);
         }

+ 4 - 0
src/lib/Modifiers/Skip.vala

@@ -17,6 +17,10 @@ namespace Invercargill.Modifiers {
             return int.min(0, c - n_items);
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override bool iterate_if (Invercargill.PredicateDelegate<T> handler) {
             var c = 0;
             return input.iterate_if(i => {

+ 4 - 0
src/lib/Modifiers/Sort.vala

@@ -13,6 +13,10 @@ namespace Invercargill.Modifiers {
             return input.peek_count();
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<T> get_tracker() {
             // Hack for now
             var list = input.to_gee_collection();

+ 4 - 0
src/lib/Modifiers/Take.vala

@@ -16,6 +16,10 @@ namespace Invercargill.Modifiers {
             return int.min(0, c - n_items);
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<T> get_tracker() {
             var tracker = input.get_tracker();
             var c = 0;

+ 4 - 0
src/lib/Modifiers/Transform.vala

@@ -13,6 +13,10 @@ namespace Invercargill.Modifiers {
             return input.peek_count();
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<Tout> get_tracker() {
             var tracker = input.get_tracker();
             return new LambdaTracker<Tout>(

+ 4 - 0
src/lib/Modifiers/Unique.vala

@@ -16,6 +16,10 @@ namespace Invercargill.Modifiers {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<T> get_tracker() {
             var tracker = input.get_tracker();
             var previous = new Vector<T>();

+ 4 - 0
src/lib/Modifiers/Until.vala

@@ -13,6 +13,10 @@ namespace Invercargill.Modifiers {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
+        }
+
         public override Tracker<T> get_tracker() {
             var tracker = input.get_tracker();
             var condition_met = false;

+ 4 - 0
src/lib/Modifiers/Zip.vala

@@ -20,6 +20,10 @@ namespace Invercargill.Modifiers {
             return int.max(c1, c2);
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer(this, EnumerableCategory.COMPUTED, Convert.ate(new Enumerable[] {e1, e2}));
+        }
+
         public override Tracker<TOut> get_tracker() {
             var tracker1 = e1.get_tracker();
             var tracker2 = e2.get_tracker();

+ 4 - 0
src/lib/Wrappers/Array.vala

@@ -16,6 +16,10 @@ namespace Invercargill.Wrappers {
             return array.length;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.IN_MEMORY);
+        }
+
         public override Tracker<T> get_tracker() {
             var i = 0;
             return new LambdaTracker<T>(

+ 4 - 0
src/lib/Wrappers/GeeIterable.vala

@@ -15,6 +15,10 @@ namespace Invercargill.Wrappers {
             return null;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.COMPUTED);
+        }
+
         
         public override Tracker<T> get_tracker() {
             var iterator = iterable.iterator();

+ 4 - 0
src/lib/Wrappers/GenericArray.vala

@@ -13,6 +13,10 @@ namespace Invercargill.Wrappers {
             return array.length;
         }
 
+        public override EnumerableInfo get_info() {
+            return new EnumerableInfo.infer_ultimate (this, EnumerableCategory.IN_MEMORY);
+        }
+
         public override Tracker<T> get_tracker() {
             var i = 0;
             return new LambdaTracker<T>(

+ 1 - 0
src/lib/meson.build

@@ -23,6 +23,7 @@ sources += files('KeyValuePair.vala')
 sources += files('Attempt.vala')
 sources += files('Cache.vala')
 sources += files('EnumerableProxy.vala')
+sources += files('EnumerableInfo.vala')
 sources += files('StickyPromotion.vala')
 sources += files('Element.vala')