forked from EvilBeaver/OneScript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathValueFactory.cs
More file actions
175 lines (147 loc) · 5.28 KB
/
ValueFactory.cs
File metadata and controls
175 lines (147 loc) · 5.28 KB
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*----------------------------------------------------------
This Source Code Form is subject to the terms of the
Mozilla Public License, v.2.0. If a copy of the MPL
was not distributed with this file, You can obtain one
at http://mozilla.org/MPL/2.0/.
----------------------------------------------------------*/
using System;
using System.Diagnostics;
using OneScript.Contexts;
using OneScript.Exceptions;
using OneScript.Execution;
using OneScript.Values;
namespace ScriptEngine.Machine
{
public static class ValueFactory
{
public static IValue Create()
{
return BslUndefinedValue.Instance;
}
public static IValue Create(string value)
{
return BslStringValue.Create(value);
}
public static IValue Create(bool value)
{
return BslBooleanValue.Create(value);
}
public static IValue Create(decimal value)
{
return BslNumericValue.Create(value);
}
public static IValue Create(int value)
{
return BslNumericValue.Create(value);
}
public static IValue Create(DateTime value)
{
return BslDateValue.Create(value);
}
public static IValue CreateInvalidValueMarker()
{
return BslSkippedParameterValue.Instance;
}
public static IValue CreateNullValue()
{
return BslNullValue.Instance;
}
public static IValue Parse(string presentation, DataType type)
{
IValue result;
switch (type)
{
case DataType.Boolean:
result = BslBooleanValue.Parse(presentation);
break;
case DataType.Date:
result = BslDateValue.Parse(presentation);
break;
case DataType.Number:
result = BslNumericValue.Parse(presentation);
break;
case DataType.String:
result = BslStringValue.Create(presentation);
break;
case DataType.Undefined:
result = BslUndefinedValue.Instance;
break;
case DataType.Null:
if (string.Compare(presentation, "null", StringComparison.OrdinalIgnoreCase) == 0)
result = ValueFactory.CreateNullValue();
else
throw new NotSupportedException("constant type is not supported");
break;
default:
throw new NotSupportedException("constant type is not supported");
}
return result;
}
public static IValue Add(IValue op1, IValue op2, IBslProcess process)
{
// принимаем только RawValue
Debug.Assert(!(op1 is IVariable || op2 is IVariable));
if (op1 is BslStringValue s)
{
return Create(s + ((BslValue)op2).ToString(process));
}
if (op1 is BslDateValue date)
{
return Create(date + op2.AsNumber());
}
// все к числовому типу.
return Create(op1.AsNumber() + op2.AsNumber());
}
public static IValue Sub(IValue op1, IValue op2)
{
// принимаем только RawValue
Debug.Assert(!(op1 is IVariable || op2 is IVariable));
if (op1 is BslNumericValue n)
{
return Create(n - op2.AsNumber());
}
if (op1 is BslDateValue date)
{
if (op2 is BslDateValue d2)
{
return Create(date - d2);
}
return Create(date - op2.AsNumber());
}
// все к числовому типу.
return Create(op1.AsNumber() - op2.AsNumber());
}
public static IValue Mul(IValue op1, IValue op2)
{
// принимаем только RawValue
Debug.Assert(!(op1 is IVariable || op2 is IVariable));
return Create(op1.AsNumber() * op2.AsNumber());
}
public static IValue Div(IValue op1, IValue op2)
{
// принимаем только RawValue
Debug.Assert(!(op1 is IVariable || op2 is IVariable));
if (op2.AsNumber() == 0)
{
throw RuntimeException.DivideByZero();
}
return Create(op1.AsNumber() / op2.AsNumber());
}
public static IValue Mod(IValue op1, IValue op2)
{
// принимаем только RawValue
Debug.Assert(!(op1 is IVariable || op2 is IVariable));
if (op2.AsNumber() == 0)
{
throw RuntimeException.DivideByZero();
}
return Create(op1.AsNumber() % op2.AsNumber());
}
public static IValue Neg(IValue op1)
{
// принимаем только RawValue
Debug.Assert(!(op1 is IVariable));
return Create(op1.AsNumber() * -1);
}
}
}