An error occurred while loading the file. Please try again.
-
Grand Francois authored4d7e35ed
import { Pair } from "../util/pair"
import { DefinedNumber } from "../util/definedvalue";
/**
* mode de génération des valeurs
*/
export enum ParamValueMode {
/**
* valeur unique
*/
SINGLE,
/**
* min, max, pas
*/
MINMAX,
/**
* liste de valeurs discrètes
*/
LISTE,
/**
* la valeur du paramètre est non définie et à calculer
*/
CALCUL
}
/**
* itérateur sur les (ou la) valeurs prises par le paramètre
*/
export class ParamValueIterator implements IterableIterator<number> {
/**
* paramètre à itérer
*/
private _param: ParamValues;
/**
* true si les valeurs sont fournies de max à min (ParamValueMode.MINMAX)
*/
private _reverse: boolean;
private _index: number;
/**
* cas de figure :
* 0 : valeur fixée
* 1 : min/max/pas
* 2 : liste de valeurs
*/
private _config: number;
constructor(prm: ParamValues, reverse: boolean = false) {
this._param = prm;
this.reset(reverse)
}
public reset(reverse: boolean) {
this._reverse = reverse;
switch (this._param.valueMode) {
case ParamValueMode.SINGLE:
this._config = 0;
this._index = 0;
break;
case ParamValueMode.MINMAX:
this._config = 1;
if (reverse)
this._index = this._param.max;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
else
this._index = this._param.min;
break;
case ParamValueMode.LISTE:
this._config = 2;
this._index = 0;
break;
default:
throw new Error(`ParamValueIterator : mode de génération de valeurs ${ParamValueMode[this._param.valueMode]} incorrect`);
}
}
public get hasNext(): boolean {
switch (this._config) {
// valeur fixée
case 0:
return this._index == 0;
// min/max
case 1:
const end = this._reverse ? this._index < this._param.min : this._index > this._param.max;
return !end;
// liste
case 2:
return this._index < this._param.valueList.length;
default:
throw new Error(`ParamValueIterator.hasNext() : erreur interne`);
}
}
public next(): IteratorResult<number> {
switch (this._config) {
// valeur fixée
case 0:
if (this.hasNext) {
this._index++;
return {
done: false,
value: this._param.singleValue
};
}
else
return {
done: true,
value: undefined
};
// min/max
case 1:
const res = this._index;
if (this.hasNext) {
if (this._reverse)
this._index -= this._param.step;
else
this._index += this._param.step;
return {
done: false,
value: res
};
} else {
return {
done: true,
value: undefined
};
}
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
// liste
case 2:
const i = this._index;
if (this.hasNext) {
const res = this._param.valueList[this._index++];
return {
done: false,
value: res
};
} else {
return {
done: true,
value: undefined
};
}
default:
throw new Error(`ParamValueIterator.next() : erreur interne`);
}
}
// public get current(): number {
// if (this._config == 1)
// return this._index;
// throw new Error(`appel ParamValueIterator.current() invalide`)
// }
// interface IterableIterator
public [Symbol.iterator](): IterableIterator<number> {
return this;
}
}
export class ParamValues {
/**
* 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[];
/**
* itérateur courant
*/
private _iterator: ParamValueIterator;
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
constructor() {
this._singleValue = new DefinedNumber();
this.valueMode = ParamValueMode.CALCUL;
}
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;
} else {
this.valueMode = ParamValueMode.MINMAX;
this._minValue = o as number;
this._maxValue = max;
this._stepValue = step;
}
}
else if (Array.isArray(o)) {
this.valueMode = ParamValueMode.LISTE;
this._valueList = o;
}
else
throw new Error(`ParamValues.setValues() : appel invalide`);
}
public get valueMode() {
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 get singleValue() {
return this._singleValue.value;
}
public get uncheckedValue() {
return this._singleValue.uncheckedValue;
}
public set singleValue(v: number) {
this._singleValue.value = v;
this.valueMode = ParamValueMode.SINGLE;
}
public get isDefined() {
return this._singleValue.isDefined;
}
public get min() {
return this._minValue;
}
public set min(v: number) {
this._minValue = v;
this.valueMode = ParamValueMode.MINMAX;
}
public get max() {
return this._maxValue;
}
public set max(v: number) {
this._maxValue = v;
281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
this.valueMode = ParamValueMode.MINMAX;
}
public get stepRefValue(): Pair {
this.checkValueMode(ParamValueMode.MINMAX);
return new Pair(1e-9, this._maxValue - this._minValue);
}
public get step() {
this.checkValueMode(ParamValueMode.MINMAX);
return this._stepValue;
}
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:
break;
default:
throw new Error(`ParamValues : mode de valeurs ${ParamValueMode[this._valueMode]} incorrect`);
}
this._iterator = this.getValuesIterator(reverse);
}
/**
* @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._singleValue.value = this._iterator.next().value;
return this._singleValue.value;
}
/**
351352353354355356357358359360361362363
* copie des membres
*/
public copyMembers(n: ParamValues) {
n._valueMode = this.valueMode;
n._singleValue = new DefinedNumber(this._singleValue.value);
n._minValue = this._minValue;
n._maxValue = this._maxValue;
n._stepValue = this._stepValue;
if (this._valueList != undefined)
n._valueList = this._valueList.slice(0); // copie
}
}