@@ -157,6 +157,113 @@ func fmtInt(buf []byte, v uint64) int {
157
157
return w
158
158
}
159
159
160
+ // EvalBinOp сравнивает два значения или выполняет бинарную операцию
161
+ func (x VMTimeDuration ) EvalBinOp (op VMOperation , y VMOperationer ) (VMValuer , error ) {
162
+ switch op {
163
+ case ADD :
164
+ switch yy := y .(type ) {
165
+ case VMTimeDuration :
166
+ return VMTimeDuration (int64 (x ) + int64 (yy )), nil
167
+ case VMTime :
168
+ return yy .Add (x ), nil
169
+ }
170
+ return VMNil , errors .New ("Операция между значениями невозможна" )
171
+ case SUB :
172
+ switch yy := y .(type ) {
173
+ case VMTimeDuration :
174
+ return VMTimeDuration (int64 (x ) - int64 (yy )), nil
175
+ }
176
+ return VMNil , errors .New ("Операция между значениями невозможна" )
177
+ case MUL :
178
+ switch yy := y .(type ) {
179
+ case VMInt :
180
+ return VMTimeDuration (int64 (x ) * int64 (yy )), nil
181
+ case VMDecimal :
182
+ return VMTimeDuration (yy .Mul (NewVMDecimalFromInt64 (int64 (x ))).Int ()), nil
183
+ case VMTimeDuration :
184
+ return VMTimeDuration (int64 (x ) * int64 (yy )), nil
185
+ }
186
+ return VMNil , errors .New ("Операция между значениями невозможна" )
187
+ case QUO :
188
+ switch yy := y .(type ) {
189
+ case VMTimeDuration :
190
+ return VMTimeDuration (int64 (x ) / int64 (yy )), nil
191
+ }
192
+ return VMNil , errors .New ("Операция между значениями невозможна" )
193
+ case REM :
194
+ switch yy := y .(type ) {
195
+ case VMTimeDuration :
196
+ return VMTimeDuration (int64 (x ) % int64 (yy )), nil
197
+ }
198
+ return VMNil , errors .New ("Операция между значениями невозможна" )
199
+ case EQL :
200
+ switch yy := y .(type ) {
201
+ case VMTimeDuration :
202
+ return VMBool (int64 (x ) == int64 (yy )), nil
203
+ }
204
+ return VMNil , errors .New ("Операция между значениями невозможна" )
205
+ case NEQ :
206
+ switch yy := y .(type ) {
207
+ case VMTimeDuration :
208
+ return VMBool (int64 (x ) != int64 (yy )), nil
209
+ }
210
+ return VMNil , errors .New ("Операция между значениями невозможна" )
211
+ case GTR :
212
+ switch yy := y .(type ) {
213
+ case VMTimeDuration :
214
+ return VMBool (int64 (x ) > int64 (yy )), nil
215
+ }
216
+ return VMNil , errors .New ("Операция между значениями невозможна" )
217
+ case GEQ :
218
+ switch yy := y .(type ) {
219
+ case VMTimeDuration :
220
+ return VMBool (int64 (x ) >= int64 (yy )), nil
221
+ }
222
+ return VMNil , errors .New ("Операция между значениями невозможна" )
223
+ case LSS :
224
+ switch yy := y .(type ) {
225
+ case VMTimeDuration :
226
+ return VMBool (int64 (x ) < int64 (yy )), nil
227
+ }
228
+ return VMNil , errors .New ("Операция между значениями невозможна" )
229
+ case LEQ :
230
+ switch yy := y .(type ) {
231
+ case VMTimeDuration :
232
+ return VMBool (int64 (x ) <= int64 (yy )), nil
233
+ }
234
+ return VMNil , errors .New ("Операция между значениями невозможна" )
235
+ case OR :
236
+ return VMNil , errors .New ("Операция между значениями невозможна" )
237
+ case LOR :
238
+ return VMNil , errors .New ("Операция между значениями невозможна" )
239
+ case AND :
240
+ return VMNil , errors .New ("Операция между значениями невозможна" )
241
+ case LAND :
242
+ return VMNil , errors .New ("Операция между значениями невозможна" )
243
+ case POW :
244
+ return VMNil , errors .New ("Операция между значениями невозможна" )
245
+ case SHR :
246
+ return VMNil , errors .New ("Операция между значениями невозможна" )
247
+ case SHL :
248
+ return VMNil , errors .New ("Операция между значениями невозможна" )
249
+ }
250
+ return VMNil , errors .New ("Неизвестная операция" )
251
+ }
252
+
253
+ func (x VMTimeDuration ) ConvertToType (nt reflect.Type ) (VMValuer , error ) {
254
+ switch nt {
255
+ case ReflectVMString :
256
+ return VMString (x .String ()), nil
257
+ case ReflectVMInt :
258
+ return VMInt (int64 (x )), nil
259
+ case ReflectVMTimeDuration :
260
+ return x , nil
261
+ case ReflectVMDecimal :
262
+ return NewVMDecimalFromInt64 (int64 (x )), nil
263
+ }
264
+ return VMNil , errors .New ("Приведение к типу невозможно" )
265
+ }
266
+
160
267
func (x VMTimeDuration ) MarshalBinary () ([]byte , error ) {
161
268
var buf bytes.Buffer
162
269
binary .Write (& buf , binary .LittleEndian , int64 (x ))
0 commit comments