arraybench/src/main/java/com/github/shautvast/benchmarks/arrays/IntArray.java
Shautvast b4e85092d2 v1
2023-08-28 20:18:40 +02:00

62 lines
1.7 KiB
Java

package com.github.shautvast.benchmarks.arrays;
/**
* Any dimensional int array, stored as an int[]
* No runtime checks! Easy to shoot yourself in the foot!
*/
public class IntArray {
private final int[] data;
private final int[] dims;
public IntArray(int... dims) {
if (dims.length < 1) {
throw new IllegalArgumentException("array cannot have " + dims.length + " dimensions");
}
this.dims = dims;
int size = 1;
for (int dim : dims) {
size *= dim;
}
data = new int[size];
}
public int get(int... coords) {
if (coords.length < 1) {
throw new IllegalArgumentException("must supply at least one coordinate");
}
int index = 0;
if (coords.length > 1) {
for (int i = coords.length - 2; i >= 0; i--) {
index += coords[i] * dims[i + 1];
}
}
return data[index + coords[coords.length - 1]];
}
/**
* 'smart' use of varargs int: first values are the coordinates, last is the value itself
*
* @param coordsVal, all coordinates and the value to set
*/
public void set(int... coordsVal) {
if (coordsVal.length < 2) {
throw new IllegalArgumentException("must supply at least one coordinate and a value to set");
}
int index = 0;
if (coordsVal.length > 2) {
for (int i = coordsVal.length - 3; i >= 0; i--) {
index += coordsVal[i] * dims[i + 1];
}
}
data[index + coordsVal[coordsVal.length - 2]] = coordsVal[coordsVal.length - 1];
}
int internalSize() {
return data.length;
}
}