-
Notifications
You must be signed in to change notification settings - Fork 16
/
FloatClass.ts
159 lines (123 loc) · 8.56 KB
/
FloatClass.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import { Klass, UnboxableKlass, Visibility } from "../Class.js";
import { Method, Parameterlist, Attribute, Value, Type, PrimitiveType } from "../Types.js";
import { intPrimitiveType, stringPrimitiveType, doublePrimitiveType, floatPrimitiveType, booleanPrimitiveType } from "../PrimitiveTypes.js";
import { RuntimeObject } from "../../../interpreter/RuntimeObject.js";
import { floatToString } from "../../../tools/StringTools.js";
export class FloatClass extends UnboxableKlass {
constructor(baseClass: Klass) {
super("Float", null, "Wrapper-Klasse, um float-Werte in Collections verenden zu können.");
this.baseClass = baseClass;
this.addAttribute(new Attribute("MAX_VALUE", floatPrimitiveType, (value) => { value.value = Number.MAX_VALUE }, true, Visibility.public, true, "Der größte Wert, den eine Variable vom Typ float annehmen kann"));
this.addAttribute(new Attribute("MIN_VALUE", floatPrimitiveType, (value) => { value.value = Number.MIN_VALUE }, true, Visibility.public, true, "Der kleinste Wert, den eine Variable vom Typ float annehmen kann"));
this.addAttribute(new Attribute("NaN_VALUE", floatPrimitiveType, (value) => { value.value = Number.NaN }, true, Visibility.public, true, "Der \"Not a Number\"-Wert vom Typ float"));
this.addAttribute(new Attribute("NEGATIVE_INFINITY", floatPrimitiveType, (value) => { value.value = Number.NEGATIVE_INFINITY }, true, Visibility.public, true, "Der \"negative infinity\"-Wert vom Typ float"));
this.addAttribute(new Attribute("POSITIVE_INFINITY", floatPrimitiveType, (value) => { value.value = Number.POSITIVE_INFINITY }, true, Visibility.public, true, "Der \"positive infinity\"-Wert vom Typ float"));
this.staticClass.setupAttributeIndicesRecursive();
this.staticClass.classObject = new RuntimeObject(this.staticClass);
}
canCastTo(type: Type): boolean {
return this.unboxableAs.indexOf(type) >= 0 || super.canCastTo(type);
}
init() {
this.unboxableAs = [floatPrimitiveType, doublePrimitiveType];
this.addMethod(new Method("Float", new Parameterlist([
{ identifier: "double-value", type: doublePrimitiveType, declaration: null, usagePositions: null, isFinal: true }
]), null,
(parameters) => {
parameters[0].value = parameters[1].value;
}, false, false, "Instanziert ein neues Float-Objekt", true));
this.addMethod(new Method("Float", new Parameterlist([
{ identifier: "int-value", type: intPrimitiveType, declaration: null, usagePositions: null, isFinal: true }
]), null,
(parameters) => {
parameters[0].value = parameters[1].value;
}, false, false, "Instanziert ein neues Float-Objekt", true));
this.addMethod(new Method("Float", new Parameterlist([
{ identifier: "text", type: stringPrimitiveType, declaration: null, usagePositions: null, isFinal: true }
]), null,
(parameters) => {
parameters[0].value = Number.parseFloat(parameters[1].value);
}, false, false, "Instanziert ein neues Float-Objekt, indem die übergebene Zeichenkette in einen float-Wert umgewandelt wird.", true));
this.addMethod(new Method("doubleValue", new Parameterlist([]), doublePrimitiveType,
(parameters) => { return parameters[0].value; }, false, false, "Wandelt das Float-Objekt in einen double-Wert um."));
this.addMethod(new Method("floatValue", new Parameterlist([]), floatPrimitiveType,
(parameters) => { return parameters[0].value; }, false, false, "Wandelt das Float-Objekt in einen float-Wert um."));
this.addMethod(new Method("intValue", new Parameterlist([]), intPrimitiveType,
(parameters) => { return Math.trunc(parameters[0].value); }, false, false, "Wandelt das Float-Objekt durch Abrunden in einen int-Wert um."));
this.addMethod(new Method("compareTo", new Parameterlist([
{ identifier: "anotherFloat", type: this, declaration: null, usagePositions: null, isFinal: true }
]), intPrimitiveType,
(parameters) => {
let v0 = parameters[0].value;
let v1 = parameters[1].value;
if (v0 > v1) return 1;
if (v0 < v1) return -1;
return 0;
}, false, false, "Ist der Wert größer als der übergebene Wert, so wird +1 zurückgegeben. Ist er kleiner, so wird -1 zurückgegeben. Sind die Werte gleich, so wird 0 zurückgegeben."));
this.addMethod(new Method("equals", new Parameterlist([
{ identifier: "anotherFloat", type: this, declaration: null, usagePositions: null, isFinal: true }
]), booleanPrimitiveType,
(parameters) => {
return parameters[0].value == parameters[1].value;
}, false, false, "Gibt genau dann true zurück, wenn der Wert gleich dem übergebenen Wert ist."));
this.addMethod(new Method("toString", new Parameterlist([
]), stringPrimitiveType,
(parameters) => {
return floatToString(parameters[0].value);
}, false, false, "Gibt den Wert des Objekts als String-Wert zurück."));
this.addMethod(new Method("hashCode", new Parameterlist([
]), intPrimitiveType,
(parameters) => {
return Math.trunc(parameters[0].value);
}, false, false, "Gibt den hashCode des Objekts zurück."));
this.addMethod(new Method("parseFloat", new Parameterlist([
{ identifier: "s", type: stringPrimitiveType, declaration: null, usagePositions: null, isFinal: true }
]), floatPrimitiveType,
(parameters) => {
return Number.parseFloat(parameters[1].value);
}, false, true, "Wandelt die Zeichenkette in einen float-Wert um"));
this.addMethod(new Method("toString", new Parameterlist([
{ identifier: "f", type: floatPrimitiveType, declaration: null, usagePositions: null, isFinal: true }
]), stringPrimitiveType,
(parameters) => {
return "" + parameters[1].value;
}, false, true, "Gibt die übergebene Zahl als String-Wert zurück."));
this.addMethod(new Method("valueOf", new Parameterlist([
{ identifier: "f", type: floatPrimitiveType, declaration: null, usagePositions: null, isFinal: true },
]), this,
(parameters) => {
return parameters[1].value;
}, false, true, "Gibt die übergebene Zahl als Float-Objekt zurück."));
this.addMethod(new Method("valueOf", new Parameterlist([
{ identifier: "s", type: stringPrimitiveType, declaration: null, usagePositions: null, isFinal: true },
]), this,
(parameters) => {
return Number.parseFloat(parameters[1].value);
}, false, true, "Interpretiert die übergebene Zeichenkette als Dezimalzahl und gib sie als Float-Objekt zurück."));
this.addMethod(new Method("isNaN", new Parameterlist([
{ identifier: "f", type: floatPrimitiveType, declaration: null, usagePositions: null, isFinal: true },
]), booleanPrimitiveType,
(parameters) => {
return Number.isNaN(parameters[1].value)
}, false, true, "Gibt genau dann true zurück, falls die übergebene float-Zahl NaN (not a Number) ist."));
this.addMethod(new Method("isNaN", new Parameterlist([
]), booleanPrimitiveType,
(parameters) => {
return Number.isNaN(parameters[0].value)
}, false, false, "Gibt genau dann true zurück, falls das Objekt NaN (not a Number) ist."));
this.addMethod(new Method("isInfinite", new Parameterlist([
{ identifier: "f", type: floatPrimitiveType, declaration: null, usagePositions: null, isFinal: true },
]), booleanPrimitiveType,
(parameters) => {
return parameters[1].value == Infinity;
}, false, true, "Gibt genau dann true zurück, falls die übergebene float-Zahl INFINTITY ist."));
this.addMethod(new Method("isInfinite", new Parameterlist([
]), booleanPrimitiveType,
(parameters) => {
return parameters[0].value == Infinity;
}, false, false, "Gibt genau dann true zurück, falls das Objekt INFINITY ist."));
}
public debugOutput(value: Value): string {
return "" + <number>value.value;
}
}