-
Grand Francois authored
- classe ParamValues : ajout de la notion de valeur courante (_currentValue) indépendante du mode de valeur pour distinguer la valeur en mode SINGLE et la valeur actuelle quand on itère sur les valeurs possibles
a4b5c3a4
import { Pair } from "../util/pair"
import { DefinedNumber } from "../util/definedvalue";
import { IReferencedObject, IObjectReference, ObjectReference } from "../value_ref/object_ref";
import { Result } from "..";
import { ParamValueMode } from "./param-value-mode";
import { ParamValueIterator } from "./param-value-iterator";
export class ParamValues implements IObjectReference {
/**
* mode de génération des valeurs : min/max, liste, ...
*/
private _valueMode: ParamValueMode;
/**
* valeur numérique (éventuellement non définie) dans le mode "valeur unique" (ParamValueMode.SINGLE)
*/
private _singleValue: DefinedNumber;
/**
* valeur min dans le cas ParamValueMode.MINMAX
*/
private _minValue: number = undefined;
/**
* valeur max dans le cas ParamValueMode.MINMAX
*/
private _maxValue: number = undefined;
/**
* pas de progression dans le cas ParamValueMode.MINMAX
*/
private _stepValue: number = undefined;
/**
* liste de valeurs dans le cas ParamValueMode.LISTE
*/
private _valueList: number[];
/**
* valeur courante (éventuellement non définie) indépendemment du mode
*/
private _currentValue: DefinedNumber;
/**
* itérateur courant
*/
private _iterator: ParamValueIterator;
/**
* implémentation par délégation de IObjectReference
*/
private _valueRef: ObjectReference;
constructor() {
this._singleValue = new DefinedNumber();
this._currentValue = new DefinedNumber();
this._valueRef = new ObjectReference();
}
public setValues(o: number | any, max?: number, step?: number) {
if (typeof (o) === "number") {
if (max == undefined) {
this._valueMode = ParamValueMode.SINGLE;
this._singleValue.value = o as number;
this._currentValue.value = o as number;
} else {
this._valueMode = ParamValueMode.MINMAX;
this._minValue = o as number;
this._maxValue = max;
this._stepValue = step;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
this._currentValue.undefine();
}
}
else if (Array.isArray(o)) {
this._valueMode = ParamValueMode.LISTE;
this._valueList = o;
this._currentValue.undefine();
}
else
throw new Error(`ParamValues.setValues() : appel invalide`);
}
public get valueMode() {
switch (this._valueMode) {
case ParamValueMode.LINK:
return this.referencedParamValues.valueMode;
default:
return this._valueMode;
}
}
public set valueMode(m: ParamValueMode) {
this._valueMode = m;
}
private checkValueMode(expected: ParamValueMode) {
if (this._valueMode != expected)
throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[expected]} incorrect`);
}
public check() {
switch (this._valueMode) {
case ParamValueMode.SINGLE:
if (!this._singleValue.isDefined)
throw new Error(`ParamValues : valeur fixe non définie`);
break;
case ParamValueMode.MINMAX:
if (this._minValue == undefined)
throw new Error(`ParamValues : valeur min non définie`);
if (this._maxValue == undefined)
throw new Error(`ParamValues : valeur max non définie`);
if (this._stepValue == undefined)
throw new Error(`ParamValues : valeur du pas non définie`);
if (this._minValue > this._maxValue)
throw new Error(`ParamValues : min > max`);
break;
case ParamValueMode.LISTE:
if (this._valueList == undefined)
throw new Error(`ParamValues : liste de valeurs non définie`);
break;
case ParamValueMode.LINK:
case ParamValueMode.CALCUL:
break;
default:
throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[this._valueMode]} incorrect`);
}
}
/**
* valeur courante
*/
public get currentValue(): number {
if (this.isReferenceDefined)
return this._valueRef.referencedParamValues.currentValue;
return this._currentValue.value;
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
}
/**
* valeur dans le mode SINGLE
*/
public get singleValue(): number {
if (this.isReferenceDefined)
return this._valueRef.referencedParamValues.singleValue;
return this._singleValue.value;
}
public get uncheckedValue() {
return this._singleValue.uncheckedValue;
}
public setSingleValue(v: number) {
this._valueMode = ParamValueMode.SINGLE;
this._singleValue.value = v;
this._currentValue.value = v;
}
public get isDefined() {
return this._singleValue.isDefined;
}
public get min() {
switch (this._valueMode) {
case ParamValueMode.MINMAX:
return this._minValue;
case ParamValueMode.LINK:
return this._valueRef.referencedParamValues.min;
default:
this.checkValueMode(ParamValueMode.MINMAX); // pour générer une erreur
return undefined; // pour le compilo
}
}
public set min(v: number) {
this._minValue = v;
this._valueMode = ParamValueMode.MINMAX;
}
public get max() {
switch (this._valueMode) {
case ParamValueMode.MINMAX:
return this._maxValue;
case ParamValueMode.LINK:
return this._valueRef.referencedParamValues.max;
default:
this.checkValueMode(ParamValueMode.MINMAX);
return undefined; // pour le compilo
}
}
public set max(v: number) {
this._maxValue = v;
this._valueMode = ParamValueMode.MINMAX;
}
public get stepRefValue(): Pair {
this.checkValueMode(ParamValueMode.MINMAX);
return new Pair(1e-9, this._maxValue - this._minValue);
}
public get step() {
switch (this._valueMode) {
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
case ParamValueMode.MINMAX:
return this._stepValue;
case ParamValueMode.LINK:
return this._valueRef.referencedParamValues.step;
default:
this.checkValueMode(ParamValueMode.MINMAX); // pour générer une erreur
return undefined; // pour le compilo
}
}
public set step(v: number) {
this._stepValue = v;
this._valueMode = ParamValueMode.MINMAX;
}
public get valueList() {
this.checkValueMode(ParamValueMode.LISTE);
return this._valueList;
}
public set valueList(l: number[]) {
this._valueList = l;
this._valueMode = ParamValueMode.LISTE;
}
/**
* crée un iterateur
* @param reverse true si on veut itérer max->min ou depuis la fin de la liste
*/
public getValuesIterator(reverse: boolean = false): ParamValueIterator {
return new ParamValueIterator(this, reverse);
}
/**
*
* @param reverse prépare un itérateur pour parcourir les valeurs
*/
public initIterator(reverse: boolean = false) {
switch (this._valueMode) {
case ParamValueMode.LISTE:
case ParamValueMode.MINMAX:
this._iterator = this.getValuesIterator(reverse);
break;
case ParamValueMode.LINK:
this._iterator = this._valueRef.referencedParamValues.getValuesIterator(reverse);
break;
default:
throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[this._valueMode]} incorrect`);
}
}
/**
* @return true si il reste des valeurs à parcourir par l'itérateur courant
*/
public get hasNext(): boolean {
return this._iterator.hasNext;
}
/**
* fixe la valeur courante à la prochaine valeur à parcourir par l'itérateur courant
* @return prochaine valeur à parcourir par l'itérateur courant
*/
public get next(): number {
this._currentValue.value = this._iterator.next().value;
return this._currentValue.value;
}
281282283284285286287288289290291292293294295296297298299300301
// interface IObjectReference
public defineReference(target: IReferencedObject, desc: string) {
this.valueMode = ParamValueMode.LINK;
this._valueRef.defineReference(target, desc);
}
public get isReferenceDefined(): boolean {
return this._valueRef.isReferenceDefined;
}
public get referencedParamValues(): ParamValues {
return this._valueRef.referencedParamValues;
}
public get referencedResult(): Result {
return this._valueRef.referencedResult;
}
}