Bladeren bron

CQSpliterator: just implementation

Ranides Atterwim 4 jaren geleden
bovenliggende
commit
beb6f5b3fc

+ 19 - 6
assira.core/src/main/java/net/ranides/assira/collection/query/base/CQSpliterator.java

@@ -2,17 +2,19 @@ package net.ranides.assira.collection.query.base;
 
 import net.ranides.assira.collection.query.CQuery;
 import net.ranides.assira.collection.query.CQueryAbstract;
-import net.ranides.assira.collection.query.support.BaseSpliterator;
 import net.ranides.assira.collection.query.support.BaseStream;
 import net.ranides.assira.functional.Consumers;
 import net.ranides.assira.functional.Predicates;
+import net.ranides.assira.math.MutableNumber.MutableInt;
 
 import java.util.Iterator;
 import java.util.Spliterator;
+import java.util.Spliterators;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
 import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
 public abstract class CQSpliterator<T> extends CQueryAbstract<T> {
 
@@ -63,22 +65,25 @@ public abstract class CQSpliterator<T> extends CQueryAbstract<T> {
 
     @Override
     public Iterator<T> iterator() {
-        return BaseSpliterator.iterator(this);
+        return Spliterators.iterator(spliterator());
     }
 
     @Override
     public Stream<T> stream() {
-        return BaseSpliterator.stream(this);
+        return StreamSupport.stream(spliterator(), false);
     }
 
     @Override
     public void forEach(Consumer<? super T> consumer) {
-        BaseSpliterator.forEach(this, consumer);
+        spliterator().forEachRemaining(consumer);
     }
 
     @Override
     public void forEach(Consumers.EachConsumer<? super T> consumer) {
-        BaseSpliterator.forEach(this, consumer);
+        MutableInt index = new MutableInt(0);
+        spliterator().forEachRemaining(v -> {
+            consumer.accept(index.getAndIncrement(), v);
+        });
     }
 
     @Override
@@ -93,7 +98,15 @@ public abstract class CQSpliterator<T> extends CQueryAbstract<T> {
 
     @Override
     public int size() {
-        return BaseSpliterator.size(this);
+        Spliterator<T> spr = spliterator();
+
+        if(spr.hasCharacteristics(Spliterator.SIZED)) {
+            return (int)spr.estimateSize();
+        }
+
+        MutableInt size = new MutableInt(0);
+        spliterator().forEachRemaining(v -> size.increment());
+        return size.intValue();
     }
 }
 

+ 0 - 53
assira.core/src/main/java/net/ranides/assira/collection/query/support/BaseSpliterator.java

@@ -1,53 +0,0 @@
-package net.ranides.assira.collection.query.support;
-
-import lombok.experimental.UtilityClass;
-
-import net.ranides.assira.collection.query.CQuery;
-import net.ranides.assira.functional.Consumers;
-
-import java.util.Iterator;
-import java.util.Spliterator;
-import java.util.Spliterators;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Consumer;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
-
-@UtilityClass
-public class BaseSpliterator {
-
-    public static <T> Iterator<T> iterator(CQuery<T> that) {
-        return Spliterators.iterator(that.spliterator());
-    }
-
-    public static <T> Stream<T> stream(CQuery<T> that) {
-        return StreamSupport.stream(that.spliterator(), false);
-    }
-
-    public static <T> void forEach(CQuery<T> that, Consumer<? super T> consumer) {
-        that.spliterator().forEachRemaining(consumer);
-    }
-
-    public static <T> void forEach(CQuery<T> that, Consumers.EachConsumer<? super T> consumer) {
-        AtomicInteger index = new AtomicInteger(0);
-        that.spliterator().forEachRemaining(v -> {
-            consumer.accept(index.getAndIncrement(), v);
-        });
-    }
-
-    public static <T> int size(CQuery<T> that) {
-        Spliterator<T> spr = that.spliterator();
-
-        if(spr.hasCharacteristics(Spliterator.SIZED)) {
-            return (int)spr.estimateSize();
-        }
-
-        int size = 0;
-        while (spr.tryAdvance(v -> {})) {
-            size++;
-        }
-        return size;
-    }
-
-}

+ 45 - 0
assira.core/src/main/java/net/ranides/assira/math/MutableNumber.java

@@ -90,6 +90,21 @@ public abstract class MutableNumber extends Number {
             this.value--;
         }
 
+        public int getAndIncrement() {
+            return this.value++;
+        }
+
+        public int incrementAndGet() {
+            return ++this.value;
+        }
+
+        public int getAndDecrement() {
+            return this.value--;
+        }
+
+        public int decrementAndGet() {
+            return --this.value;
+        }
 
         @Override
         public void add(Number value) {
@@ -182,6 +197,21 @@ public abstract class MutableNumber extends Number {
             this.value--;
         }
 
+        public long getAndIncrement() {
+            return this.value++;
+        }
+
+        public long incrementAndGet() {
+            return ++this.value;
+        }
+
+        public long getAndDecrement() {
+            return this.value--;
+        }
+
+        public long decrementAndGet() {
+            return --this.value;
+        }
 
         @Override
         public void add(Number value) {
@@ -274,6 +304,21 @@ public abstract class MutableNumber extends Number {
             this.value--;
         }
 
+        public double getAndIncrement() {
+            return this.value++;
+        }
+
+        public double incrementAndGet() {
+            return ++this.value;
+        }
+
+        public double getAndDecrement() {
+            return this.value--;
+        }
+
+        public double decrementAndGet() {
+            return --this.value;
+        }
 
         @Override
         public void add(Number value) {