/* * Copyright 2010-2015 Institut Pasteur. * * This file is part of Icy. * * Icy is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Icy is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Icy. If not, see <http://www.gnu.org/licenses/>. */ package icy.type.collection.array; import icy.type.DataType; /** * @author Stephane */ public class Array3DUtil { /** * Return the total number of element of the specified array */ public static int getTotalLength(byte[][][] array) { int result = 0; if (array != null) { final int len = array.length; for (int i = 0; i < len; i++) result += Array2DUtil.getTotalLength(array[i]); } return result; } /** * Return the total number of element of the specified array */ public static int getTotalLength(short[][][] array) { int result = 0; if (array != null) { final int len = array.length; for (int i = 0; i < len; i++) result += Array2DUtil.getTotalLength(array[i]); } return result; } /** * Return the total number of element of the specified array */ public static int getTotalLength(int[][][] array) { int result = 0; if (array != null) { final int len = array.length; for (int i = 0; i < len; i++) result += Array2DUtil.getTotalLength(array[i]); } return result; } /** * Return the total number of element of the specified array */ public static int getTotalLength(long[][][] array) { int result = 0; if (array != null) { final int len = array.length; for (int i = 0; i < len; i++) result += Array2DUtil.getTotalLength(array[i]); } return result; } /** * Return the total number of element of the specified array */ public static int getTotalLength(float[][][] array) { int result = 0; if (array != null) { final int len = array.length; for (int i = 0; i < len; i++) result += Array2DUtil.getTotalLength(array[i]); } return result; } /** * Return the total number of element of the specified array */ public static int getTotalLength(double[][][] array) { int result = 0; if (array != null) { final int len = array.length; for (int i = 0; i < len; i++) result += Array2DUtil.getTotalLength(array[i]); } return result; } /** * Create a new 3D array with specified data type and length */ public static Object[][] createArray(DataType dataType, int len) { switch (dataType.getJavaType()) { case BYTE: return new byte[len][][]; case SHORT: return new short[len][][]; case INT: return new int[len][][]; case LONG: return new int[len][][]; case FLOAT: return new float[len][][]; case DOUBLE: return new double[len][][]; default: return null; } } /** * @deprecated */ @Deprecated public static Object[][] createArray(int dataType, int len) { return createArray(DataType.getDataType(dataType), len); } /** * Return the multi dimension 'in' array as a single dimension byte array. */ public static byte[] toByteArray1D(byte[][][] in) { return toByteArray1D(in, null, 0); } /** * Return the multi dimension 'in' array as a single dimension short array. */ public static short[] toShortArray1D(short[][][] in) { return toShortArray1D(in, null, 0); } /** * Return the multi dimension 'in' array as a single dimension int array. */ public static int[] toIntArray1D(int[][][] in) { return toIntArray1D(in, null, 0); } /** * Return the multi dimension 'in' array as a single dimension float array. */ public static float[] toFloatArray1D(float[][][] in) { return toFloatArray1D(in, null, 0); } /** * Return the multi dimension 'in' array as a single dimension double array. */ public static double[] toDoubleArray1D(double[][][] in) { return toDoubleArray1D(in, null, 0); } /** * Return the 3 dimensions 'in' array as a single dimension array.<br> * The resulting array is returned in 'out' and from the specified if any.<br> * If (out == null) a new array is allocated. */ public static byte[] toByteArray1D(byte[][][] in, byte[] out, int offset) { final byte[] result = Array1DUtil.allocIfNull(out, offset + getTotalLength(in)); if (in != null) { final int len = in.length; int off = offset; for (int i = 0; i < len; i++) { final byte[][] s_in = in[i]; if (s_in != null) { Array2DUtil.toByteArray1D(s_in, result, off); off += s_in.length; } } } return result; } /** * Return the 3 dimensions 'in' array as a single dimension array.<br> * The resulting array is returned in 'out' and from the specified if any.<br> * If (out == null) a new array is allocated. */ public static short[] toShortArray1D(short[][][] in, short[] out, int offset) { final short[] result = Array1DUtil.allocIfNull(out, offset + getTotalLength(in)); if (in != null) { final int len = in.length; int off = offset; for (int i = 0; i < len; i++) { final short[][] s_in = in[i]; if (s_in != null) { Array2DUtil.toShortArray1D(s_in, result, off); off += s_in.length; } } } return result; } /** * Return the 3 dimensions 'in' array as a single dimension array.<br> * The resulting array is returned in 'out' and from the specified if any.<br> * If (out == null) a new array is allocated. */ public static int[] toIntArray1D(int[][][] in, int[] out, int offset) { final int[] result = Array1DUtil.allocIfNull(out, offset + getTotalLength(in)); if (in != null) { final int len = in.length; int off = offset; for (int i = 0; i < len; i++) { final int[][] s_in = in[i]; if (s_in != null) { Array2DUtil.toIntArray1D(s_in, result, off); off += s_in.length; } } } return result; } /** * Return the 3 dimensions 'in' array as a single dimension array.<br> * The resulting array is returned in 'out' and from the specified if any.<br> * If (out == null) a new array is allocated. */ public static long[] toLongArray1D(long[][][] in, long[] out, int offset) { final long[] result = Array1DUtil.allocIfNull(out, offset + getTotalLength(in)); if (in != null) { final int len = in.length; int off = offset; for (int i = 0; i < len; i++) { final long[][] s_in = in[i]; if (s_in != null) { Array2DUtil.toLongArray1D(s_in, result, off); off += s_in.length; } } } return result; } /** * Return the 3 dimensions 'in' array as a single dimension array.<br> * The resulting array is returned in 'out' and from the specified if any.<br> * If (out == null) a new array is allocated. */ public static float[] toFloatArray1D(float[][][] in, float[] out, int offset) { final float[] result = Array1DUtil.allocIfNull(out, offset + getTotalLength(in)); if (in != null) { final int len = in.length; int off = offset; for (int i = 0; i < len; i++) { final float[][] s_in = in[i]; if (s_in != null) { Array2DUtil.toFloatArray1D(s_in, result, off); off += s_in.length; } } } return result; } /** * Return the 3 dimensions 'in' array as a single dimension array.<br> * The resulting array is returned in 'out' and from the specified if any.<br> * If (out == null) a new array is allocated. */ public static double[] toDoubleArray1D(double[][][] in, double[] out, int offset) { final double[] result = Array1DUtil.allocIfNull(out, offset + getTotalLength(in)); if (in != null) { final int len = in.length; int off = offset; for (int i = 0; i < len; i++) { final double[][] s_in = in[i]; if (s_in != null) { Array2DUtil.toDoubleArray1D(s_in, result, off); off += s_in.length; } } } return result; } }