changeset 5979:250842824019 it2-bootstrap

More enforcement of input/output shape matchup; correctly specify input/output shapes for more ops; rework MapIterator implementations to avoid boxing
author briangoetz
date Wed, 05 Sep 2012 17:57:29 -0400
parents 9a3dcf47cde2
children 8560f7cfc053
files src/share/classes/java/util/Mapping.java src/share/classes/java/util/streams/AbstractPipeline.java src/share/classes/java/util/streams/LinearPipeline.java src/share/classes/java/util/streams/MapPipeline.java src/share/classes/java/util/streams/ops/BiAllMatchOp.java src/share/classes/java/util/streams/ops/BiAnyMatchOp.java src/share/classes/java/util/streams/ops/BiMapOp.java src/share/classes/java/util/streams/ops/BiTeeOp.java src/share/classes/java/util/streams/ops/ForEachOp.java src/share/classes/java/util/streams/ops/MapExtractKeysOp.java src/share/classes/java/util/streams/ops/MapExtractValuesOp.java src/share/classes/java/util/streams/ops/MapFilterKeysOp.java src/share/classes/java/util/streams/ops/MapFilterValuesOp.java src/share/classes/java/util/streams/ops/MapMapValuesOp.java src/share/classes/java/util/streams/ops/MapSortedOp.java src/share/classes/java/util/streams/ops/MapSwapOp.java src/share/classes/java/util/streams/ops/MappedOp.java src/share/classes/java/util/streams/ops/SeedlessFoldOp.java src/share/classes/java/util/streams/ops/TerminalOp.java
diffstat 19 files changed, 211 insertions(+), 78 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/java/util/Mapping.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/Mapping.java	Wed Sep 05 17:57:29 2012 -0400
@@ -94,4 +94,24 @@
             return Objects.hashCode(getKey()) ^ Objects.hashCode(getValue());
         }
     }
+
+    public static class MappingValue<K, V> extends AbstractMapping<K, V> {
+        private final K k;
+        private final V v;
+
+        public MappingValue(K k, V v) {
+            this.k = k;
+            this.v = v;
+        }
+
+        @Override
+        public K getKey() {
+            return k;
+        }
+
+        @Override
+        public V getValue() {
+            return v;
+        }
+    }
 }
--- a/src/share/classes/java/util/streams/AbstractPipeline.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/AbstractPipeline.java	Wed Sep 05 17:57:29 2012 -0400
@@ -221,4 +221,9 @@
     public Stream.Shape getInputShape() {
         return source.getShape();
     }
+
+    public<V> V pipeline(TerminalOp<U, V> terminal) {
+        assert getShape() == terminal.inputShape();
+        return evaluate(terminal);
+    }
 }
--- a/src/share/classes/java/util/streams/LinearPipeline.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/LinearPipeline.java	Wed Sep 05 17:57:29 2012 -0400
@@ -55,10 +55,6 @@
         return new LinearPipeline<>(this, op);
     }
 
-    public<V> V pipeline(TerminalOp<U, V> op) {
-        return evaluate(op);
-    }
-
     @Override
     public Stream<U> filter(Predicate<? super U> predicate) {
         return chainLinear(new FilterOp<>(predicate));
--- a/src/share/classes/java/util/streams/MapPipeline.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/MapPipeline.java	Wed Sep 05 17:57:29 2012 -0400
@@ -83,10 +83,6 @@
         return chainMap(new BiTeeOp<>(block));
     }
 
-    public<U> U pipeline(TerminalOp<Mapping<K,V>, U> op) {
-        return evaluate(op);
-    }
-
     @Override
     public Stream<K> keys() {
         return chainLinear(new MapExtractKeysOp<K,V>());
--- a/src/share/classes/java/util/streams/ops/BiAllMatchOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/BiAllMatchOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -29,6 +29,7 @@
 import java.util.Mapping;
 import java.util.Objects;
 import java.util.functions.BiPredicate;
+import java.util.streams.Stream;
 
 /**
  * BiAllMatchOp
@@ -50,6 +51,11 @@
         return allMatch(new MapIterator.IteratorAdapter<>(iterator), predicate);
     }
 
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
     public static <K,V> boolean allMatch(MapIterator<K,V> iterator, BiPredicate<? super K, ? super V> predicate) {
         while (iterator.hasNext()) {
             if(!predicate.test(iterator.nextKey(), iterator.curValue())) {
--- a/src/share/classes/java/util/streams/ops/BiAnyMatchOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/BiAnyMatchOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -29,6 +29,7 @@
 import java.util.Mapping;
 import java.util.Objects;
 import java.util.functions.BiPredicate;
+import java.util.streams.Stream;
 
 /**
  * BiAnyMatchOp
@@ -50,6 +51,11 @@
         return anyMatch(new MapIterator.IteratorAdapter<>(iterator), predicate);
     }
 
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
     public static <K,V> boolean anyMatch(MapIterator<K,V> iterator, BiPredicate<? super K, ? super V> predicate) {
         while (iterator.hasNext()) {
             if(predicate.test(iterator.nextKey(), iterator.curValue())) {
--- a/src/share/classes/java/util/streams/ops/BiMapOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/BiMapOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -56,11 +56,7 @@
     }
 
     @Override
-    public Iterator<Mapping<K, U>> iterator(final Iterator<Mapping<K,V>> source) {
-        return iterator(source, mapper);
-    }
-
-    public MapIterator<K, U> iterator(final MapIterator<K,V> source) {
+    public MapIterator<K,U> iterator(final Iterator<Mapping<K,V>> source) {
         return iterator(source, mapper);
     }
 
@@ -78,51 +74,54 @@
                                                          final BiMapper<? super K, ? super V, ? extends VV> mapper) {
         Objects.requireNonNull(source);
         Objects.requireNonNull(mapper);
+        final MapIterator<K,V> asMI = (MapIterator<K, V>) source;
         return new MapIterator<K, VV>() {
             Mapping<K, VV> current;
 
             @Override
             public boolean hasNext() {
-                return source.hasNext();
+                return asMI.hasNext();
             }
 
             @Override
             public Mapping<K, VV> next() {
-                final Mapping<K, V> next = source.next();
-                current = new Mapping.AbstractMapping<K,VV>() {
-                    @Override
-                    public K getKey() {
-                        return next.getKey();
-                    }
-
-                    @Override
-                    public VV getValue() {
-                        return mapper.map(next.getKey(), next.getValue());
-                    }
-                };
-
+                K k = asMI.nextKey();
+                V v = asMI.curValue();
+                current = new Mapping.MappingValue<>(k, mapper.map(k, v));
                 return current;
             }
 
             @Override
             public K nextKey() {
-                return next().getKey();
+                return asMI.nextKey();
             }
 
             @Override
             public VV nextValue() {
-                return next().getValue();
+                K k = asMI.nextKey();
+                V v = asMI.curValue();
+                return mapper.map(k, v);
             }
 
             @Override
             public K curKey() {
-                return current.getKey();
+                return asMI.curKey();
             }
 
             @Override
             public VV curValue() {
-                return current.getValue();
+                return mapper.map(asMI.curKey(), asMI.curValue());
             }
         };
     }
+
+    @Override
+    public Stream.Shape outputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
 }
--- a/src/share/classes/java/util/streams/ops/BiTeeOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/BiTeeOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -56,11 +56,7 @@
     }
 
     @Override
-    public Iterator<Mapping<K, V>> iterator(final Iterator<Mapping<K,V>> source) {
-        return iterator(source, tee);
-    }
-
-    public MapIterator<K, V> iterator(final MapIterator<K,V> source) {
+    public MapIterator<K, V> iterator(final Iterator<Mapping<K,V>> source) {
         return iterator(source, tee);
     }
 
@@ -79,42 +75,55 @@
                                                     final BiBlock<? super K, ? super V> tee) {
         Objects.requireNonNull(source);
         Objects.requireNonNull(tee);
+        final MapIterator<K, V> asMI = (MapIterator<K, V>) source;
         return new MapIterator<K, V>() {
-            Mapping<K, V> current;
-
             @Override
             public boolean hasNext() {
-                return source.hasNext();
+                return asMI.hasNext();
             }
 
             @Override
             public Mapping<K, V> next() {
-                current = source.next();
-
+                Mapping<K, V> current = source.next();
                 tee.apply(current.getKey(), current.getValue());
-
                 return current;
             }
 
             @Override
             public K nextKey() {
-                return next().getKey();
+                K k = asMI.nextKey();
+                V v = asMI.curValue();
+                tee.apply(k, v);
+                return k;
             }
 
             @Override
             public V nextValue() {
-                return next().getValue();
+                K k = asMI.nextKey();
+                V v = asMI.curValue();
+                tee.apply(k, v);
+                return v;
             }
 
             @Override
             public K curKey() {
-                return current.getKey();
+                return asMI.curKey();
             }
 
             @Override
             public V curValue() {
-                return current.getValue();
+                return asMI.curValue();
             }
         };
     }
+
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
+    @Override
+    public Stream.Shape outputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
 }
--- a/src/share/classes/java/util/streams/ops/ForEachOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/ForEachOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -31,6 +31,7 @@
 import java.util.functions.BiBlock;
 import java.util.functions.Block;
 import java.util.streams.Sink;
+import java.util.streams.Stream;
 import java.util.streams.TerminalSink;
 
 /**
@@ -40,8 +41,10 @@
  */
 public class ForEachOp<T> implements TerminalOp<T,Void> {
     private final TerminalSink<T,Void> sink;
+    private final Stream.Shape shape;
 
-    protected ForEachOp(TerminalSink<T, Void> sink) {
+    protected ForEachOp(TerminalSink<T, Void> sink, Stream.Shape shape) {
+        this.shape = shape;
         this.sink = Objects.requireNonNull(sink);
     }
 
@@ -56,7 +59,7 @@
             public Void getAndClearState() {
                 return null;
             }
-        });
+        }, Stream.Shape.LINEAR);
     }
 
     public static<K,V> ForEachOp<Mapping<K,V>> make(final BiBlock<? super K, ? super V> block) {
@@ -76,7 +79,7 @@
             public Void getAndClearState() {
                 return null;
             }
-        });
+        }, Stream.Shape.KEY_VALUE);
     }
 
     @Override
@@ -85,6 +88,11 @@
     }
 
     @Override
+    public Stream.Shape inputShape() {
+        return shape;
+    }
+
+    @Override
     public <V> Void computeParallel(ParallelOpHelper<T, V> helper) {
         int depth = helper.suggestDepth();
         Sink<V, ?, ?> compoundSink = helper.sink(sink);
--- a/src/share/classes/java/util/streams/ops/MapExtractKeysOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/MapExtractKeysOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -66,4 +66,9 @@
             }
         };
     }
+
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
 }
--- a/src/share/classes/java/util/streams/ops/MapExtractValuesOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/MapExtractValuesOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -66,4 +66,9 @@
             }
         };
     }
+
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
 }
--- a/src/share/classes/java/util/streams/ops/MapFilterKeysOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/MapFilterKeysOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -25,6 +25,7 @@
 package java.util.streams.ops;
 
 import java.util.Iterator;
+import java.util.MapIterator;
 import java.util.Mapping;
 import java.util.Objects;
 import java.util.functions.Predicate;
@@ -49,7 +50,7 @@
     }
 
     @Override
-    public Iterator<Mapping<K, V>> iterator(Iterator<Mapping<K, V>> in) {
+    public MapIterator<K,V> iterator(Iterator<Mapping<K, V>> in) {
         throw new UnsupportedOperationException("nyi");
     }
 
@@ -64,4 +65,14 @@
             }
         };
     }
+
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
+    @Override
+    public Stream.Shape outputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
 }
--- a/src/share/classes/java/util/streams/ops/MapFilterValuesOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/MapFilterValuesOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -25,6 +25,7 @@
 package java.util.streams.ops;
 
 import java.util.Iterator;
+import java.util.MapIterator;
 import java.util.Mapping;
 import java.util.Objects;
 import java.util.functions.Predicate;
@@ -49,7 +50,7 @@
     }
 
     @Override
-    public Iterator<Mapping<K, V>> iterator(Iterator<Mapping<K, V>> in) {
+    public MapIterator<K,V> iterator(Iterator<Mapping<K, V>> in) {
         throw new UnsupportedOperationException("nyi");
     }
 
@@ -64,4 +65,14 @@
             }
         };
     }
+
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
+    @Override
+    public Stream.Shape outputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
 }
--- a/src/share/classes/java/util/streams/ops/MapMapValuesOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/MapMapValuesOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -25,6 +25,7 @@
 package java.util.streams.ops;
 
 import java.util.Iterator;
+import java.util.MapIterator;
 import java.util.Mapping;
 import java.util.Objects;
 import java.util.functions.Mapper;
@@ -53,7 +54,7 @@
     }
 
     @Override
-    public Iterator<Mapping<K, U>> iterator(Iterator<Mapping<K, V>> in) {
+    public MapIterator<K, U> iterator(Iterator<Mapping<K, V>> in) {
         throw new UnsupportedOperationException("nyi");
     }
 
@@ -66,4 +67,15 @@
             }
         };
     }
+
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
+    @Override
+    public Stream.Shape outputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
 }
--- a/src/share/classes/java/util/streams/ops/MapSortedOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/MapSortedOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -110,4 +110,14 @@
         }
         return new MapIterator.IteratorAdapter<>(pq.iterator());
     }
+
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
+    @Override
+    public Stream.Shape outputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
 }
--- a/src/share/classes/java/util/streams/ops/MapSwapOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/MapSwapOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -25,6 +25,7 @@
 package java.util.streams.ops;
 
 import java.util.Iterator;
+import java.util.MapIterator;
 import java.util.Mapping;
 import java.util.streams.Sink;
 import java.util.streams.Stream;
@@ -51,27 +52,39 @@
     }
 
     @Override
-    public Iterator<Mapping<V, K>> iterator(final Iterator<Mapping<K, V>> in) {
-        return new Iterator<Mapping<V, K>>() {
+    public MapIterator<V, K> iterator(final Iterator<Mapping<K, V>> in) {
+        final MapIterator<K,V> asMI = (MapIterator<K, V>) in;
+        return new MapIterator<V, K>() {
             @Override
             public boolean hasNext() {
-                return in.hasNext();
+                return asMI.hasNext();
+            }
+
+            @Override
+            public V nextKey() {
+                return asMI.nextValue();
+            }
+
+            @Override
+            public K nextValue() {
+                return asMI.nextKey();
+            }
+
+            @Override
+            public V curKey() {
+                return asMI.curValue();
+            }
+
+            @Override
+            public K curValue() {
+                return asMI.curKey();
             }
 
             @Override
             public Mapping<V, K> next() {
-                final Mapping<K, V> swap = in.next();
-                return new Mapping.AbstractMapping<V, K>() {
-                    @Override
-                    public V getKey() {
-                        return swap.getValue();
-                    }
-
-                    @Override
-                    public K getValue() {
-                        return swap.getKey();
-                    }
-                };
+                K k = asMI.nextKey();
+                V v = asMI.curValue();
+                return new Mapping.MappingValue<>(v, k);
             }
         };
     }
@@ -85,4 +98,14 @@
             }
         };
     }
+
+    @Override
+    public Stream.Shape inputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
+
+    @Override
+    public Stream.Shape outputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
 }
--- a/src/share/classes/java/util/streams/ops/MappedOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/MappedOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -97,17 +97,7 @@
             @Override
             public Mapping<T, R> next() {
                 advance();
-                return new Mapping.AbstractMapping<T,R>() {
-                    @Override
-                    public T getKey() {
-                        return currentKey;
-                    }
-
-                    @Override
-                    public R getValue() {
-                        return currentValue;
-                    }
-                };
+                return new Mapping.MappingValue<>(currentKey, currentValue);
             }
         };
     }
@@ -121,4 +111,9 @@
             }
         };
     }
+
+    @Override
+    public Stream.Shape outputShape() {
+        return Stream.Shape.KEY_VALUE;
+    }
 }
--- a/src/share/classes/java/util/streams/ops/SeedlessFoldOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/SeedlessFoldOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -24,6 +24,7 @@
  */
 package java.util.streams.ops;
 
+import java.util.Iterator;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.functions.BinaryOperator;
@@ -57,6 +58,18 @@
     }
 
     @Override
+    public Optional<T> evaluate(Iterator<T> iterator) {
+        if (!iterator.hasNext())
+            return Optional.empty();
+        else {
+            T result = iterator.next();
+            while (iterator.hasNext())
+                result = operator.combine(result, iterator.next());
+            return new Optional<>(result);
+        }
+    }
+
+    @Override
     public TerminalSink<T, Optional<T>> sink() {
         return new TerminalSink<T, Optional<T>>() {
             private boolean first = true;
--- a/src/share/classes/java/util/streams/ops/TerminalOp.java	Wed Sep 05 14:23:46 2012 -0700
+++ b/src/share/classes/java/util/streams/ops/TerminalOp.java	Wed Sep 05 17:57:29 2012 -0400
@@ -25,6 +25,7 @@
 package java.util.streams.ops;
 
 import java.util.Iterator;
+import java.util.streams.Stream;
 import java.util.streams.TerminalSink;
 
 /**
@@ -60,4 +61,6 @@
         helper.spliterator().into(helper.sink(toArraySink));
         return toArraySink.getAndClearState();
     }
+
+    Stream.Shape inputShape() default { return Stream.Shape.LINEAR; }
 }