Changes in this commit seem to be the result of some "auto reformat" tool execution. The Java - GeoAPI - GeoTools import ordering is altered, imports used only in Javadoc are lost and the encoding of non-ASCII characters is broken. This commit has been reverted, except for the removal of really unused imports which are kept removed.
Command line:
svn diff --extensions "--unified --ignore-space-change --ignore-all-space --ignore-eol-style" -r10795:10796 https://svn.osgeo.org/geotools/trunk/modules/library/metadata/src/main/java/org/geotools/util/RangeSet.java
Revision 10795 | Revision 10796 |
---|---|
/*
* Geotools 2 - OpenSource mapping toolkit
* (C) 2003, Geotools Project Management Committee (PMC)
* (C) 2001, Institut de Recherche pour le Développement
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public |
/*
* Geotools 2 - OpenSource mapping toolkit
* (C) 2003, Geotools Project Management Committee (PMC)
* (C) 2001, Institut de Recherche pour le D�veloppement
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public |
package org.geotools.util; // Collections import java.util.Arrays; import java.util.SortedSet; import java.util.AbstractSet; import java.util.Comparator; import java.util.NoSuchElementException; import java.util.ConcurrentModificationException; // Miscellaneous import java.io.Serializable; import java.lang.reflect.Array; import javax.media.jai.util.Range; // OpenGIS dependencies import org.opengis.util.Cloneable; // Geotools dependencies import org.geotools.resources.Utilities; import org.geotools.resources.ClassChanger; import org.geotools.resources.rsc.Resources; import org.geotools.resources.rsc.ResourceKeys; /** |
package org.geotools.util; // Collections import java.io.Serializable; import java.lang.reflect.Array; import java.util.AbstractSet; import java.util.Arrays; import java.util.Comparator; import java.util.ConcurrentModificationException; import java.util.NoSuchElementException; import java.util.SortedSet; import javax.media.jai.util.Range; import org.geotools.resources.ClassChanger; import org.geotools.resources.Utilities; import org.geotools.resources.rsc.ResourceKeys; import org.geotools.resources.rsc.Resources; import org.opengis.util.Cloneable; /** |
OTHER = -1; /** * Le type des données de l'intervalle. Il s'agit du type * qui sera spécifié aux objets {@link Range} représentant * un intervalle. */ private final Class type; /** * Ce champ a une valeur identique à <code>type</code>, sauf * si <code>elementType</code> est un type primitif. Dans ce * cas, il sera <code>{@link Number}.class</code>. */ private final Class relaxedType; /** * Le type des données utilisé dans le tableau <code>array</code>. * Il s'agira souvent du même type que <code>type</code>, sauf si * ce dernier était le "wrapper" d'un des types primitifs du Java. * Dans ce cas, <code>elementType</code> sera ce type primitif. */ private final Class elementType; |
OTHER = -1; /** * Le type des donn�es de l'intervalle. Il s'agit du type * qui sera sp�cifi� aux objets {@link Range} repr�sentant * un intervalle. */ private final Class type; /** * Ce champ a une valeur identique � <code>type</code>, sauf * si <code>elementType</code> est un type primitif. Dans ce * cas, il sera <code>{@link Number}.class</code>. */ private final Class relaxedType; /** * Le type des donn�es utilis� dans le tableau <code>array</code>. * Il s'agira souvent du m�me type que <code>type</code>, sauf si * ce dernier �tait le "wrapper" d'un des types primitifs du Java. * Dans ce cas, <code>elementType</code> sera ce type primitif. */ private final Class elementType; |
/** * Tableau d'intervalles. Il peut s'agir d'un tableau d'un des types primitifs * du Java (par exemple <code>int[]</code> ou <code>float[]</code>), ou d'un * tableau de type <code>Comparable[]</code>. Les éléments de ce tableau doivent * obligatoirement être en ordre strictement croissant et sans doublon. * <br><br> * La longueur de ce tableau est le double du nombre d'intervalles. Il aurait * été plus efficace d'utiliser une variable séparée (pour ne pas être obligé * d'agrandir ce tableau à chaque ajout d'un intervalle), mais malheureusement * le J2SE 1.4 ne nous fournit pas de méthode <code>Arrays.binarySearch</code> * qui nous permettent de spécifier les limites du tableau (voir RFE #4306897 * à http://developer.java.sun.com/developer/bugParade/bugs/4306897.html). */ private Object array; /** * Compte le nombre de modifications apportées au tableau des intervalles. * Ce comptage sert à vérifier si une modification survient pendant qu'un * itérateur balayait les intervalles. */ private int modCount; |
/** * Tableau d'intervalles. Il peut s'agir d'un tableau d'un des types primitifs * du Java (par exemple <code>int[]</code> ou <code>float[]</code>), ou d'un * tableau de type <code>Comparable[]</code>. Les �l�ments de ce tableau doivent * obligatoirement �tre en ordre strictement croissant et sans doublon. * <br><br> * La longueur de ce tableau est le double du nombre d'intervalles. Il aurait * �t� plus efficace d'utiliser une variable s�par�e (pour ne pas �tre oblig� * d'agrandir ce tableau � chaque ajout d'un intervalle), mais malheureusement * le J2SE 1.4 ne nous fournit pas de m�thode <code>Arrays.binarySearch</code> * qui nous permettent de sp�cifier les limites du tableau (voir RFE #4306897 * � http://developer.java.sun.com/developer/bugParade/bugs/4306897.html). */ private Object array; /** * Compte le nombre de modifications apport�es au tableau des intervalles. * Ce comptage sert � v�rifier si une modification survient pendant qu'un * it�rateur balayait les intervalles. */ private int modCount; |
int i1; if (i0 < 0) { /* * Si le début de la plage ne correspond pas à une des dates en * mémoire, il faudra l'insérer à quelque part dans le tableau. * Si la date tombe dans une des plages déjà existantes (si son * index est impair), on étend la date de début pour prendre le * début de la plage. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 * ##### ######## ##### ####### |
int i1; if (i0 < 0) { /* * Si le d�but de la plage ne correspond pas � une des dates en * m�moire, il faudra l'ins�rer � quelque part dans le tableau. * Si la date tombe dans une des plages d�j� existantes (si son * index est impair), on �tend la date de d�but pour prendre le * d�but de la plage. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 * ##### ######## ##### ####### |
i1 = binarySearch(upper); } else { /* * Si la date de début ne tombe pas dans une plage déjà * existante, il faut étendre la valeur de début qui se * trouve dans le tableau. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 |
i1 = binarySearch(upper); } else { /* * Si la date de d�but ne tombe pas dans une plage d�j� * existante, il faut �tendre la valeur de d�but qui se * trouve dans le tableau. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 |
} else { /* * Un cas particulier se produit si la nouvelle plage * est à insérer à la fin du tableau. Dans ce cas, on * n'a qu'à agrandir le tableau et écrire les valeurs * directement à la fin. Ce traitement est nécessaire * pour eviter les 'ArrayIndexOutOfBoundsException'. * Un autre cas particulier se produit si la nouvelle * plage est entièrement comprise entre deux plages * déjà existantes. Le même code ci-dessous insèrera * la nouvelle plage à l'index 'i0'. */ modCount++; final Object old = array; |
} else { /* * Un cas particulier se produit si la nouvelle plage * est � ins�rer � la fin du tableau. Dans ce cas, on * n'a qu'� agrandir le tableau et �crire les valeurs * directement � la fin. Ce traitement est n�cessaire * pour eviter les 'ArrayIndexOutOfBoundsException'. * Un autre cas particulier se produit si la nouvelle * plage est enti�rement comprise entre deux plages * d�j� existantes. Le m�me code ci-dessous ins�rera * la nouvelle plage � l'index 'i0'. */ modCount++; final Object old = array; |
i1 = binarySearch(upper); } /* * A ce stade, on est certain que 'i0' est pair et pointe vers le début * de la plage dans le tableau. Fait maintenant le traitement pour 'i1'. */ if (i1 < 0) { /* * Si la date de fin tombe dans une des plages déjà existantes * (si son index est impair), on l'étend pour pendre la fin de * la plage trouvée dans le tableau. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 * ##### ######## ##### ####### |
i1 = binarySearch(upper); } /* * A ce stade, on est certain que 'i0' est pair et pointe vers le d�but * de la plage dans le tableau. Fait maintenant le traitement pour 'i1'. */ if (i1 < 0) { /* * Si la date de fin tombe dans une des plages d�j� existantes * (si son index est impair), on l'�tend pour pendre la fin de * la plage trouv�e dans le tableau. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 * ##### ######## ##### ####### |
upper = (Comparable)Array.get(array, i1); } else { /* * Si la date de fin ne tombe pas dans une plage déjà * existante, il faut étendre la valeur de fin qui se * trouve dans le tableau. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 |
upper = (Comparable)Array.get(array, i1); } else { /* * Si la date de fin ne tombe pas dans une plage d�j� * existante, il faut �tendre la valeur de fin qui se * trouve dans le tableau. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 |
/*
* A ce stade, on est certain que 'i1' est impair et pointe vers la fin
* de la plage dans le tableau. On va maintenant supprimer tout ce qui
* se trouve entre 'i0' et 'i1', à l'exclusion de 'i0' et 'i1'.
*/
assert (i0 & 1)==0 : i0;
assert (i1 & 1)!=0 : i1; |
/*
* A ce stade, on est certain que 'i1' est impair et pointe vers la fin
* de la plage dans le tableau. On va maintenant supprimer tout ce qui
* se trouve entre 'i0' et 'i1', � l'exclusion de 'i0' et 'i1'.
*/
assert (i0 & 1)==0 : i0;
assert (i1 & 1)!=0 : i1; |
if (i0 < 0) { if (((i0 = ~i0) & 1) != 0) { // Attention: c'est ~ et non - /* * Si le début de la plage ne correspond pas à une des dates en mémoire, * il faudra faire un trou à quelque part dans le tableau. Si la date tombe * dans une des plages déjà existantes (si son index est impair), on change * la date de fin de la plage existante. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 |
if (i0 < 0) { if (((i0 = ~i0) & 1) != 0) { // Attention: c'est ~ et non - /* * Si le d�but de la plage ne correspond pas � une des dates en m�moire, * il faudra faire un trou � quelque part dans le tableau. Si la date tombe * dans une des plages d�j� existantes (si son index est impair), on change * la date de fin de la plage existante. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 |
} } else { /* * Si la date de début ne tombe pas dans une plage déjà * existante, il faut prendre la date de fin de la plage * précédente. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 * ##### ######## ##### ####### |
} } else { /* * Si la date de d�but ne tombe pas dans une plage d�j� * existante, il faut prendre la date de fin de la plage * pr�c�dente. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 * ##### ######## ##### ####### |
*/ if (i1 < 0) { /* * Si la date de fin tombe dans une des plages déjà existantes * (si son index est impair), on change la date de début de la * plage existante. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 |
*/ if (i1 < 0) { /* * Si la date de fin tombe dans une des plages d�j� existantes * (si son index est impair), on change la date de d�but de la * plage existante. Visuellement, on fait: * * 0 1 2 3 4 5 6 7 |
Array.set(array, --i1, upper); } else { /* * Si la date de fin ne tombe pas dans une plage déjà existante, il * faudra (plus tard) supprimer les éventuelles plages qui le précède. * * 0 1 2 3 4 5 6 7 * ##### ######## ####### ########### |
Array.set(array, --i1, upper); } else { /* * Si la date de fin ne tombe pas dans une plage d�j� existante, il * faudra (plus tard) supprimer les �ventuelles plages qui le pr�c�de. * * 0 1 2 3 4 5 6 7 * ##### ######## ####### ########### |
i1 &= ~1; } /* * A ce stade, on est certain que 'i1' est pair et pointe vers la début * de la plage dans le tableau. On va maintenant supprimer tout ce qui * se trouve entre 'i0' et 'i1', à l'exclusion de 'i0' et 'i1'. */ assert (i0 & 1) != 0 : i0; assert (i1 & 1) == 0 : i1; |
i1 &= ~1; } /* * A ce stade, on est certain que 'i1' est pair et pointe vers la d�but * de la plage dans le tableau. On va maintenant supprimer tout ce qui * se trouve entre 'i0' et 'i1', � l'exclusion de 'i0' et 'i1'. */ assert (i0 & 1) != 0 : i0; assert (i1 & 1) == 0 : i1; |
} /** * Retourne l'index de l'élément <code>value</code> dans le tableau <code>array</code>. * Cette méthode interprète le tableau <code>array</code> comme un tableau d'un des types * intrinsèques du Java, et appelle la méthode <code>Arrays.binarySearch</code> appropriée. * * @param value The value to search. This value must have been converted with * {@link #toNumber} prior to call this method. |
} /** * Retourne l'index de l'�l�ment <code>value</code> dans le tableau <code>array</code>. * Cette m�thode interpr�te le tableau <code>array</code> comme un tableau d'un des types * intrins�ques du Java, et appelle la m�thode <code>Arrays.binarySearch</code> appropri�e. * * @param value The value to search. This value must have been converted with * {@link #toNumber} prior to call this method. |