tpl/math: Refactor Mod with cast

It makes the code smaller
This commit is contained in:
Artem Sidorenko
2017-10-30 18:24:51 +01:00
committed by Bjørn Erik Pedersen
parent 488631fe0a
commit 76dc811c65
2 changed files with 18 additions and 20 deletions

View File

@@ -72,21 +72,10 @@ func (ns *Namespace) Log(a interface{}) (float64, error) {
// Mod returns a % b. // Mod returns a % b.
func (ns *Namespace) Mod(a, b interface{}) (int64, error) { func (ns *Namespace) Mod(a, b interface{}) (int64, error) {
av := reflect.ValueOf(a) ai, erra := cast.ToInt64E(a)
bv := reflect.ValueOf(b) bi, errb := cast.ToInt64E(b)
var ai, bi int64
switch av.Kind() { if erra != nil || errb != nil {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
ai = av.Int()
default:
return 0, errors.New("Modulo operator can't be used with non integer value")
}
switch bv.Kind() {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
bi = bv.Int()
default:
return 0, errors.New("Modulo operator can't be used with non integer value") return 0, errors.New("Modulo operator can't be used with non integer value")
} }

View File

@@ -259,13 +259,17 @@ func TestMod(t *testing.T) {
{3, 1, int64(0)}, {3, 1, int64(0)},
{3, 0, false}, {3, 0, false},
{0, 3, int64(0)}, {0, 3, int64(0)},
{3.1, 2, false}, {3.1, 2, int64(1)},
{3, 2.1, false}, {3, 2.1, int64(1)},
{3.1, 2.1, false}, {3.1, 2.1, int64(1)},
{int8(3), int8(2), int64(1)}, {int8(3), int8(2), int64(1)},
{int16(3), int16(2), int64(1)}, {int16(3), int16(2), int64(1)},
{int32(3), int32(2), int64(1)}, {int32(3), int32(2), int64(1)},
{int64(3), int64(2), int64(1)}, {int64(3), int64(2), int64(1)},
{"3", "2", int64(1)},
{"3.1", "2", false},
{"aaa", "0", false},
{"3", "aaa", false},
} { } {
errMsg := fmt.Sprintf("[%d] %v", i, test) errMsg := fmt.Sprintf("[%d] %v", i, test)
@@ -296,9 +300,9 @@ func TestModBool(t *testing.T) {
{3, 1, true}, {3, 1, true},
{3, 0, nil}, {3, 0, nil},
{0, 3, true}, {0, 3, true},
{3.1, 2, nil}, {3.1, 2, false},
{3, 2.1, nil}, {3, 2.1, false},
{3.1, 2.1, nil}, {3.1, 2.1, false},
{int8(3), int8(3), true}, {int8(3), int8(3), true},
{int8(3), int8(2), false}, {int8(3), int8(2), false},
{int16(3), int16(3), true}, {int16(3), int16(3), true},
@@ -307,6 +311,11 @@ func TestModBool(t *testing.T) {
{int32(3), int32(2), false}, {int32(3), int32(2), false},
{int64(3), int64(3), true}, {int64(3), int64(3), true},
{int64(3), int64(2), false}, {int64(3), int64(2), false},
{"3", "3", true},
{"3", "2", false},
{"3.1", "2", nil},
{"aaa", "0", nil},
{"3", "aaa", nil},
} { } {
errMsg := fmt.Sprintf("[%d] %v", i, test) errMsg := fmt.Sprintf("[%d] %v", i, test)