Author: echatellier Date: 2011-04-13 17:50:50 +0200 (Wed, 13 Apr 2011) New Revision: 352 Url: http://nuiton.org/repositories/revision/nuiton-matrix/352 Log: Anomalie #1458: Can't use List<Integer> as semantics Modified: trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/MatrixHelper.java Modified: trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/MatrixHelper.java =================================================================== --- trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/MatrixHelper.java 2011-04-13 08:39:28 UTC (rev 351) +++ trunk/nuiton-matrix/src/main/java/org/nuiton/math/matrix/MatrixHelper.java 2011-04-13 15:50:50 UTC (rev 352) @@ -32,8 +32,6 @@ import java.util.NoSuchElementException; import java.util.Stack; -import org.apache.commons.lang.ArrayUtils; - /** * Contains usefull methods to get information on matrix. * @@ -191,7 +189,7 @@ for (int i = 0; i < result.length; i++) { result[i] = semantics[i].get(coordinates[i]); if (result[i] == null) { - result[i] = Integer.valueOf(coordinates[i]); + result[i] = MatrixDimensionIndex.valueOf(coordinates[i]); } } return result; @@ -204,7 +202,7 @@ * * @param semantics la semantique à utiliser pour la conversion * @param coordinates les coordonnées sémantique - * @return les coordonnées en entier. Si la sémantique est représentéé par un + * @return les coordonnées en entier. Si la sémantique est représentée par un * Integer alors la valeur de l'integer est utilisé pour la * conversion. */ @@ -233,8 +231,9 @@ */ public static int indexOf(List<?>[] semantics, int dim, Object o) throws NoSuchElementException { - if (o instanceof Integer) { - return ((Integer) o).intValue(); + // see {#dimensionToSemantics()} to known why + if (o instanceof MatrixDimensionIndex) { + return ((MatrixDimensionIndex) o).intValue(); } int result = -1; if ((0 <= dim) && (dim < semantics.length)) { @@ -373,3 +372,53 @@ } } // MatrixHelper + +/** + * This class must stay private and can't be used outside nuiton matrix + * to prevent semantic type collision. + * + * This class is a copy of JDK's Integer with only necessary stuff. + */ +class MatrixDimensionIndex { + protected int value; + + private MatrixDimensionIndex(int value) { + this.value = value; + } + + /** + * See {@code Integer#IntegerCache} for details about that. + */ + private static class MatrixDimensionIndexCache { + static final int high; + static final MatrixDimensionIndex cache[]; + + static { + final int low = 0; + + // high value may be configured by property + high = 127; + + cache = new MatrixDimensionIndex[(high - low) + 1]; + int j = low; + for(int k = 0; k < cache.length; k++) { + cache[k] = new MatrixDimensionIndex(j++); + } + } + + private MatrixDimensionIndexCache() {} + } + + public static MatrixDimensionIndex valueOf(int i) { + if(i >= 0 && i <= MatrixDimensionIndexCache.high) { + return MatrixDimensionIndexCache.cache[i + 128]; + } + else { + return new MatrixDimensionIndex(i); + } + } + + public int intValue() { + return value; + } +} \ No newline at end of file