Skip to content

Commit 00fa1b5

Browse files
committed
todos
1 parent e9a4021 commit 00fa1b5

File tree

3 files changed

+174
-386
lines changed

3 files changed

+174
-386
lines changed

bincode/binfuncs.go

Lines changed: 0 additions & 378 deletions
Original file line numberDiff line numberDiff line change
@@ -40,381 +40,3 @@ func LeftRightBounds(rb, re int, vlen int) (ii, ij int) {
4040
return
4141
}
4242

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

Comments
 (0)