You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2021/04/12 09:23:31 UTC
[groovy] 14/25: GROOVY-9649: Fixed getAt for primitive arrays by
introducing a new helper method, added few test cases for getAt
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 8d76395455a689d058b2428b00e4eaf391ad31c2
Author: Esko Toivonen <es...@tuni.fi>
AuthorDate: Wed Apr 7 17:52:47 2021 +0300
GROOVY-9649: Fixed getAt for primitive arrays by introducing a new helper method, added few test cases for getAt
---
.../groovy/runtime/DefaultGroovyMethods.java | 16 ++++++-------
.../runtime/DefaultGroovyMethodsSupport.java | 28 ++++++++++++++++++++++
src/test/groovy/GroovyMethodsTest.groovy | 3 +++
3 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
index 1ce0ea6..c756d84 100644
--- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
+++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
@@ -13944,7 +13944,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
@SuppressWarnings("unchecked")
public static List<Byte> getAt(byte[] array, IntRange range) {
RangeInfo info = subListBorders(array.length, range);
- List<Byte> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1));
+ List<Byte> answer = primitiveArrayGet(array, subListRange(info, range));
return info.reverse ? reverse(answer) : answer;
}
@@ -13959,7 +13959,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
@SuppressWarnings("unchecked")
public static List<Character> getAt(char[] array, IntRange range) {
RangeInfo info = subListBorders(array.length, range);
- List<Character> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1));
+ List<Character> answer = primitiveArrayGet(array, subListRange(info, range));
return info.reverse ? reverse(answer) : answer;
}
@@ -13974,7 +13974,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
@SuppressWarnings("unchecked")
public static List<Short> getAt(short[] array, IntRange range) {
RangeInfo info = subListBorders(array.length, range);
- List<Short> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1));
+ List<Short> answer = primitiveArrayGet(array, subListRange(info, range));
return info.reverse ? reverse(answer) : answer;
}
@@ -13989,7 +13989,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
@SuppressWarnings("unchecked")
public static List<Integer> getAt(int[] array, IntRange range) {
RangeInfo info = subListBorders(array.length, range);
- List<Integer> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1));
+ List<Integer> answer = primitiveArrayGet(array, subListRange(info, range));
return info.reverse ? reverse(answer) : answer;
}
@@ -14004,7 +14004,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
@SuppressWarnings("unchecked")
public static List<Long> getAt(long[] array, IntRange range) {
RangeInfo info = subListBorders(array.length, range);
- List<Long> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1));
+ List<Long> answer = primitiveArrayGet(array, subListRange(info, range));
return info.reverse ? reverse(answer) : answer;
}
@@ -14019,7 +14019,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
@SuppressWarnings("unchecked")
public static List<Float> getAt(float[] array, IntRange range) {
RangeInfo info = subListBorders(array.length, range);
- List<Float> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1));
+ List<Float> answer = primitiveArrayGet(array, subListRange(info, range));
return info.reverse ? reverse(answer) : answer;
}
@@ -14034,7 +14034,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
@SuppressWarnings("unchecked")
public static List<Double> getAt(double[] array, IntRange range) {
RangeInfo info = subListBorders(array.length, range);
- List<Double> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1));
+ List<Double> answer = primitiveArrayGet(array, subListRange(info, range));
return info.reverse ? reverse(answer) : answer;
}
@@ -14049,7 +14049,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
@SuppressWarnings("unchecked")
public static List<Boolean> getAt(boolean[] array, IntRange range) {
RangeInfo info = subListBorders(array.length, range);
- List<Boolean> answer = primitiveArrayGet(array, new IntRange(true, info.from, info.to - 1));
+ List<Boolean> answer = primitiveArrayGet(array, subListRange(info, range));
return info.reverse ? reverse(answer) : answer;
}
diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java
index 43136d5..14f2b9d 100644
--- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java
+++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethodsSupport.java
@@ -101,6 +101,34 @@ public class DefaultGroovyMethodsSupport {
return new RangeInfo(from, from, false);
}
+ // Helper method for primitive array getAt
+ protected static IntRange subListRange(RangeInfo info, IntRange range) {
+ int from = info.from;
+ int to = info.to - 1;
+
+ // Undo inclusiveness effects done by subListBorders()
+ if (!info.reverse) {
+ if (!range.getInclusiveLeft()) {
+ from--;
+ }
+ if (!range.getInclusiveRight()) {
+ to++;
+ }
+ } else {
+ if (!range.getInclusiveLeft()) {
+ to++;
+ }
+ if (!range.getInclusiveRight()) {
+ from--;
+ }
+ }
+
+ boolean inclusiveLeft = info.reverse ? range.getInclusiveRight() : range.getInclusiveLeft();
+ boolean inclusiveRight = info.reverse ? range.getInclusiveLeft() : range.getInclusiveRight();
+
+ return new IntRange(inclusiveLeft, inclusiveRight, from, to);
+ }
+
/**
* This converts a possibly negative index to a real index into the array.
*
diff --git a/src/test/groovy/GroovyMethodsTest.groovy b/src/test/groovy/GroovyMethodsTest.groovy
index 0c9d5d3..63ac9df 100644
--- a/src/test/groovy/GroovyMethodsTest.groovy
+++ b/src/test/groovy/GroovyMethodsTest.groovy
@@ -295,6 +295,9 @@ class GroovyMethodsTest extends GroovyTestCase {
def list = ['a', 'b', 'c']
assert list[1..2] == ['b', 'c']
assert list[0..<0] == []
+ assert list[0<..0] == []
+ assert list[0<..<0] == []
+ assert list[0<..<1] == []
}
void testCharSequenceGetAt() {