/*
* 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
/**
* Classe représentant les unités fondamentales d'un système d'unités.
* Le système international (SI) n'a que quelques unités fondamentales, à partir desquelles
* sont construites toutes les autres unités. Les unités fondamentales sont du système SI sont:
*
*
null
.
*
* @param prefix Liste des préfix pouvant être utilisés avec le symbole
* symbol
, ou null
s'il n'y en a pas.
*
* @return Une unité de base associée à la quantité quantityName
* avec le symbole symbol
et les préfix prefix
.
*
* @see DerivedUnit#getInstance
* @see ScaledUnit#getInstance
* @see OffsetUnit#getInstance
*/
public static BaseUnit getInstance(final String quantityName, final String symbol, final PrefixSet prefix) {
return (BaseUnit) new BaseUnit(quantityName, symbol, prefix).intern();
}
/**
* Retourne le symbole {@link #symbol} sans son préfix. Cette méthode retourne habituellement
* {@link #symbol}, ce qui est correct pour la presque totalité des unités BaseUnit
.
* Dans le système SI, la seule exception notable (qui justifie à elle seule l'existence de cette
* méthode) est le kilogramme (symbole "kg").
*/
String getUnprefixedSymbol() {
return symbol.equals("kg") ? "g" : super.getUnprefixedSymbol();
}
/**
* Renvoie une unité identique à celle-ci, mais
* avec un nouveau symbole et de nouveaux préfix.
*
* @param symbol Nouveau symbole représentant cette unité. Si ce
* paramètre est nul, un symbole par défaut sera créé.
* @param prefix Liste des préfix autorisés pour le symbole.
* @return La même unité, mais avec le nouveau symbole. Peut être
* this
, mais ne sera jamais null
.
*/
public Unit rename(final String symbol, final PrefixSet prefix) { // CAST
return getInstance(quantityName, symbol, prefix);
}
/**
* Élève cette unité à une puissance entière.
*
* @param power La puissance à laquelle élever cette unité.
* @return Les unités résultant de l'élévation des unités
* this
à la puissance power
.
*
* @see #multiply
* @see #divide
* @see #scale
* @see #shift
*/
public Unit pow(final int power) {
switch (power) {
case 0: return DerivedUnit.DIMENSIONLESS;
case 1: return this;
default: return DerivedUnit.getInstance(new Factor[] {Factor.getFactor(this, power)});
}
}
/**
* Multiplie cette unité par une autre unité.
*
* @param that L'unité par laquelle multiplier cette unité.
* @return Le produit de this
par that
.
* @throws UnitException Si l'unité that
est de la
* classe {@link OffsetUnit} ou d'une autre classe invalide.
*
* @see #pow
* @see #divide
* @see #scale
* @see #shift
*/
public Unit multiply(final Unit that) throws UnitException {
return that.inverseMultiply(this);
}
/**
* Multiply a derived unit by a base unit
* (that
*this
).
*/
Unit inverseMultiply(final DerivedUnit that) {
return that.multiply(new Factor[] {Factor.getFactor(this, +1)});
}
/**
* Multiply a base unit by another base unit
* (that
*this
).
*/
Unit inverseMultiply(final BaseUnit that) throws UnitException {
final Factor[] factors;
if (equalsIgnoreSymbol(that)) {
factors=new Factor[] {
Factor.getFactor(that, 2)
};
} else {
factors=new Factor[] {
Factor.getFactor(that, 1),
Factor.getFactor(this, 1)
};
}
return DerivedUnit.getInstance(factors);
}
/**
* Divise cette unité par une autre unité.
*
* @param that L'unité par laquelle diviser cette unité.
* @return Le quotient de this
par that
.
* @throws UnitException Si l'unité that
est de la
* classe {@link OffsetUnit} ou d'une autre classe invalide.
*
* @see #pow
* @see #multiply
* @see #scale
* @see #shift
*/
public Unit divide(final Unit that) throws UnitException {
return that.inverseDivide(this);
}
/**
* Divide a derived unit by a base unit
* (that
/this
).
*/
Unit inverseDivide(final DerivedUnit that) {
return that.multiply(new Factor[] {Factor.getFactor(this, -1)});
}
/**
* Divide a base unit by another base unit
* (that
/this
).
*/
Unit inverseDivide(final BaseUnit that) throws UnitException {
if (!equalsIgnoreSymbol(that)) {
return DerivedUnit.getInstance(new Factor[] {
Factor.getFactor(that, +1),
Factor.getFactor(this, -1)
});
} else {
return DerivedUnit.DIMENSIONLESS;
}
}
/**
* Indique si les unités this
et that
sont compatibles.
* Si elles le sont, alors les méthodes convert
ne lanceront jamais
* d'exception pour ces unités.
*
* @param that Autre unités avec laquelle on veut
* vérifier si ces unités sont compatibles.
* @return true
Si l'on garantie que les méthodes
* convert
ne lanceront pas d'exceptions.
*/
public boolean canConvert(final Unit that) {return that.canConvert(this);} // Do not move in superclass
boolean canConvert(final DerivedUnit that) {return that.canConvert(this);} // Do not move in superclass
boolean canConvert(final BaseUnit that) {return equalsIgnoreSymbol(that);}
/**
* Effectue la conversion d'une mesure exprimée selon d'autres unités. Par
* exemple METRE.convert(1, FOOT)
retournera 0.3048
.
*
* @param value La valeur exprimée selon les autres unités (fromUnit
).
* @param fromUnit Les autres unités.
* @return La valeur convertie selon ces unités (this
).
* @throws UnitException Si les unités ne sont pas compatibles.
*/
public double convert(final double value, final Unit fromUnit) throws UnitException {return fromUnit.inverseConvert(value, this);} // Do not move in superclass
double convert(final double value, final DerivedUnit fromUnit) throws UnitException {return fromUnit.inverseConvert(value, this);} // Do not move in superclass
double convert(final double value, final BaseUnit fromUnit) throws UnitException {if (!equalsIgnoreSymbol(fromUnit)) throw incompatibleUnitsException(fromUnit); return value;}
/**
* Effectue sur-place la conversion de mesures exprimées selon d'autres
* unités. Les valeurs converties remplaceront les anciennes valeurs.
*
* @param values En entré, les valeurs exprimées selon les autres unités
* (fromUnit
). En sortie, les valeurs exprimées selon
* ces unités (this
).
* @param fromUnit Les autres unités.
* @throws UnitException Si les unités ne sont pas compatibles. Dans ce
* cas, aucun élément de values
n'aura été modifié.
*/
public void convert(final double[] values, final Unit fromUnit) throws UnitException {fromUnit.inverseConvert(values, this);} // Do not move in superclass
void convert(final double[] values, final DerivedUnit fromUnit) throws UnitException {fromUnit.inverseConvert(values, this);} // Do not move in superclass
void convert(final double[] values, final BaseUnit fromUnit) throws UnitException {if (!equalsIgnoreSymbol(fromUnit)) throw incompatibleUnitsException(fromUnit);}
/**
* Effectue sur-place la conversion de mesures exprimées selon d'autres
* unités. Les valeurs converties remplaceront les anciennes valeurs.
* Notez que d'importantes erreurs d'arrondissement peuvent survenir
* si fromUnit
est de la classe {@link OffsetUnit}.
*
* @param values En entré, les valeurs exprimées selon les autres
* unités (fromUnit
). En sortie, les valeurs exprimées
* selon ces unités (this
).
* @param fromUnit Les autres unités.
* @throws UnitException Si les unités ne sont pas compatibles. Dans ce
* cas, aucun élément de values
n'aura été modifié.
*/
public void convert(final float[] values, final Unit fromUnit) throws UnitException {fromUnit.inverseConvert(values, this);} // Do not move in superclass
void convert(final float[] values, final DerivedUnit fromUnit) throws UnitException {fromUnit.inverseConvert(values, this);} // Do not move in superclass
void convert(final float[] values, final BaseUnit fromUnit) throws UnitException {if (!equalsIgnoreSymbol(fromUnit)) throw incompatibleUnitsException(fromUnit);}
/**
* Retourne un objet qui saura convertir selon ces unités les valeurs exprimées
* selon d'autres unités. Cette méthode est avantageuse si on prévoie faîre
* plusieurs conversions, car la transformation à utiliser est déterminée une
* fois pour toute.
*
* @param fromUnit Unités à partir de lesquel faire les conversions.
* @return Une transformation des unités fromUnit
* vers les unités this
. Cette méthode ne
* retourne jamais null
.
* @throws UnitException Si les unités ne sont pas compatibles.
*/
public UnitTransform getTransform(final Unit fromUnit) throws UnitException {return fromUnit.getInverseTransform(this);} // Do not move in superclass
UnitTransform getTransform(final DerivedUnit fromUnit) throws UnitException {return fromUnit.getInverseTransform(this);} // Do not move in superclass
UnitTransform getTransform(final BaseUnit fromUnit) throws UnitException {return IdentityTransform.getInstance(fromUnit, this);}
/**
* Convertit une mesure vers d'autre unités. Par exemple
* METRE.inverseConvert(1, FOOT)
retournera
* 3.2808
. Cette méthode est l'inverse de la méthode
* {@link #convert(double,Unit)}.
*
* @param value La valeur exprimée selon ces unités (this
).
* @param toUnit Les autres unités.
* @return La valeur convertie selon les autres unités (toUnit
).
* @throws UnitException Si les unités ne sont pas compatibles.
*/
protected double inverseConvert(final double value, final Unit toUnit) throws UnitException {return toUnit.convert(value, this);} // Do not move in superclass
double inverseConvert(final double value, final DerivedUnit toUnit) throws UnitException {return toUnit.convert(value, this);} // Do not move in superclass
double inverseConvert(final double value, final BaseUnit toUnit) throws UnitException {if (!equalsIgnoreSymbol(toUnit)) throw toUnit.incompatibleUnitsException(this); return value;}
/**
* Effectue sur-place la conversion de mesures vers d'autres unités.
* Les valeurs converties remplaceront les anciennes valeurs. Cette
* méthode est l'inverse de la méthode {@link #convert(double[],Unit)}.
*
* @param values En entré, les valeur exprimées selon ces unités
* (this
). En sortie, les valeurs exprimées
* selon les autres unités (toUnit
).
* @param toUnit Les autres unités.
* @throws UnitException Si les unités ne sont pas compatibles. Dans ce
* cas, aucun élément de values
n'aura été modifié.
*/
protected void inverseConvert(final double[] values, final Unit toUnit) throws UnitException {toUnit.convert(values, this);} // Do not move in superclass
void inverseConvert(final double[] values, final DerivedUnit toUnit) throws UnitException {toUnit.convert(values, this);} // Do not move in superclass
void inverseConvert(final double[] values, final BaseUnit toUnit) throws UnitException {if (!equalsIgnoreSymbol(toUnit)) throw toUnit.incompatibleUnitsException(this);}
/**
* Effectue sur-place la conversion de mesures vers d'autres unités.
* Les valeurs converties remplaceront les anciennes valeurs. Cette
* méthode est l'inverse de la méthode {@link #convert(float[],Unit)}.
*
* @param values En entré, les valeur exprimées selon ces unités
* (this
). En sortie, les valeurs exprimées
* selon les autres unités (toUnit
).
* @param toUnit Les autres unités.
* @throws UnitException Si les unités ne sont pas compatibles. Dans ce
* cas, aucun élément de values
n'aura été modifié.
*/
protected void inverseConvert(final float[] values, final Unit toUnit) throws UnitException {toUnit.convert(values, this);} // Do not move in superclass
void inverseConvert(final float[] values, final DerivedUnit toUnit) throws UnitException {toUnit.convert(values, this);} // Do not move in superclass
void inverseConvert(final float[] values, final BaseUnit toUnit) throws UnitException {if (!equalsIgnoreSymbol(toUnit)) throw toUnit.incompatibleUnitsException(this);}
/**
* Retourne un objet qui saura convertir selon d'autres unités les
* valeurs exprimées selon ces unités. Cette méthode est l'inverse
* de {@link #getTransform}.
*
* @param toUnit Unités vers lesquel faire les conversions.
* @return Une transformation des unités this
* vers les unités toUnit
. Cette méthode
* ne retourne jamais null
.
* @throws UnitException Si les unités ne sont pas compatibles.
*/
protected UnitTransform getInverseTransform(final Unit toUnit) throws UnitException {return toUnit.getTransform(this);} // Do not move in superclass
UnitTransform getInverseTransform(final DerivedUnit toUnit) throws UnitException {return toUnit.getTransform(this);} // Do not move in superclass
UnitTransform getInverseTransform(final BaseUnit toUnit) throws UnitException {return IdentityTransform.getInstance(this, toUnit);}
/**
* Vérifie si cette unité est identique à une autre. Deux unités sont considérés
* identiques s'ils ont le même champ {@link #quantityName}. Des symboles et prefix
* différents sont autorisés.
*/
final boolean equalsIgnoreSymbol(final BaseUnit unit) {
return (unit==this) || quantityName.equals(unit.quantityName);
}
/**
* Indique si deux unités sont égales, en ignorant leurs symboles.
* La comparaison ne prend en compte que les quantités telles que
* retournées par {@link #getQuantityName}.
*/
public boolean equalsIgnoreSymbol(final Unit unit) {
return (unit instanceof BaseUnit) && equalsIgnoreSymbol((BaseUnit) unit);
}
/**
* Retourne un code
* pour cette unité.
*/
public int hashCode() {
return quantityName.hashCode();
}
}