Optimize integer progression iterators

With the help of ProgressionUtil hasNext and next* consist now of only several
bytecode instructions
This commit is contained in:
Alexander Udalov
2013-06-20 19:50:17 +04:00
parent d85ca47184
commit 980e409768
5 changed files with 68 additions and 26 deletions
+14 -4
View File
@@ -16,26 +16,36 @@
package jet;
import jet.runtime.ProgressionUtil;
class ByteProgressionIterator extends ByteIterator {
private int next;
private final byte end;
private final int increment;
private final byte finalElement;
private boolean hasNext;
public ByteProgressionIterator(byte start, byte end, int increment) {
this.next = start;
this.end = end;
this.increment = increment;
this.finalElement = (byte) ProgressionUtil.getProgressionFinalElement(start, end, increment);
this.hasNext = increment < 0 ? start > end : start < end;
}
@Override
public boolean hasNext() {
return increment > 0 ? next <= end : next >= end;
return hasNext;
}
@Override
public byte nextByte() {
int value = next;
next += increment;
if (value == finalElement) {
hasNext = false;
}
else {
next += increment;
}
return (byte) value;
}
}
+14 -4
View File
@@ -16,26 +16,36 @@
package jet;
import jet.runtime.ProgressionUtil;
class CharProgressionIterator extends CharIterator {
private int next;
private final char end;
private final int increment;
private final char finalElement;
private boolean hasNext;
public CharProgressionIterator(char start, char end, int increment) {
this.next = start;
this.end = end;
this.increment = increment;
this.finalElement = (char) ProgressionUtil.getProgressionFinalElement(start, end, increment);
this.hasNext = increment < 0 ? start > end : start < end;
}
@Override
public boolean hasNext() {
return increment > 0 ? next <= end : next >= end;
return hasNext;
}
@Override
public char nextChar() {
int value = next;
next += increment;
if (value == finalElement) {
hasNext = false;
}
else {
next += increment;
}
return (char) value;
}
}
+13 -7
View File
@@ -16,29 +16,35 @@
package jet;
import jet.runtime.ProgressionUtil;
class IntProgressionIterator extends IntIterator {
private int next;
private final int end;
private final int increment;
private boolean overflowHappened = false;
private final int finalElement;
private boolean hasNext;
public IntProgressionIterator(int start, int end, int increment) {
this.next = start;
this.end = end;
this.increment = increment;
this.finalElement = ProgressionUtil.getProgressionFinalElement(start, end, increment);
this.hasNext = increment < 0 ? start > end : start < end;
}
@Override
public boolean hasNext() {
return !overflowHappened && (increment > 0 ? next <= end : next >= end);
return hasNext;
}
@Override
public int nextInt() {
int value = next;
next += increment;
if ((increment > 0) != (next > value)) {
overflowHappened = true;
if (value == finalElement) {
hasNext = false;
}
else {
next += increment;
}
return value;
}
+13 -7
View File
@@ -16,29 +16,35 @@
package jet;
import jet.runtime.ProgressionUtil;
class LongProgressionIterator extends LongIterator {
private long next;
private final long end;
private final long increment;
private boolean overflowHappened = false;
private final long finalElement;
private boolean hasNext;
public LongProgressionIterator(long start, long end, long increment) {
this.next = start;
this.end = end;
this.increment = increment;
this.finalElement = ProgressionUtil.getProgressionFinalElement(start, end, increment);
this.hasNext = increment < 0 ? start > end : start < end;
}
@Override
public boolean hasNext() {
return !overflowHappened && (increment > 0 ? next <= end : next >= end);
return hasNext;
}
@Override
public long nextLong() {
long value = next;
next += increment;
if ((increment > 0) != (next > value)) {
overflowHappened = true;
if (value == finalElement) {
hasNext = false;
}
else {
next += increment;
}
return value;
}
+14 -4
View File
@@ -16,26 +16,36 @@
package jet;
import jet.runtime.ProgressionUtil;
class ShortProgressionIterator extends ShortIterator {
private int next;
private final short end;
private final int increment;
private final short finalElement;
private boolean hasNext;
public ShortProgressionIterator(short start, short end, int increment) {
this.next = start;
this.end = end;
this.increment = increment;
this.finalElement = (short) ProgressionUtil.getProgressionFinalElement(start, end, increment);
this.hasNext = increment < 0 ? start > end : start < end;
}
@Override
public boolean hasNext() {
return increment > 0 ? next <= end : next >= end;
return hasNext;
}
@Override
public short nextShort() {
int value = next;
next += increment;
if (value == finalElement) {
hasNext = false;
}
else {
next += increment;
}
return (short) value;
}
}