RangeSet changes for revisions 10795:10796

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 10795Revision 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.