Failed to fetch fork details. Try again later.
-
Delaigue Olivier authoredc91208c6
Forked from
HYCAR-Hydro / airGR
Source project has a limited visibility.
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;
}
}