Optimize integer progression iterators
With the help of ProgressionUtil hasNext and next* consist now of only several bytecode instructions
This commit is contained in:
@@ -16,26 +16,36 @@
|
|||||||
|
|
||||||
package jet;
|
package jet;
|
||||||
|
|
||||||
|
import jet.runtime.ProgressionUtil;
|
||||||
|
|
||||||
class ByteProgressionIterator extends ByteIterator {
|
class ByteProgressionIterator extends ByteIterator {
|
||||||
private int next;
|
private int next;
|
||||||
private final byte end;
|
|
||||||
private final int increment;
|
private final int increment;
|
||||||
|
private final byte finalElement;
|
||||||
|
private boolean hasNext;
|
||||||
|
|
||||||
public ByteProgressionIterator(byte start, byte end, int increment) {
|
public ByteProgressionIterator(byte start, byte end, int increment) {
|
||||||
this.next = start;
|
this.next = start;
|
||||||
this.end = end;
|
|
||||||
this.increment = increment;
|
this.increment = increment;
|
||||||
|
|
||||||
|
this.finalElement = (byte) ProgressionUtil.getProgressionFinalElement(start, end, increment);
|
||||||
|
this.hasNext = increment < 0 ? start > end : start < end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
return increment > 0 ? next <= end : next >= end;
|
return hasNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte nextByte() {
|
public byte nextByte() {
|
||||||
int value = next;
|
int value = next;
|
||||||
next += increment;
|
if (value == finalElement) {
|
||||||
|
hasNext = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
next += increment;
|
||||||
|
}
|
||||||
return (byte) value;
|
return (byte) value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,26 +16,36 @@
|
|||||||
|
|
||||||
package jet;
|
package jet;
|
||||||
|
|
||||||
|
import jet.runtime.ProgressionUtil;
|
||||||
|
|
||||||
class CharProgressionIterator extends CharIterator {
|
class CharProgressionIterator extends CharIterator {
|
||||||
private int next;
|
private int next;
|
||||||
private final char end;
|
|
||||||
private final int increment;
|
private final int increment;
|
||||||
|
private final char finalElement;
|
||||||
|
private boolean hasNext;
|
||||||
|
|
||||||
public CharProgressionIterator(char start, char end, int increment) {
|
public CharProgressionIterator(char start, char end, int increment) {
|
||||||
this.next = start;
|
this.next = start;
|
||||||
this.end = end;
|
|
||||||
this.increment = increment;
|
this.increment = increment;
|
||||||
|
|
||||||
|
this.finalElement = (char) ProgressionUtil.getProgressionFinalElement(start, end, increment);
|
||||||
|
this.hasNext = increment < 0 ? start > end : start < end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
return increment > 0 ? next <= end : next >= end;
|
return hasNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public char nextChar() {
|
public char nextChar() {
|
||||||
int value = next;
|
int value = next;
|
||||||
next += increment;
|
if (value == finalElement) {
|
||||||
|
hasNext = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
next += increment;
|
||||||
|
}
|
||||||
return (char) value;
|
return (char) value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,29 +16,35 @@
|
|||||||
|
|
||||||
package jet;
|
package jet;
|
||||||
|
|
||||||
|
import jet.runtime.ProgressionUtil;
|
||||||
|
|
||||||
class IntProgressionIterator extends IntIterator {
|
class IntProgressionIterator extends IntIterator {
|
||||||
private int next;
|
private int next;
|
||||||
private final int end;
|
|
||||||
private final int increment;
|
private final int increment;
|
||||||
private boolean overflowHappened = false;
|
private final int finalElement;
|
||||||
|
private boolean hasNext;
|
||||||
|
|
||||||
public IntProgressionIterator(int start, int end, int increment) {
|
public IntProgressionIterator(int start, int end, int increment) {
|
||||||
this.next = start;
|
this.next = start;
|
||||||
this.end = end;
|
|
||||||
this.increment = increment;
|
this.increment = increment;
|
||||||
|
|
||||||
|
this.finalElement = ProgressionUtil.getProgressionFinalElement(start, end, increment);
|
||||||
|
this.hasNext = increment < 0 ? start > end : start < end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
return !overflowHappened && (increment > 0 ? next <= end : next >= end);
|
return hasNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int nextInt() {
|
public int nextInt() {
|
||||||
int value = next;
|
int value = next;
|
||||||
next += increment;
|
if (value == finalElement) {
|
||||||
if ((increment > 0) != (next > value)) {
|
hasNext = false;
|
||||||
overflowHappened = true;
|
}
|
||||||
|
else {
|
||||||
|
next += increment;
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,29 +16,35 @@
|
|||||||
|
|
||||||
package jet;
|
package jet;
|
||||||
|
|
||||||
|
import jet.runtime.ProgressionUtil;
|
||||||
|
|
||||||
class LongProgressionIterator extends LongIterator {
|
class LongProgressionIterator extends LongIterator {
|
||||||
private long next;
|
private long next;
|
||||||
private final long end;
|
|
||||||
private final long increment;
|
private final long increment;
|
||||||
private boolean overflowHappened = false;
|
private final long finalElement;
|
||||||
|
private boolean hasNext;
|
||||||
|
|
||||||
public LongProgressionIterator(long start, long end, long increment) {
|
public LongProgressionIterator(long start, long end, long increment) {
|
||||||
this.next = start;
|
this.next = start;
|
||||||
this.end = end;
|
|
||||||
this.increment = increment;
|
this.increment = increment;
|
||||||
|
|
||||||
|
this.finalElement = ProgressionUtil.getProgressionFinalElement(start, end, increment);
|
||||||
|
this.hasNext = increment < 0 ? start > end : start < end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
return !overflowHappened && (increment > 0 ? next <= end : next >= end);
|
return hasNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long nextLong() {
|
public long nextLong() {
|
||||||
long value = next;
|
long value = next;
|
||||||
next += increment;
|
if (value == finalElement) {
|
||||||
if ((increment > 0) != (next > value)) {
|
hasNext = false;
|
||||||
overflowHappened = true;
|
}
|
||||||
|
else {
|
||||||
|
next += increment;
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,26 +16,36 @@
|
|||||||
|
|
||||||
package jet;
|
package jet;
|
||||||
|
|
||||||
|
import jet.runtime.ProgressionUtil;
|
||||||
|
|
||||||
class ShortProgressionIterator extends ShortIterator {
|
class ShortProgressionIterator extends ShortIterator {
|
||||||
private int next;
|
private int next;
|
||||||
private final short end;
|
|
||||||
private final int increment;
|
private final int increment;
|
||||||
|
private final short finalElement;
|
||||||
|
private boolean hasNext;
|
||||||
|
|
||||||
public ShortProgressionIterator(short start, short end, int increment) {
|
public ShortProgressionIterator(short start, short end, int increment) {
|
||||||
this.next = start;
|
this.next = start;
|
||||||
this.end = end;
|
|
||||||
this.increment = increment;
|
this.increment = increment;
|
||||||
|
|
||||||
|
this.finalElement = (short) ProgressionUtil.getProgressionFinalElement(start, end, increment);
|
||||||
|
this.hasNext = increment < 0 ? start > end : start < end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
return increment > 0 ? next <= end : next >= end;
|
return hasNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public short nextShort() {
|
public short nextShort() {
|
||||||
int value = next;
|
int value = next;
|
||||||
next += increment;
|
if (value == finalElement) {
|
||||||
|
hasNext = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
next += increment;
|
||||||
|
}
|
||||||
return (short) value;
|
return (short) value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user