Skip to content

Commit

Permalink
duration
Browse files Browse the repository at this point in the history
  • Loading branch information
covrom committed Oct 1, 2017
1 parent 0adad9b commit e9a4021
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 454 deletions.
2 changes: 0 additions & 2 deletions core/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,6 @@ func Import(env *Env) *Env {
return errors.New("Должно быть число секунд (допустимо с дробной частью)")
}))

// TODO: добавить операции по умножению длительностей VMTimeDuration на числа VMNumberer.Decimal

env.DefineS("длительностьнаносекунды", VMNanosecond)
env.DefineS("длительностьмикросекунды", VMMicrosecond)
env.DefineS("длительностьмиллисекунды", VMMillisecond)
Expand Down
107 changes: 107 additions & 0 deletions core/coretime.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,113 @@ func fmtInt(buf []byte, v uint64) int {
return w
}

// EvalBinOp сравнивает два значения или выполняет бинарную операцию
func (x VMTimeDuration) EvalBinOp(op VMOperation, y VMOperationer) (VMValuer, error) {
switch op {
case ADD:
switch yy := y.(type) {
case VMTimeDuration:
return VMTimeDuration(int64(x) + int64(yy)), nil
case VMTime:
return yy.Add(x), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case SUB:
switch yy := y.(type) {
case VMTimeDuration:
return VMTimeDuration(int64(x) - int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case MUL:
switch yy := y.(type) {
case VMInt:
return VMTimeDuration(int64(x) * int64(yy)), nil
case VMDecimal:
return VMTimeDuration(yy.Mul(NewVMDecimalFromInt64(int64(x))).Int()), nil
case VMTimeDuration:
return VMTimeDuration(int64(x) * int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case QUO:
switch yy := y.(type) {
case VMTimeDuration:
return VMTimeDuration(int64(x) / int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case REM:
switch yy := y.(type) {
case VMTimeDuration:
return VMTimeDuration(int64(x) % int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case EQL:
switch yy := y.(type) {
case VMTimeDuration:
return VMBool(int64(x) == int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case NEQ:
switch yy := y.(type) {
case VMTimeDuration:
return VMBool(int64(x) != int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case GTR:
switch yy := y.(type) {
case VMTimeDuration:
return VMBool(int64(x) > int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case GEQ:
switch yy := y.(type) {
case VMTimeDuration:
return VMBool(int64(x) >= int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case LSS:
switch yy := y.(type) {
case VMTimeDuration:
return VMBool(int64(x) < int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case LEQ:
switch yy := y.(type) {
case VMTimeDuration:
return VMBool(int64(x) <= int64(yy)), nil
}
return VMNil, errors.New("Операция между значениями невозможна")
case OR:
return VMNil, errors.New("Операция между значениями невозможна")
case LOR:
return VMNil, errors.New("Операция между значениями невозможна")
case AND:
return VMNil, errors.New("Операция между значениями невозможна")
case LAND:
return VMNil, errors.New("Операция между значениями невозможна")
case POW:
return VMNil, errors.New("Операция между значениями невозможна")
case SHR:
return VMNil, errors.New("Операция между значениями невозможна")
case SHL:
return VMNil, errors.New("Операция между значениями невозможна")
}
return VMNil, errors.New("Неизвестная операция")
}

func (x VMTimeDuration) ConvertToType(nt reflect.Type) (VMValuer, error) {
switch nt {
case ReflectVMString:
return VMString(x.String()), nil
case ReflectVMInt:
return VMInt(int64(x)), nil
case ReflectVMTimeDuration:
return x, nil
case ReflectVMDecimal:
return NewVMDecimalFromInt64(int64(x)), nil
}
return VMNil, errors.New("Приведение к типу невозможно")
}

func (x VMTimeDuration) MarshalBinary() ([]byte, error) {
var buf bytes.Buffer
binary.Write(&buf, binary.LittleEndian, int64(x))
Expand Down
5 changes: 3 additions & 2 deletions main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,10 @@ func TestRun(t *testing.T) {
# массив с вложенным массивом со структурой и датой
а=[2, 1, [3, {"привет":2, "а":1}, Дата("2017-08-17T09:23:00+03:00")], 4]
а[2][1].а=Дата("2017-08-17T09:23:00+03:00")
Сообщить("Исходное:", а, а[2][1].а)
а[2][1].а=Дата("2017-08-17T09:23:00+03:00")+ДлительностьДня*5
# приведение массива или структуры к типу "строка" означает сериализацию в json, со всеми вложенными массивами и структурами
Сообщить(а, а[2][1].а)
Сообщить("Измененное:", а, а[2][1].а)
Сообщить(Строка(а))
Сообщить("Ключи в порядке сортировки:", Ключи(а[2][1]))
# приведение строки к массиву или структуре означает десериализацию из json
Expand Down
Loading

0 comments on commit e9a4021

Please sign in to comment.