@@ -40,381 +40,3 @@ func LeftRightBounds(rb, re int, vlen int) (ii, ij int) {
40
40
return
41
41
}
42
42
43
- // func EvalBinOp(op core.VMOperation, lhsV, rhsV reflect.Value) (interface{}, error) {
44
- // // log.Println(OperMapR[op])
45
- // if !lhsV.IsValid() || !rhsV.IsValid() {
46
- // if !rhsV.IsValid() && !rhsV.IsValid() {
47
- // // в обоих значениях nil
48
- // return true, nil
49
- // } else {
50
- // // одно из значений nil, а второе нет
51
- // return false, nil
52
- // }
53
- // }
54
- // lk := lhsV.Kind()
55
- // rk := rhsV.Kind()
56
- // lvi := lhsV.Interface()
57
- // rvi := rhsV.Interface()
58
-
59
- // switch op {
60
-
61
- // // TODO: математика множеств и графов
62
-
63
- // case core.ADD:
64
- // if lk == reflect.String || rk == reflect.String {
65
- // return ToString(lvi) + ToString(rvi), nil
66
- // }
67
- // if (lk == reflect.Array || lk == reflect.Slice) && (rk != reflect.Array && rk != reflect.Slice) {
68
- // return reflect.Append(lhsV, rhsV).Interface(), nil
69
- // }
70
- // if (lk == reflect.Array || lk == reflect.Slice) && (rk == reflect.Array || rk == reflect.Slice) {
71
- // return reflect.AppendSlice(lhsV, rhsV).Interface(), nil
72
- // }
73
- // if lk == reflect.Float64 || rk == reflect.Float64 {
74
- // return ToFloat64(lvi) + ToFloat64(rvi), nil
75
- // }
76
- // if lk == reflect.Struct && rk == reflect.Int64 {
77
- // // проверяем на дату + число
78
- // if lhsV.Type().AssignableTo(core.ReflectVMTime) {
79
- // if rhsV.Type().AssignableTo(reflect.TypeOf(time.Duration(0))) {
80
- // // это Duration
81
- // return time.Time(lvi.(core.VMTime)).Add(time.Duration(rhsV.Int())), nil
82
- // } else {
83
- // // это было число в секундах
84
- // return time.Time(lvi.(core.VMTime)).Add(time.Duration(1e9 * rhsV.Int())), nil
85
- // }
86
- // }
87
- // }
88
- // return ToInt64(lvi) + ToInt64(rvi), nil
89
- // case core.SUB:
90
- // if lk == reflect.Float64 || rk == reflect.Float64 {
91
- // return ToFloat64(lvi) - ToFloat64(rvi), nil
92
- // }
93
- // if lk == reflect.Struct && rk == reflect.Int64 {
94
- // // проверяем на дату + число
95
- // if lhsV.Type().AssignableTo(core.ReflectVMTime) {
96
- // if rhsV.Type().AssignableTo(reflect.TypeOf(time.Duration(0))) {
97
- // // это Duration
98
- // return time.Time(lvi.(core.VMTime)).Add(time.Duration(-rhsV.Int())), nil
99
- // } else {
100
- // // это было число в секундах
101
- // return time.Time(lvi.(core.VMTime)).Add(time.Duration(-1e9 * rhsV.Int())), nil
102
- // }
103
- // }
104
- // }
105
- // if lk == reflect.Struct && rk == reflect.Struct {
106
- // // проверяем на дата - дата
107
- // if lhsV.Type().AssignableTo(core.ReflectVMTime) && rhsV.Type().AssignableTo(core.ReflectVMTime) {
108
- // return time.Time(lvi.(core.VMTime)).Sub(time.Time(rvi.(core.VMTime))), nil
109
- // }
110
- // }
111
- // return ToInt64(lvi) - ToInt64(rvi), nil
112
- // case core.MUL:
113
- // if lk == reflect.String && (rk == reflect.Int || rk == reflect.Int32 || rk == reflect.Int64) {
114
- // return strings.Repeat(ToString(lvi), int(ToInt64(rvi))), nil
115
- // }
116
- // if lk == reflect.Float64 || rk == reflect.Float64 {
117
- // return ToFloat64(lvi) * ToFloat64(rvi), nil
118
- // }
119
- // return ToInt64(lvi) * ToInt64(rvi), nil
120
- // case core.QUO:
121
- // return ToFloat64(lvi) / ToFloat64(rvi), nil
122
- // case core.REM:
123
- // return ToInt64(lvi) % ToInt64(rvi), nil
124
- // case core.EQL:
125
- // return Equal(lvi, rvi), nil
126
- // case core.NEQ:
127
- // return Equal(lvi, rvi) == false, nil
128
- // case core.GTR:
129
- // return ToFloat64(lvi) > ToFloat64(rvi), nil
130
- // case core.GEQ:
131
- // return ToFloat64(lvi) >= ToFloat64(rvi), nil
132
- // case core.LSS:
133
- // return ToFloat64(lvi) < ToFloat64(rvi), nil
134
- // case core.LEQ:
135
- // return ToFloat64(lvi) <= ToFloat64(rvi), nil
136
- // case core.OR:
137
- // return ToInt64(lvi) | ToInt64(rvi), nil
138
- // case core.LOR:
139
- // // if x := ToBool(lvi); x {
140
- // // return x, nil
141
- // // } else {
142
- // // return ToBool(rvi), nil
143
- // // }
144
- // case core.AND:
145
- // return ToInt64(lvi) & ToInt64(rvi), nil
146
- // case core.LAND:
147
- // // if x := ToBool(lvi); x {
148
- // // return ToBool(rvi), nil
149
- // // } else {
150
- // // return x, nil
151
- // // }
152
- // case core.POW:
153
- // if lk == reflect.Float64 {
154
- // return math.Pow(ToFloat64(lvi), ToFloat64(rvi)), nil
155
- // }
156
- // return int64(math.Pow(ToFloat64(lvi), ToFloat64(rvi))), nil
157
- // case core.SHR:
158
- // return ToInt64(lvi) >> uint64(ToInt64(rvi)), nil
159
- // case core.SHL:
160
- // return ToInt64(lvi) << uint64(ToInt64(rvi)), nil
161
- // }
162
- // return nil, fmt.Errorf("Неизвестный оператор")
163
- // }
164
-
165
- // func TypeCastConvert(v interface{}, nt reflect.Type, skipCollections bool) (interface{}, error) {
166
- // rv := reflect.ValueOf(v)
167
- // rvkind := rv.Kind()
168
-
169
- // if skipCollections && (rvkind == reflect.Array || rvkind == reflect.Slice ||
170
- // rvkind == reflect.Map || rvkind == reflect.Struct || rvkind == reflect.Chan) {
171
- // return v, nil
172
- // }
173
- // if rvkind == reflect.Interface || rvkind == reflect.Ptr {
174
- // rv = rv.Elem()
175
- // rvkind = rv.Kind()
176
- // v = rv.Interface()
177
- // }
178
- // // учитываем случай двойной вложенности указателя или интерфейса в указателе
179
- // if rvkind == reflect.Interface || rvkind == reflect.Ptr {
180
- // rv = rv.Elem()
181
- // rvkind = rv.Kind()
182
- // v = rv.Interface()
183
- // }
184
- // if rvkind == nt.Kind() {
185
- // return v, nil
186
- // }
187
-
188
- // switch rvkind {
189
- // case reflect.Array, reflect.Slice:
190
- // switch nt.Kind() {
191
- // case reflect.String:
192
- // // сериализуем в json
193
- // b, err := json.Marshal(v)
194
- // if err != nil {
195
- // return nil, err
196
- // }
197
- // return string(b), nil
198
- // default:
199
- // // преобразуем в такой же слайс, но с типизированными значениями, и копируем их с новым типом
200
- // rs := reflect.MakeSlice(reflect.SliceOf(nt), rv.Len(), rv.Cap())
201
- // for i := 0; i < rv.Len(); i++ {
202
- // iv := rv.Index(i).Interface()
203
- // // конверсия вложенных массивов и структур не производится
204
- // rsi, err := TypeCastConvert(iv, nt, true)
205
- // if err != nil {
206
- // return nil, err
207
- // }
208
- // sv := rs.Index(i)
209
- // if sv.CanSet() {
210
- // sv.Set(reflect.ValueOf(rsi))
211
- // }
212
- // //rs = reflect.Append(rs, rsi)
213
- // }
214
- // return rs.Interface(), nil
215
- // }
216
- // case reflect.Chan:
217
- // // возвращаем новый канал с типизированными значениями и прежним размером буфера
218
- // return reflect.MakeChan(reflect.ChanOf(reflect.BothDir, nt), rv.Cap()).Interface(), nil
219
- // case reflect.Map:
220
- // switch nt.Kind() {
221
- // case reflect.String:
222
- // // сериализуем в json
223
- // b, err := json.Marshal(v)
224
- // if err != nil {
225
- // return nil, err
226
- // }
227
- // return string(b), nil
228
- // case reflect.Struct:
229
- // // для приведения в структурные типы - можно использовать мапу для заполнения полей
230
- // rs := reflect.New(nt) // указатель на новую структуру
231
- // //заполняем экспортируемые неанонимные поля, если их находим в мапе
232
- // for i := 0; i < nt.NumField(); i++ {
233
- // f := nt.Field(i)
234
- // if f.PkgPath == "" && !f.Anonymous {
235
- // setv := reflect.Indirect(rv.MapIndex(reflect.ValueOf(f.Name)))
236
- // if setv.Kind() == reflect.Interface {
237
- // setv = setv.Elem()
238
- // }
239
- // fv := rs.Elem().FieldByName(f.Name)
240
- // if setv.IsValid() && fv.IsValid() && fv.CanSet() {
241
- // if fv.Kind() != setv.Kind() {
242
- // if setv.Type().ConvertibleTo(fv.Type()) {
243
- // setv = setv.Convert(fv.Type())
244
- // } else {
245
- // return nil, fmt.Errorf("Поле структуры имеет другой тип")
246
- // }
247
- // }
248
- // fv.Set(setv)
249
- // }
250
- // }
251
- // }
252
- // return rs.Interface(), nil
253
- // }
254
- // case reflect.String:
255
- // if nt.AssignableTo(core.ReflectVMTime) {
256
- // tt, err := time.Parse(time.RFC3339, rv.String())
257
- // if err == nil {
258
- // return core.VMTime(tt), nil
259
- // } else {
260
- // panic(err)
261
- // }
262
- // }
263
- // switch nt.Kind() {
264
- // case reflect.Float64:
265
- // if rv.Type().ConvertibleTo(nt) {
266
- // return rv.Convert(nt).Interface(), nil
267
- // }
268
- // f, err := strconv.ParseFloat(ToString(v), 64)
269
- // if err == nil {
270
- // return f, nil
271
- // }
272
- // case reflect.Array, reflect.Slice:
273
- // //парсим json из строки и пытаемся получить массив
274
- // var rm core.VMSlice
275
- // if err := json.Unmarshal([]byte(ToString(v)), &rm); err != nil {
276
- // return nil, err
277
- // }
278
- // return rm, nil
279
- // case reflect.Map:
280
- // //парсим json из строки и пытаемся получить мапу
281
- // var rm core.VMStringMap
282
- // if err := json.Unmarshal([]byte(ToString(v)), rm); err != nil {
283
- // return nil, err
284
- // }
285
- // return rm, nil
286
- // case reflect.Struct:
287
- // //парсим json из строки и пытаемся получить указатель на структуру
288
- // rm := reflect.New(nt).Interface()
289
- // if err := json.Unmarshal([]byte(ToString(v)), rm); err != nil {
290
- // return nil, err
291
- // }
292
- // return rm, nil
293
- // case reflect.Int64:
294
- // if rv.Type().ConvertibleTo(nt) {
295
- // return rv.Convert(nt).Interface(), nil
296
- // }
297
- // i, err := strconv.ParseInt(ToString(v), 10, 64)
298
- // if err == nil {
299
- // return i, nil
300
- // }
301
- // f, err := strconv.ParseFloat(ToString(v), 64)
302
- // if err == nil {
303
- // return int64(f), nil
304
- // }
305
- // case reflect.Bool:
306
- // s := strings.ToLower(ToString(v))
307
- // if s == "истина" || s == "true" {
308
- // return true, nil
309
- // }
310
- // if s == "ложь" || s == "false" {
311
- // return false, nil
312
- // }
313
- // if rv.Type().ConvertibleTo(reflect.TypeOf(1.0)) && rv.Convert(reflect.TypeOf(1.0)).Float() > 0.0 {
314
- // return true, nil
315
- // }
316
- // b, err := strconv.ParseBool(s)
317
- // if err == nil {
318
- // return b, nil
319
- // }
320
- // return false, nil
321
- // default:
322
- // if rv.Type().ConvertibleTo(nt) {
323
- // return rv.Convert(nt).Interface(), nil
324
- // }
325
- // }
326
- // case reflect.Bool:
327
- // switch nt.Kind() {
328
- // case reflect.String:
329
- // // if ToBool(v) {
330
- // // return "true", nil // для совместимости с другими платформами
331
- // // } else {
332
- // // return "false", nil // для совместимости с другими платформами
333
- // // }
334
- // case reflect.Int64:
335
- // // if ToBool(v) {
336
- // // return int64(1), nil
337
- // // } else {
338
- // // return int64(0), nil
339
- // // }
340
- // case reflect.Float64:
341
- // // if ToBool(v) {
342
- // // return float64(1.0), nil
343
- // // } else {
344
- // // return float64(0.0), nil
345
- // // }
346
- // }
347
- // case reflect.Float32, reflect.Float64,
348
- // reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
349
- // reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
350
- // // приведение к дате
351
- // if nt.AssignableTo(core.ReflectVMTime) {
352
- // switch rvkind {
353
- // case reflect.Float32, reflect.Float64:
354
- // rti := int64(rv.Float())
355
- // rtins := int64((rv.Float() - float64(rti)) * 1e9)
356
- // return core.VMTime(time.Unix(rti, rtins)), nil
357
- // case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
358
- // reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
359
- // rti := rv.Int()
360
- // return core.VMTime(time.Unix(rti, 0)), nil
361
- // }
362
- // }
363
- // // числа конвертируются стандартно
364
- // switch nt.Kind() {
365
- // case reflect.Bool:
366
- // // return ToBool(v), nil
367
- // default:
368
- // if rv.Type().ConvertibleTo(nt) {
369
- // return rv.Convert(nt).Interface(), nil
370
- // }
371
- // }
372
- // case reflect.Struct:
373
- // t, ok := v.(time.Time)
374
- // if !ok {
375
- // var t2 core.VMTime
376
- // t2, ok = v.(core.VMTime)
377
- // if ok {
378
- // t = time.Time(t2)
379
- // }
380
- // }
381
- // if ok {
382
- // if nt.AssignableTo(core.ReflectVMTime) {
383
- // return core.VMTime(t), nil
384
- // }
385
- // // это дата/время - конвертируем в секунды (целые или с плавающей запятой) или в формат RFC3339
386
- // switch nt.Kind() {
387
- // case reflect.String:
388
- // return t.Format(time.RFC3339), nil
389
- // case reflect.Int64:
390
- // return t.Unix(), nil // до секунд
391
- // case reflect.Float64:
392
- // return float64(t.UnixNano()) / 1e9, nil // после запятой - наносекунды
393
- // }
394
- // } else {
395
- // switch nt.Kind() {
396
- // case reflect.Map:
397
- // // структура может быть приведена в мапу
398
- // rs := make(core.VMStringMap)
399
- // rtyp := rv.Type()
400
- // for i := 0; i < rtyp.NumField(); i++ {
401
- // f := rtyp.Field(i)
402
- // fv := rv.Field(i)
403
- // if f.PkgPath == "" && !f.Anonymous {
404
- // rs[f.Name] = core.ReflectToVMValue(fv)
405
- // }
406
- // }
407
- // return rs, nil
408
- // case reflect.String:
409
- // // сериализуем структуру в json
410
- // b, err := json.Marshal(v)
411
- // if err != nil {
412
- // return nil, err
413
- // }
414
- // return string(b), nil
415
-
416
- // }
417
- // }
418
- // }
419
- // return nil, fmt.Errorf("Приведение типа недопустимо")
420
- // }
0 commit comments