param-base.ts 5.02 KiB
import { DefinedNumber } from "../util/definedvalue";
import { Interval } from "../util/interval";
import { Message, MessageCode } from "../util/message";
import { JalhydObject } from "../jalhyd_object"
import { ParamDomain, ParamDomainValue } from "./param-domain";
import { ParamValues, ParamValueMode } from "./param-values";
import { IReferencedObject, IObjectReference, ObjectReference } from "../value_ref/object_ref";
/**
 * paramètre avec symbole et domaine de définition
// tslint:disable-next-line:max-classes-per-file
export class BaseParam extends JalhydObject implements IObjectReference {
    /**
     * symbole
    private _symbol: string;
    /**
     * domaine de définition
    private _domain: ParamDomain;
    /**
     * valeur(s) prise(s)
    private _paramValues: ParamValues;
    /**
     * implémentation par délégation de IObjectReference
    private _valueRef: ObjectReference;
    constructor(symb: string, d: ParamDomain | ParamDomainValue, val?: number) {
        super();
        this._symbol = symb;
        this._valueRef = new ObjectReference();
        this._paramValues = new ParamValues();
        this._paramValues.setSingleValue(val);
        if (val !== undefined)
            this._paramValues.valueMode = ParamValueMode.SINGLE;
        if (d instanceof ParamDomain) {
            this._domain = d;
        } else {
            this._domain = new ParamDomain(d as ParamDomainValue);
        this.checkValue(val);
    get symbol(): string {
        return this._symbol;
    public getDomain(): ParamDomain {
        return this._domain;
    public get interval(): Interval {
        return this._domain.interval;
    public get paramValues(): ParamValues {
        return this._paramValues;
    /**
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
* gestion de la valeur */ public get isDefined(): boolean { return this._paramValues.isDefined; } public getValue(): number { if (!this._paramValues.isDefined) { const e = new Message(MessageCode.ERROR_PARAMDEF_VALUE_UNDEFINED); e.extraVar.symbol = this.symbol; throw e; } switch (this.valueMode) { case ParamValueMode.SINGLE: return this._paramValues.singleValue; case ParamValueMode.LINK: return this._valueRef.referencedValues[0]; default: throw new Error(`mode de valeur ${ParamValueMode[this.valueMode]} invalide`); } } public setValue(val: number) { this.checkValue(val); this._paramValues.setSingleValue(val); } public get uncheckedValue(): number { return this._paramValues.uncheckedValue; } public checkValue(v: number) { const sDomain = ParamDomainValue[this._domain.domain]; switch (this._domain.domain) { case ParamDomainValue.ANY: break; case ParamDomainValue.POS: if (v <= 0) { const f = new Message(MessageCode.ERROR_PARAMDEF_VALUE_POS); f.extraVar.symbol = this.symbol; f.extraVar.value = v; throw f; } break; case ParamDomainValue.POS_NULL: if (v < 0) { const f = new Message(MessageCode.ERROR_PARAMDEF_VALUE_POSNULL); f.extraVar.symbol = this.symbol; f.extraVar.value = v; throw f; } break; case ParamDomainValue.NOT_NULL: if (v === 0) { const f = new Message(MessageCode.ERROR_PARAMDEF_VALUE_NULL); f.extraVar.symbol = this.symbol; throw f; } break; case ParamDomainValue.INTERVAL: const min = this._domain.minValue;
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
const max = this._domain.maxValue; if (v < min || v > max) { const f = new Message(MessageCode.ERROR_PARAMDEF_VALUE_INTERVAL); f.extraVar.symbol = this.symbol; f.extraVar.value = v; f.extraVar.minValue = min; f.extraVar.maxValue = max; throw f; } break; default: const e = new Message(MessageCode.ERROR_PARAMDOMAIN_INVALID); e.extraVar.symbol = this.symbol; e.extraVar.domain = sDomain; throw e; } } public get valueMode() { return this._paramValues.valueMode; } // interface IObjectReference public defineReference(target: IReferencedObject, desc: string) { this.paramValues.valueMode = ParamValueMode.LINK; this._valueRef.defineReference(target, desc); } /** * valeurs de l'objet IReferencedObject référencé */ public get referencedValues(): number[] { return this._valueRef.referencedValues; } }