/*
* Units - Temporary implementation for Geotools 2
* Copyright (C) 1998 University Corporation for Atmospheric Research (Unidata)
* 1998 Bill Hibbard & al. (VisAD)
* 1999 Pêches et Océans Canada
* 2000 Institut de Recherche pour le Développement
* 2002 Centre for Computational Geography
*
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details (http://www.gnu.org/).
*
*
* This package is inspired from the units package of VisAD.
* Unidata and Visad's work is fully acknowledged here.
*
* THIS IS A TEMPORARY CLASS
*
* This is a placeholder for future Unit
class.
* This skeleton will be removed when the real classes from
* JSR-108: Units specification will be publicly available.
*/
package org.geotools.units;
// Entrés/sorties
import java.io.ObjectStreamException;
import java.io.Serializable;
import java.util.Arrays;
import org.geotools.util.WeakHashSet;
/**
* Ensemble de préfix. Cette classe maintient une liste d'objets
* {@link Prefix} en ordre croissant et sans doublons, c'est-à-dire qu'elle garanti
* qu'il n'y aura pas deux préfix représentant la même quantité {@link Prefix#amount}.
*
* @version 1.0
* @author Martin Desruisseaux
*
* @deprecated Replaced by the {@link javax.units.Unit} framework.
*/
/*public*/
final class PrefixSet implements Serializable {
/**
* Serial number for interoperability with different versions.
*/
private static final long serialVersionUID = -8301096197856692402L;
/**
* Banque des objets qui ont été précédemment créés et
* enregistrés par un appel à la méthode {@link #intern}.
*/
private static final WeakHashSet pool=Prefix.pool;
/**
* Ensemble de préfix. Les préfix de cet ensemble doivent
* obligatoirement être un ordre croissant et sans doublons.
*/
private final Prefix[] prefix;
/**
* Construit un ensemble de préfix. Le tableau p
* sera copié, puis classé. Les éventuels doublons seront éliminés.
* Le tableau p
original ne sera pas affecté par ces
* traitements.
*/
private PrefixSet(final Prefix[] p) {
final Prefix[] px=new Prefix[p.length];
System.arraycopy(p, 0, px, 0, px.length);
Arrays.sort(px);
int length=px.length;
for (int i=length; --i>=1;) {
if (px[i].amount == px[i-1].amount) {
px[i]=null;
length--;
}
}
int i=0;
prefix=new Prefix[length];
for (int j=0; jp
* sera copié, puis classé. Les éventuels doublons seront éliminés.
* Le tableau p
original ne sera pas affecté par ces
* traitements.
*/
public static PrefixSet getPrefixSet(final Prefix[] p) {
return new PrefixSet(p).intern();
}
/**
* Retourne le préfix représenté par le symbole spéfifié.
* Si aucun préfix ne correspond à ce symbole, retourne
* null
.
*
* @param symbol Symbole du préfix recherché.
* @return Préfix désigné par le symbole symbol
.
*/
public Prefix getPrefix(final String symbol) {
for (int i=0; iamount est inférieur à la plus petite quantité pouvant être représenté
* par un préfix, alors cette méthode retourne null
.
*/
public Prefix getPrefix(double amount) {
amount += 1E-8*Math.abs(amount); // Pour éviter d'éventuelles erreurs d'arrondissements.
int index=Arrays.binarySearch(prefix, new Prefix(amount));
if (index<0) {
index = ~index;
if (index==0) {
return null;
}
if (index>prefix.length) {
index=prefix.length;
}
index--;
}
return prefix[index];
}
/**
* Retourne une chaîne de caractères qui énumère tous les préfix contenu dans
* cet ensemble. La chaîne sera de la forme "milli(m),centi(c),déci(d),kilo(k)"
* par exemple.
*/
public String toString() {
final StringBuffer buffer=new StringBuffer();
for (int i=0; iother
* spécifié. Deux ensembles sont considérés identiques s'ils contienent
* les mêmes préfix.
*/
public boolean equals(final Object other) {
if (other==this) return true; // slight optimisation
if (other instanceof PrefixSet) {
final Prefix[] array = ((PrefixSet) other).prefix;
if (prefix.length == array.length) {
for (int i=0; iPrefixSet. Lorsque la méthode
* intern
est appelée, elle recherchera des préfix égaux à this
au
* sens de la méthode {@link #equals}. Si de tels préfix sont trouvés, ils seront retournés.
* Sinon, les préfix this
seront ajoutés à la banque de données en utilisant une
* {@link java.lang.ref.WeakReference référence faible} et cette méthode retournera this
.
*
* De cette méthode il s'ensuit que pour deux ensembles de préfix u et v,
* la condition u.intern()==v.intern()
sera vrai si et seulement si
* u.equals(v)
est vrai.
*/
private final PrefixSet intern() {
return (PrefixSet) pool.canonicalize(this);
}
/**
* Après la lecture d'une unité, vérifie si ce préfix
* apparaît déjà dans la banque des préfix {@link #PREFIX}.
* Si oui, l'exemplaire de la banque sera retourné plutôt
* que de garder inutilement le préfix courant comme copie.
*/
final Object readResolve() throws ObjectStreamException {
return intern();
}
}