param-values.ts 9.31 KiB
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 } }