Iterator.hasNext() becomes property
This commit is contained in:
@@ -277,14 +277,17 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
|
|||||||
|
|
||||||
v.mark(begin);
|
v.mark(begin);
|
||||||
v.load(iteratorVar, asmIterType);
|
v.load(iteratorVar, asmIterType);
|
||||||
FunctionDescriptor hND;
|
|
||||||
if(hasNextDescriptor instanceof FunctionDescriptor) {
|
if(hasNextDescriptor instanceof FunctionDescriptor) {
|
||||||
hND = (FunctionDescriptor) hasNextDescriptor;
|
FunctionDescriptor hND = (FunctionDescriptor) hasNextDescriptor;
|
||||||
|
invokeFunctionNoParams(hND, Type.BOOLEAN_TYPE, v);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hND = ((PropertyDescriptor) hasNextDescriptor).getGetter();
|
// hND = ((PropertyDescriptor) hasNextDescriptor).getGetter();
|
||||||
|
// if(hND != null)
|
||||||
|
// invokeFunctionNoParams(hND, Type.BOOLEAN_TYPE, v);
|
||||||
|
// else
|
||||||
|
intermediateValueForProperty((PropertyDescriptor) hasNextDescriptor, false, false).put(Type.BOOLEAN_TYPE, v);
|
||||||
}
|
}
|
||||||
invokeFunctionNoParams(hND, Type.BOOLEAN_TYPE, v);
|
|
||||||
v.ifeq(end);
|
v.ifeq(end);
|
||||||
|
|
||||||
myMap.enter(parameterDescriptor, asmParamType.getSize());
|
myMap.enter(parameterDescriptor, asmParamType.getSize());
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ fun Any?.equals(other : Any?) : Boolean// = this === other
|
|||||||
fun Any?.toString() : String// = this === other
|
fun Any?.toString() : String// = this === other
|
||||||
|
|
||||||
trait Iterator<out T> {
|
trait Iterator<out T> {
|
||||||
fun next() : T
|
fun next() : T
|
||||||
fun hasNext() : Boolean
|
val hasNext : Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
trait Iterable<out T> {
|
trait Iterable<out T> {
|
||||||
|
|||||||
@@ -88,7 +88,8 @@ class MyCollection2(): Iterable<Int> {
|
|||||||
var k : Int = 5
|
var k : Int = 5
|
||||||
|
|
||||||
override fun next() : Int = k--
|
override fun next() : Int = k--
|
||||||
override fun hasNext() = k > 0
|
override val hasNext : Boolean
|
||||||
|
get() = k > 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,7 +100,8 @@ class MyCollection3() {
|
|||||||
var k : Int = 5
|
var k : Int = 5
|
||||||
|
|
||||||
fun next() : Int? = k--
|
fun next() : Int? = k--
|
||||||
fun hasNext() = k > 0
|
val hasNext : Boolean
|
||||||
|
get() = k > 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,42 +56,42 @@ public class ArrayGenTest extends CodegenTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testIterator () throws Exception {
|
public void testIterator () throws Exception {
|
||||||
loadText("fun box() { val x = Array<Int>(5, { it } ).iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }");
|
loadText("fun box() { val x = Array<Int>(5, { it } ).iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }");
|
||||||
System.out.println(generateToText());
|
System.out.println(generateToText());
|
||||||
Method foo = generateFunction();
|
Method foo = generateFunction();
|
||||||
foo.invoke(null);
|
foo.invoke(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testPrimitiveIterator () throws Exception {
|
public void testPrimitiveIterator () throws Exception {
|
||||||
loadText("fun box() { val x = ByteArray(5).iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }");
|
loadText("fun box() { val x = ByteArray(5).iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }");
|
||||||
System.out.println(generateToText());
|
System.out.println(generateToText());
|
||||||
Method foo = generateFunction();
|
Method foo = generateFunction();
|
||||||
foo.invoke(null);
|
foo.invoke(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testLongIterator () throws Exception {
|
public void testLongIterator () throws Exception {
|
||||||
loadText("fun box() { val x = LongArray(5).iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }");
|
loadText("fun box() { val x = LongArray(5).iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }");
|
||||||
System.out.println(generateToText());
|
System.out.println(generateToText());
|
||||||
Method foo = generateFunction();
|
Method foo = generateFunction();
|
||||||
foo.invoke(null);
|
foo.invoke(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCharIterator () throws Exception {
|
public void testCharIterator () throws Exception {
|
||||||
loadText("fun box() { val x = CharArray(5).iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }");
|
loadText("fun box() { val x = CharArray(5).iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }");
|
||||||
System.out.println(generateToText());
|
System.out.println(generateToText());
|
||||||
Method foo = generateFunction();
|
Method foo = generateFunction();
|
||||||
foo.invoke(null);
|
foo.invoke(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testArrayIndices () throws Exception {
|
public void testArrayIndices () throws Exception {
|
||||||
loadText("fun box() { val x = Array<Int>(5, {it}).indices.iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }");
|
loadText("fun box() { val x = Array<Int>(5, {it}).indices.iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }");
|
||||||
System.out.println(generateToText());
|
System.out.println(generateToText());
|
||||||
Method foo = generateFunction();
|
Method foo = generateFunction();
|
||||||
foo.invoke(null);
|
foo.invoke(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCharIndices () throws Exception {
|
public void testCharIndices () throws Exception {
|
||||||
loadText("fun box() { val x = CharArray(5).indices.iterator(); while(x.hasNext()) { java.lang.System.out?.println(x.next()) } }");
|
loadText("fun box() { val x = CharArray(5).indices.iterator(); while(x.hasNext) { java.lang.System.out?.println(x.next()) } }");
|
||||||
System.out.println(generateToText());
|
System.out.println(generateToText());
|
||||||
Method foo = generateFunction();
|
Method foo = generateFunction();
|
||||||
foo.invoke(null);
|
foo.invoke(null);
|
||||||
|
|||||||
@@ -1,105 +0,0 @@
|
|||||||
namespace jet.collections.iterator
|
|
||||||
|
|
||||||
import java.util.NoSuchElementException
|
|
||||||
|
|
||||||
trait IIterator<out T> {
|
|
||||||
fun next() : T
|
|
||||||
val hasNext : Boolean
|
|
||||||
|
|
||||||
inline fun <R> foldLeft(init: R, operation: fun(accumulated: R, element: T) : R) : R {
|
|
||||||
while(hasNext)
|
|
||||||
init = operation(init, next())
|
|
||||||
return init
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun <R> foldLeft(init: R, operation: fun(accumulated: R, index: Int, element: T) : R) : R {
|
|
||||||
var k = 0
|
|
||||||
while(hasNext)
|
|
||||||
init = operation(init, k++, next())
|
|
||||||
return init
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun foreach(operation: fun(element: T) : Unit) = while(hasNext) operation(next())
|
|
||||||
|
|
||||||
inline fun foreach(operation: fun(index: Int, element: T) : Unit) : Unit {
|
|
||||||
var k = 0
|
|
||||||
while(hasNext)
|
|
||||||
operation(k++, next())
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun <R> map(transform: fun(element: T) : R) : IIterator<R> {
|
|
||||||
return object : IIterator<R> {
|
|
||||||
override fun next() : R = transform(this@map.next())
|
|
||||||
|
|
||||||
override val hasNext : Boolean
|
|
||||||
get() = this@map.hasNext
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun plus(other: IIterator<T>) : IIterator<T> =
|
|
||||||
object : IIterator<T> {
|
|
||||||
override fun next() : T = if(this@plus.hasNext) this@plus.next() else other.next()
|
|
||||||
|
|
||||||
override val hasNext : Boolean
|
|
||||||
get() = this@plus.hasNext || other.hasNext
|
|
||||||
}
|
|
||||||
|
|
||||||
inline fun filter(condition: fun(element: T) : Boolean) : IIterator<T> {
|
|
||||||
return object : IIterator<T> {
|
|
||||||
private var _next : T = null
|
|
||||||
private var _lookedAhead : Boolean = false
|
|
||||||
private var _hasNext : Boolean = false
|
|
||||||
|
|
||||||
private fun lookAhead() : Boolean {
|
|
||||||
if(!_lookedAhead) {
|
|
||||||
_lookedAhead = true
|
|
||||||
while(this@filter.hasNext) {
|
|
||||||
_next = this@filter.next()
|
|
||||||
if(condition(_next)) {
|
|
||||||
_hasNext = true
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _hasNext
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun next() : T {
|
|
||||||
lookAhead()
|
|
||||||
_lookedAhead = false
|
|
||||||
if(_hasNext) {
|
|
||||||
val res = _next
|
|
||||||
_next = null
|
|
||||||
_hasNext = false
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
throw NoSuchElementException()
|
|
||||||
}
|
|
||||||
|
|
||||||
override val hasNext : Boolean
|
|
||||||
get() = lookAhead()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
fun toArray(buffer : MutableArray<in T>) : Int { // T is still an in-parameter
|
|
||||||
return fillBuffer(buffer, 0, buffer.size)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun toArray(buffer : MutableArray<in T>, from : Int, length : Int) : Int { // T is still an in-parameter
|
|
||||||
if (from < 0 || from > buffer.lastIndex || length < 0 || length > buffer.size - from) {
|
|
||||||
throw IndexOutOfBoundsException();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len == 0) return 0
|
|
||||||
|
|
||||||
var count = 0;
|
|
||||||
for (i in from .. from + length - 1) {
|
|
||||||
if (!hasNext)
|
|
||||||
return count
|
|
||||||
buffer[i] = next()
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
return count
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
namespace jet.collections
|
||||||
|
|
||||||
|
import java.util.NoSuchElementException
|
||||||
|
|
||||||
|
trait ISized {
|
||||||
|
val size : Int
|
||||||
|
}
|
||||||
|
|
||||||
|
val ISized.isEmpty : Boolean
|
||||||
|
get() = size == 0
|
||||||
|
|
||||||
|
val ISized.isNonEmpty : Boolean
|
||||||
|
get() = size != 0
|
||||||
|
|
||||||
|
trait ISet<T> : Iterable<T>, ISized {
|
||||||
|
fun contains(item : T) : Boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> Iterator<T>.foreach(operation: fun(element: T) : Unit) : Unit = while(hasNext) operation(next())
|
||||||
|
|
||||||
|
fun <T> Iterator<T>.foreach(operation: fun(index: Int, element: T) : Unit) : Unit {
|
||||||
|
var k = 0
|
||||||
|
while(hasNext)
|
||||||
|
operation(k++, next())
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> Iterable<T>.foreach(operation: fun(element: T) : Unit) : Unit = iterator() foreach operation
|
||||||
|
|
||||||
|
fun <T> Iterable<T>.foreach(operation: fun(index: Int, element: T) : Unit) : Unit = iterator() foreach operation
|
||||||
|
|
||||||
|
fun <T,R> Iterable<T>.foldLeft(init: R, operation: fun(accumulated: R, element: T) : R) : R =
|
||||||
|
iterator () foreach operation
|
||||||
|
|
||||||
|
fun <T,R> Iterable<T>.foldLeft(init: R, operation: fun(accumulated: R, index: Int, element: T) : R) : R =
|
||||||
|
iterator () foreach operation
|
||||||
|
|
||||||
|
fun <T,R> Iterator<T>.foldLeft(init: R, operation: fun(accumulated: R, element: T) : R) : R {
|
||||||
|
while(hasNext)
|
||||||
|
init = operation(init, next())
|
||||||
|
return init
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T,R> Iterator<T>.foldLeft(init: R, operation: fun(accumulated: R, index: Int, element: T) : R) : R {
|
||||||
|
var k = 0
|
||||||
|
while(hasNext)
|
||||||
|
init = operation(init, k++, next())
|
||||||
|
return init
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T,R> Iterator<T>.map(transform: fun(element: T) : R) : Iterator<R> =
|
||||||
|
object : Iterator<R> {
|
||||||
|
override fun next() : R = transform(this@map.next())
|
||||||
|
|
||||||
|
override val hasNext : Boolean
|
||||||
|
get() = this@map.hasNext
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T,R> Iterator<T>.map(transform: fun(index: Int, element: T) : R) : Iterator<R> {
|
||||||
|
return object : Iterator<R> {
|
||||||
|
var index = 0
|
||||||
|
|
||||||
|
override fun next() : R = transform(index++, this@map.next())
|
||||||
|
|
||||||
|
override val hasNext : Boolean
|
||||||
|
get() = this@map.hasNext
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> Iterator<T>.plus(other: Iterator<T>) : Iterator<T> =
|
||||||
|
object : Iterator<T> {
|
||||||
|
override fun next() : T = if(this@plus.hasNext) this@plus.next() else other.next()
|
||||||
|
|
||||||
|
override val hasNext : Boolean
|
||||||
|
get() = this@plus.hasNext || other.hasNext
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <T> Iterator<T>.filter(condition: fun(element: T) : Boolean) : Iterator<T> {
|
||||||
|
return object : Iterator<T> {
|
||||||
|
private var _next : T = null
|
||||||
|
private var _lookedAhead : Boolean = false
|
||||||
|
private var _hasNext : Boolean = false
|
||||||
|
|
||||||
|
private fun lookAhead() : Boolean {
|
||||||
|
if(!_lookedAhead) {
|
||||||
|
_lookedAhead = true
|
||||||
|
while(this@filter.hasNext) {
|
||||||
|
_next = this@filter.next()
|
||||||
|
if(condition(_next)) {
|
||||||
|
_hasNext = true
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _hasNext
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun next() : T {
|
||||||
|
lookAhead()
|
||||||
|
_lookedAhead = false
|
||||||
|
if(_hasNext) {
|
||||||
|
val res = _next
|
||||||
|
_next = null
|
||||||
|
_hasNext = false
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
throw NoSuchElementException()
|
||||||
|
}
|
||||||
|
|
||||||
|
override val hasNext : Boolean
|
||||||
|
get() = lookAhead()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
fun toArray(buffer : MutableArray<in T>) : Int { // T is still an in-parameter
|
||||||
|
return fillBuffer(buffer, 0, buffer.size)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun toArray(buffer : MutableArray<in T>, from : Int, length : Int) : Int { // T is still an in-parameter
|
||||||
|
if (from < 0 || from > buffer.lastIndex || length < 0 || length > buffer.size - from) {
|
||||||
|
throw IndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len == 0) return 0
|
||||||
|
|
||||||
|
var count = 0;
|
||||||
|
for (i in from .. from + length - 1) {
|
||||||
|
if (!hasNext)
|
||||||
|
return count
|
||||||
|
buffer[i] = next()
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
*/
|
||||||
@@ -76,7 +76,7 @@ public final class IntRange implements Range<Integer>, Iterable<Integer>, JetObj
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean getHasNext() {
|
||||||
return count > 0;
|
return count > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package jet;
|
package jet;
|
||||||
|
|
||||||
public interface Iterator<T> extends JetObject {
|
public interface Iterator<T> extends JetObject {
|
||||||
boolean hasNext();
|
boolean getHasNext();
|
||||||
T next ();
|
T next ();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ public final class LongRange implements Range<Long>, Iterable<Long>, JetObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean getHasNext() {
|
||||||
return count > 0;
|
return count > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public abstract class ArrayIterator<T> implements Iterator<T>, JetObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean getHasNext() {
|
||||||
return index < size;
|
return index < size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user