001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/model/csct/resources/XArray.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/exse/
008     lat/lon GmbH
009     http://www.lat-lon.de
010    
011     It has been implemented within SEAGIS - An OpenSource implementation of OpenGIS specification
012     (C) 2001, Institut de Recherche pour le D�veloppement (http://sourceforge.net/projects/seagis/)
013     SEAGIS Contacts:  Surveillance de l'Environnement Assist�e par Satellite
014     Institut de Recherche pour le D�veloppement / US-Espace
015     mailto:seasnet@teledetection.fr
016    
017    
018     This library is free software; you can redistribute it and/or
019     modify it under the terms of the GNU Lesser General Public
020     License as published by the Free Software Foundation; either
021     version 2.1 of the License, or (at your option) any later version.
022    
023     This library is distributed in the hope that it will be useful,
024     but WITHOUT ANY WARRANTY; without even the implied warranty of
025     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
026     Lesser General Public License for more details.
027    
028     You should have received a copy of the GNU Lesser General Public
029     License along with this library; if not, write to the Free Software
030     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
031    
032     Contact:
033    
034     Andreas Poth
035     lat/lon GmbH
036     Aennchenstr. 19
037     53115 Bonn
038     Germany
039     E-Mail: poth@lat-lon.de
040    
041     Klaus Greve
042     Department of Geography
043     University of Bonn
044     Meckenheimer Allee 166
045     53115 Bonn
046     Germany
047     E-Mail: klaus.greve@uni-bonn.de
048    
049     
050     ---------------------------------------------------------------------------*/
051    package org.deegree.model.csct.resources;
052    
053    // Miscellaneous
054    import java.lang.reflect.Array;
055    
056    /**
057     * Simple operations on arrays. This class provides a central place for inserting and
058     * deleting elements in an array, as well as resizing the array. This class may be
059     * removed if JavaSoft provide some language construct functionally equivalent to
060     * C/C++'s <code>realloc</code>.
061     *
062     * @version 1.0
063     * @author Martin Desruisseaux
064     */
065    public final class XArray {
066        /**
067         * Toute construction d'objet
068         * de cette classe est interdites.
069         */
070        private XArray() {
071        }
072    
073        /**
074         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
075         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
076         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � <code>null</code>
077         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
078         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
079         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
080         *
081         * @param  array Tableau � copier.
082         * @param  length Longueur du tableau d�sir�.
083         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
084         */
085        private static Object doResize( final Object array, final int length ) {
086            final int current = Array.getLength( array );
087            if ( current != length ) {
088                final Object newArray = Array.newInstance( array.getClass().getComponentType(), length );
089                System.arraycopy( array, 0, newArray, 0, Math.min( current, length ) );
090                return newArray;
091            }
092            return array;
093        }
094    
095        /**
096         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
097         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
098         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � <code>null</code>
099         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
100         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
101         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
102         *
103         * @param  array Tableau � copier.
104         * @param  length Longueur du tableau d�sir�.
105         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
106         */
107        public static Object[] resize( final Object[] array, final int length ) {
108            return (Object[]) doResize( array, length );
109        }
110    
111        /**
112         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
113         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
114         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � 0
115         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
116         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
117         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
118         *
119         * @param  array Tableau � copier.
120         * @param  length Longueur du tableau d�sir�.
121         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
122         */
123        public static double[] resize( final double[] array, final int length ) {
124            return (double[]) doResize( array, length );
125        }
126    
127        /**
128         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
129         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
130         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � 0
131         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
132         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
133         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
134         *
135         * @param  array Tableau � copier.
136         * @param  length Longueur du tableau d�sir�.
137         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
138         */
139        public static float[] resize( final float[] array, final int length ) {
140            return (float[]) doResize( array, length );
141        }
142    
143        /**
144         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
145         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
146         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � 0
147         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
148         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
149         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
150         *
151         * @param  array Tableau � copier.
152         * @param  length Longueur du tableau d�sir�.
153         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
154         */
155        public static long[] resize( final long[] array, final int length ) {
156            return (long[]) doResize( array, length );
157        }
158    
159        /**
160         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
161         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
162         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � 0
163         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
164         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
165         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
166         *
167         * @param  array Tableau � copier.
168         * @param  length Longueur du tableau d�sir�.
169         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
170         */
171        public static int[] resize( final int[] array, final int length ) {
172            return (int[]) doResize( array, length );
173        }
174    
175        /**
176         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
177         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
178         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � 0
179         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
180         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
181         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
182         *
183         * @param  array Tableau � copier.
184         * @param  length Longueur du tableau d�sir�.
185         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
186         */
187        public static short[] resize( final short[] array, final int length ) {
188            return (short[]) doResize( array, length );
189        }
190    
191        /**
192         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
193         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
194         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � 0
195         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
196         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
197         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
198         *
199         * @param  array Tableau � copier.
200         * @param  length Longueur du tableau d�sir�.
201         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
202         */
203        public static byte[] resize( final byte[] array, final int length ) {
204            return (byte[]) doResize( array, length );
205        }
206    
207        /**
208         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
209         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
210         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � 0
211         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
212         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
213         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
214         *
215         * @param  array Tableau � copier.
216         * @param  length Longueur du tableau d�sir�.
217         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
218         */
219        public static char[] resize( final char[] array, final int length ) {
220            return (char[]) doResize( array, length );
221        }
222    
223        /**
224         * Renvoie un nouveau tableau qui contiendra les m�mes �l�ments que <code>array</code> mais avec la longueur <code>length</code>
225         * sp�cifi�e. Si la longueur d�sir�e <code>length</code> est plus grande que la longueur initiale du tableau <code>array</code>,
226         * alors le tableau retourn� contiendra tous les �l�ments de <code>array</code> avec en plus des �l�ments initialis�s � <code>false</code>
227         * � la fin du tableau. Si au contraire la longueur d�sir�e <code>length</code> est plus courte que la longueur initiale du tableau
228         * <code>array</code>, alors le tableau sera tronqu� (c'est � dire que les �l�ments en trop de <code>array</code> seront oubli�s).
229         * Si la longueur de <code>array</code> est �gale � <code>length</code>, alors <code>array</code> sera retourn� tel quel.
230         *
231         * @param  array Tableau � copier.
232         * @param  length Longueur du tableau d�sir�.
233         * @return Tableau du m�me type que <code>array</code>, de longueur <code>length</code> et contenant les donn�es de <code>array</code>.
234         */
235        public static boolean[] resize( final boolean[] array, final int length ) {
236            return (boolean[]) doResize( array, length );
237        }
238    
239        /**
240         * Retire des �l�ments au milieu d'un tableau.
241         *
242         * @param array   Tableau dans lequel retirer des �l�ments.
243         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
244         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
245         * @param length  Nombre d'�l�ments � retirer.
246         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
247         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
248         *                elle retournera un tableau nouvellement cr��.
249         */
250        private static Object doRemove( final Object array, final int index, final int length ) {
251            if ( length == 0 )
252                return array;
253            int array_length = Array.getLength( array );
254            final Object newArray = Array.newInstance( array.getClass().getComponentType(),
255                                                       array_length -= length );
256            System.arraycopy( array, 0, newArray, 0, index );
257            System.arraycopy( array, index + length, newArray, index, array_length - index );
258            return newArray;
259        }
260    
261        /**
262         * Retire des �l�ments au milieu d'un tableau.
263         *
264         * @param array   Tableau dans lequel retirer des �l�ments.
265         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
266         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
267         * @param length  Nombre d'�l�ments � retirer.
268         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
269         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
270         *                elle retournera un tableau nouvellement cr��.
271         */
272        public static Object[] remove( final Object[] array, final int index, final int length ) {
273            return (Object[]) doRemove( array, index, length );
274        }
275    
276        /**
277         * Retire des �l�ments au milieu d'un tableau.
278         *
279         * @param array   Tableau dans lequel retirer des �l�ments.
280         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
281         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
282         * @param length  Nombre d'�l�ments � retirer.
283         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
284         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
285         *                elle retournera un tableau nouvellement cr��.
286         */
287        public static double[] remove( final double[] array, final int index, final int length ) {
288            return (double[]) doRemove( array, index, length );
289        }
290    
291        /**
292         * Retire des �l�ments au milieu d'un tableau.
293         *
294         * @param array   Tableau dans lequel retirer des �l�ments.
295         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
296         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
297         * @param length  Nombre d'�l�ments � retirer.
298         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
299         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
300         *                elle retournera un tableau nouvellement cr��.
301         */
302        public static float[] remove( final float[] array, final int index, final int length ) {
303            return (float[]) doRemove( array, index, length );
304        }
305    
306        /**
307         * Retire des �l�ments au milieu d'un tableau.
308         *
309         * @param array   Tableau dans lequel retirer des �l�ments.
310         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
311         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
312         * @param length  Nombre d'�l�ments � retirer.
313         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
314         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
315         *                elle retournera un tableau nouvellement cr��.
316         */
317        public static long[] remove( final long[] array, final int index, final int length ) {
318            return (long[]) doRemove( array, index, length );
319        }
320    
321        /**
322         * Retire des �l�ments au milieu d'un tableau.
323         *
324         * @param array   Tableau dans lequel retirer des �l�ments.
325         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
326         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
327         * @param length  Nombre d'�l�ments � retirer.
328         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
329         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
330         *                elle retournera un tableau nouvellement cr��.
331         */
332        public static int[] remove( final int[] array, final int index, final int length ) {
333            return (int[]) doRemove( array, index, length );
334        }
335    
336        /**
337         * Retire des �l�ments au milieu d'un tableau.
338         *
339         * @param array   Tableau dans lequel retirer des �l�ments.
340         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
341         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
342         * @param length  Nombre d'�l�ments � retirer.
343         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
344         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
345         *                elle retournera un tableau nouvellement cr��.
346         */
347        public static short[] remove( final short[] array, final int index, final int length ) {
348            return (short[]) doRemove( array, index, length );
349        }
350    
351        /**
352         * Retire des �l�ments au milieu d'un tableau.
353         *
354         * @param array   Tableau dans lequel retirer des �l�ments.
355         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
356         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
357         * @param length  Nombre d'�l�ments � retirer.
358         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
359         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
360         *                elle retournera un tableau nouvellement cr��.
361         */
362        public static byte[] remove( final byte[] array, final int index, final int length ) {
363            return (byte[]) doRemove( array, index, length );
364        }
365    
366        /**
367         * Retire des �l�ments au milieu d'un tableau.
368         *
369         * @param array   Tableau dans lequel retirer des �l�ments.
370         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
371         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
372         * @param length  Nombre d'�l�ments � retirer.
373         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
374         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
375         *                elle retournera un tableau nouvellement cr��.
376         */
377        public static char[] remove( final char[] array, final int index, final int length ) {
378            return (char[]) doRemove( array, index, length );
379        }
380    
381        /**
382         * Retire des �l�ments au milieu d'un tableau.
383         *
384         * @param array   Tableau dans lequel retirer des �l�ments.
385         * @param index   Index dans <code>array</code> du premier �l�ment � retirer.
386         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
387         * @param length  Nombre d'�l�ments � retirer.
388         * @return        Tableau qui contient la donn�es de <code>array</code> avec des �l�ments retir�s.
389         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
390         *                elle retournera un tableau nouvellement cr��.
391         */
392        public static boolean[] remove( final boolean[] array, final int index, final int length ) {
393            return (boolean[]) doRemove( array, index, length );
394        }
395    
396        /**
397         * Ins�re des espaces au milieu d'un tableau.
398         * Ces "espaces" seront constitu�s d'�lements nuls.
399         *
400         * @param array   Tableau dans lequel ins�rer des espaces.
401         * @param index   Index de <code>array</code> o� ins�rer les espaces.
402         *                Tous les �l�ments de <code>array</code> dont l'index est
403         *                �gal ou sup�rieur � <code>index</code> seront d�cal�s.
404         * @param length  Nombre d'espaces � ins�rer.
405         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
406         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
407         *                elle retournera un tableau nouvellement cr��.
408         */
409        private static Object doInsert( final Object array, final int index, final int length ) {
410            if ( length == 0 )
411                return array;
412            final int array_length = Array.getLength( array );
413            final Object newArray = Array.newInstance( array.getClass().getComponentType(),
414                                                       array_length + length );
415            System.arraycopy( array, 0, newArray, 0, index );
416            System.arraycopy( array, index, newArray, index + length, array_length - index );
417            return newArray;
418        }
419    
420        /**
421         * Ins�re des espaces au milieu d'un tableau.
422         * Ces "espaces" seront constitu�s d'�lements nuls.
423         *
424         * @param array   Tableau dans lequel ins�rer des espaces.
425         * @param index   Index de <code>array</code> o� ins�rer les espaces.
426         *                Tous les �l�ments de <code>array</code> dont l'index est
427         *                �gal ou sup�rieur � <code>index</code> seront d�cal�s.
428         * @param length  Nombre d'espaces � ins�rer.
429         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
430         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
431         *                elle retournera un tableau nouvellement cr��.
432         */
433        public static Object[] insert( final Object[] array, final int index, final int length ) {
434            return (Object[]) doInsert( array, index, length );
435        }
436    
437        /**
438         * Ins�re des espaces au milieu d'un tableau.
439         * Ces "espaces" seront constitu�s de z�ros.
440         *
441         * @param array   Tableau dans lequel ins�rer des espaces.
442         * @param index   Index de <code>array</code> o� ins�rer les espaces.
443         *                Tous les �l�ments de <code>array</code> dont l'index est
444         *                �gal ou sup�rieur � <code>index</code> seront d�cal�s.
445         * @param length  Nombre d'espaces � ins�rer.
446         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
447         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
448         *                elle retournera un tableau nouvellement cr��.
449         */
450        public static double[] insert( final double[] array, final int index, final int length ) {
451            return (double[]) doInsert( array, index, length );
452        }
453    
454        /**
455         * Ins�re des espaces au milieu d'un tableau.
456         * Ces "espaces" seront constitu�s de z�ros.
457         *
458         * @param array   Tableau dans lequel ins�rer des espaces.
459         * @param index   Index de <code>array</code> o� ins�rer les espaces.
460         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
461         * @param length  Nombre d'espaces � ins�rer.
462         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
463         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
464         *                elle retournera un tableau nouvellement cr��.
465         */
466        public static float[] insert( final float[] array, final int index, final int length ) {
467            return (float[]) doInsert( array, index, length );
468        }
469    
470        /**
471         * Ins�re des espaces au milieu d'un tableau.
472         * Ces "espaces" seront constitu�s de z�ros.
473         *
474         * @param array   Tableau dans lequel ins�rer des espaces.
475         * @param index   Index de <code>array</code> o� ins�rer les espaces.
476         *                Tous les �l�ments de <code>array</code> qui suivent cet index peuvent �tre d�cal�s.
477         * @param length  Nombre d'espaces � ins�rer.
478         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
479         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
480         *                elle retournera un tableau nouvellement cr��.
481         */
482        public static long[] insert( final long[] array, final int index, final int length ) {
483            return (long[]) doInsert( array, index, length );
484        }
485    
486        /**
487         * Ins�re des espaces au milieu d'un tableau.
488         * Ces "espaces" seront constitu�s de z�ros.
489         *
490         * @param array   Tableau dans lequel ins�rer des espaces.
491         * @param index   Index de <code>array</code> o� ins�rer les espaces.
492         *                Tous les �l�ments de <code>array</code> dont l'index est
493         *                �gal ou sup�rieur � <code>index</code> seront d�cal�s.
494         * @param length  Nombre d'espaces � ins�rer.
495         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
496         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
497         *                elle retournera un tableau nouvellement cr��.
498         */
499        public static int[] insert( final int[] array, final int index, final int length ) {
500            return (int[]) doInsert( array, index, length );
501        }
502    
503        /**
504         * Ins�re des espaces au milieu d'un tableau.
505         * Ces "espaces" seront constitu�s de z�ros.
506         *
507         * @param array   Tableau dans lequel ins�rer des espaces.
508         * @param index   Index de <code>array</code> o� ins�rer les espaces.
509         *                Tous les �l�ments de <code>array</code> dont l'index est
510         *                �gal ou sup�rieur � <code>index</code> seront d�cal�s.
511         * @param length  Nombre d'espaces � ins�rer.
512         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
513         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
514         *                elle retournera un tableau nouvellement cr��.
515         */
516        public static short[] insert( final short[] array, final int index, final int length ) {
517            return (short[]) doInsert( array, index, length );
518        }
519    
520        /**
521         * Ins�re des espaces au milieu d'un tableau.
522         * Ces "espaces" seront constitu�s de z�ros.
523         *
524         * @param array   Tableau dans lequel ins�rer des espaces.
525         * @param index   Index de <code>array</code> o� ins�rer les espaces.
526         *                Tous les �l�ments de <code>array</code> dont l'index est
527         *                �gal ou sup�rieur � <code>index</code> seront d�cal�s.
528         * @param length  Nombre d'espaces � ins�rer.
529         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
530         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
531         *                elle retournera un tableau nouvellement cr��.
532         */
533        public static byte[] insert( final byte[] array, final int index, final int length ) {
534            return (byte[]) doInsert( array, index, length );
535        }
536    
537        /**
538         * Ins�re des espaces au milieu d'un tableau.
539         * Ces "espaces" seront constitu�s de z�ros.
540         *
541         * @param array   Tableau dans lequel ins�rer des espaces.
542         * @param index   Index de <code>array</code> o� ins�rer les espaces.
543         *                Tous les �l�ments de <code>array</code> dont l'index est
544         *                �gal ou sup�rieur � <code>index</code> seront d�cal�s.
545         * @param length  Nombre d'espaces � ins�rer.
546         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
547         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
548         *                elle retournera un tableau nouvellement cr��.
549         */
550        public static char[] insert( final char[] array, final int index, final int length ) {
551            return (char[]) doInsert( array, index, length );
552        }
553    
554        /**
555         * Ins�re des espaces au milieu d'un tableau.
556         * Ces "espaces" seront constitu�s de <code>false</code>.
557         *
558         * @param array   Tableau dans lequel ins�rer des espaces.
559         * @param index   Index de <code>array</code> o� ins�rer les espaces.
560         *                Tous les �l�ments de <code>array</code> dont l'index est
561         *                �gal ou sup�rieur � <code>index</code> seront d�cal�s.
562         * @param length  Nombre d'espaces � ins�rer.
563         * @return        Tableau qui contient la donn�es de <code>array</code> avec l'espace supl�mentaire.
564         *                Cette m�thode peut retourner directement <code>dst</code>, mais la plupart du temps
565         *                elle retournera un tableau nouvellement cr��.
566         */
567        public static boolean[] insert( final boolean[] array, final int index, final int length ) {
568            return (boolean[]) doInsert( array, index, length );
569        }
570    
571        /**
572         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
573         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
574         *
575         * @param src     Tableau � ins�rer dans <code>dst</code>.
576         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
577         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
578         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
579         *                Tous les �l�ments de <code>dst</code> dont l'index est
580         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
581         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
582         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
583         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
584         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
585         */
586        private static Object doInsert( final Object src, final int src_pos, final Object dst,
587                                       final int dst_pos, final int length ) {
588            if ( length == 0 )
589                return dst;
590            final int dst_length = Array.getLength( dst );
591            final Object newArray = Array.newInstance( dst.getClass().getComponentType(), dst_length
592                                                                                          + length );
593            System.arraycopy( dst, 0, newArray, 0, dst_pos );
594            System.arraycopy( src, src_pos, newArray, dst_pos, length );
595            System.arraycopy( dst, dst_pos, newArray, dst_pos + length, dst_length - dst_pos );
596            return newArray;
597        }
598    
599        /**
600         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
601         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
602         *
603         * @param src     Tableau � ins�rer dans <code>dst</code>.
604         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
605         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
606         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
607         *                Tous les �l�ments de <code>dst</code> dont l'index est
608         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
609         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
610         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
611         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
612         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
613         */
614        public static Object[] insert( final Object[] src, final int src_pos, final Object[] dst,
615                                      final int dst_pos, final int length ) {
616            return (Object[]) doInsert( src, src_pos, dst, dst_pos, length );
617        }
618    
619        /**
620         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
621         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
622         *
623         * @param src     Tableau � ins�rer dans <code>dst</code>.
624         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
625         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
626         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
627         *                Tous les �l�ments de <code>dst</code> dont l'index est
628         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
629         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
630         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
631         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
632         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
633         */
634        public static double[] insert( final double[] src, final int src_pos, final double[] dst,
635                                      final int dst_pos, final int length ) {
636            return (double[]) doInsert( src, src_pos, dst, dst_pos, length );
637        }
638    
639        /**
640         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
641         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
642         *
643         * @param src     Tableau � ins�rer dans <code>dst</code>.
644         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
645         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
646         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
647         *                Tous les �l�ments de <code>dst</code> dont l'index est
648         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
649         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
650         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
651         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
652         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
653         */
654        public static float[] insert( final float[] src, final int src_pos, final float[] dst,
655                                     final int dst_pos, final int length ) {
656            return (float[]) doInsert( src, src_pos, dst, dst_pos, length );
657        }
658    
659        /**
660         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
661         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
662         *
663         * @param src     Tableau � ins�rer dans <code>dst</code>.
664         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
665         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
666         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
667         *                Tous les �l�ments de <code>dst</code> dont l'index est
668         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
669         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
670         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
671         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
672         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
673         */
674        public static long[] insert( final long[] src, final int src_pos, final long[] dst,
675                                    final int dst_pos, final int length ) {
676            return (long[]) doInsert( src, src_pos, dst, dst_pos, length );
677        }
678    
679        /**
680         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
681         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
682         *
683         * @param src     Tableau � ins�rer dans <code>dst</code>.
684         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
685         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
686         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
687         *                Tous les �l�ments de <code>dst</code> dont l'index est
688         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
689         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
690         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
691         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
692         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
693         */
694        public static int[] insert( final int[] src, final int src_pos, final int[] dst,
695                                   final int dst_pos, final int length ) {
696            return (int[]) doInsert( src, src_pos, dst, dst_pos, length );
697        }
698    
699        /**
700         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
701         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
702         *
703         * @param src     Tableau � ins�rer dans <code>dst</code>.
704         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
705         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
706         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
707         *                Tous les �l�ments de <code>dst</code> dont l'index est
708         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
709         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
710         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
711         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
712         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
713         */
714        public static short[] insert( final short[] src, final int src_pos, final short[] dst,
715                                     final int dst_pos, final int length ) {
716            return (short[]) doInsert( src, src_pos, dst, dst_pos, length );
717        }
718    
719        /**
720         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
721         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
722         *
723         * @param src     Tableau � ins�rer dans <code>dst</code>.
724         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
725         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
726         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
727         *                Tous les �l�ments de <code>dst</code> dont l'index est
728         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
729         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
730         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
731         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
732         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
733         */
734        public static byte[] insert( final byte[] src, final int src_pos, final byte[] dst,
735                                    final int dst_pos, final int length ) {
736            return (byte[]) doInsert( src, src_pos, dst, dst_pos, length );
737        }
738    
739        /**
740         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
741         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
742         *
743         * @param src     Tableau � ins�rer dans <code>dst</code>.
744         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
745         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
746         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
747         *                Tous les �l�ments de <code>dst</code> dont l'index est
748         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
749         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
750         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
751         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
752         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
753         */
754        public static char[] insert( final char[] src, final int src_pos, final char[] dst,
755                                    final int dst_pos, final int length ) {
756            return (char[]) doInsert( src, src_pos, dst, dst_pos, length );
757        }
758    
759        /**
760         * Ins�re une portion de tableau dans un autre tableau. Le tableau <code>src</code>
761         * sera ins�r� en totalit� ou en partie dans le tableau <code>dst</code>.
762         *
763         * @param src     Tableau � ins�rer dans <code>dst</code>.
764         * @param src_pos Index de la premi�re donn�e de <code>src</code> � ins�rer dans <code>dst</code>.
765         * @param dst     Tableau dans lequel ins�rer des donn�es de <code>src</code>.
766         * @param dst_pos Index de <code>dst</code> o� ins�rer les donn�es de <code>src</code>.
767         *                Tous les �l�ments de <code>dst</code> dont l'index est
768         *                �gal ou sup�rieur � <code>dst_pos</code> seront d�cal�s.
769         * @param length  Nombre de donn�es de <code>src</code> � ins�rer.
770         * @return        Tableau qui contient la combinaison de <code>src</code> et <code>dst</code>. Cette
771         *                m�thode peut retourner directement <code>dst</code>, mais jamais <code>src</code>.
772         *                La plupart du temps, elle retournera un tableau nouvellement cr��.
773         */
774        public static boolean[] insert( final boolean[] src, final int src_pos, final boolean[] dst,
775                                       final int dst_pos, final int length ) {
776            return (boolean[]) doInsert( src, src_pos, dst, dst_pos, length );
777        }
778    }