From 9a6fcdb1f88b2404374708979358529869983c76 Mon Sep 17 00:00:00 2001 From: Evgeniy Kulikov Date: Fri, 12 Apr 2019 14:19:18 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=8C=20hot=20fix=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hrw.go | 45 ++++++++++++++++++--------------------------- hrw_test.go | 11 +++++++++++ 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/hrw.go b/hrw.go index 7e6bce1..9efe654 100644 --- a/hrw.go +++ b/hrw.go @@ -82,89 +82,80 @@ func SortSliceByValue(slice interface{}, hash uint64) { return } - switch val.Index(0).Interface().(type) { - case int: + switch slice := slice.(type) { + case []int: var key = make([]byte, 16) - slice := slice.([]int) for i := 0; i < length; i++ { binary.BigEndian.PutUint64(key, uint64(slice[i])) rule = append(rule, weight(Hash(key), hash)) } - case uint: + case []uint: var key = make([]byte, 16) - slice := slice.([]uint) for i := 0; i < length; i++ { binary.BigEndian.PutUint64(key, uint64(slice[i])) rule = append(rule, weight(Hash(key), hash)) } - case int8: - slice := slice.([]int8) + case []int8: for i := 0; i < length; i++ { key := byte(slice[i]) rule = append(rule, weight(Hash([]byte{key}), hash)) } - case uint8: - slice := slice.([]uint8) + case []uint8: for i := 0; i < length; i++ { key := slice[i] rule = append(rule, weight(Hash([]byte{key}), hash)) } - case int16: + case []int16: var key = make([]byte, 8) - slice := slice.([]int16) for i := 0; i < length; i++ { binary.BigEndian.PutUint16(key, uint16(slice[i])) rule = append(rule, weight(Hash(key), hash)) } - case uint16: + case []uint16: var key = make([]byte, 8) - slice := slice.([]uint16) for i := 0; i < length; i++ { binary.BigEndian.PutUint16(key, slice[i]) rule = append(rule, weight(Hash(key), hash)) } - case int32: + case []int32: var key = make([]byte, 16) - slice := slice.([]int32) for i := 0; i < length; i++ { binary.BigEndian.PutUint32(key, uint32(slice[i])) rule = append(rule, weight(Hash(key), hash)) } - case uint32: + case []uint32: var key = make([]byte, 16) - slice := slice.([]uint32) for i := 0; i < length; i++ { binary.BigEndian.PutUint32(key, slice[i]) rule = append(rule, weight(Hash(key), hash)) } - case int64: + case []int64: var key = make([]byte, 32) - slice := slice.([]int64) for i := 0; i < length; i++ { binary.BigEndian.PutUint64(key, uint64(slice[i])) rule = append(rule, weight(Hash(key), hash)) } - case uint64: + case []uint64: var key = make([]byte, 32) - slice := slice.([]uint64) for i := 0; i < length; i++ { binary.BigEndian.PutUint64(key, slice[i]) rule = append(rule, weight(Hash(key), hash)) } - case string: - slice := slice.([]string) + case []string: for i := 0; i < length; i++ { rule = append(rule, weight(hash, Hash([]byte(slice[i])))) } - case Hasher: + + default: + if _, ok := val.Index(0).Interface().(Hasher); !ok { + return + } + for i := 0; i < length; i++ { h := val.Index(i).Interface().(Hasher) rule = append(rule, weight(hash, h.Hash())) } - - default: - return } rule = SortByWeight(rule, hash) diff --git a/hrw_test.go b/hrw_test.go index 2e2fbbe..5f5a1dd 100644 --- a/hrw_test.go +++ b/hrw_test.go @@ -16,10 +16,16 @@ type ( actual interface{} expect interface{} } + + Uint32Slice []uint32 ) var testKey = []byte("0xff51afd7ed558ccd") +func (p Uint32Slice) Len() int { return len(p) } +func (p Uint32Slice) Less(i, j int) bool { return p[i] < p[j] } +func (p Uint32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + func Example() { // given a set of servers servers := []string{ @@ -188,6 +194,11 @@ func TestSortSliceByValueIntSlice(t *testing.T) { expect: []uint32{1, 3, 5, 4, 2, 0}, }, + { + actual: Uint32Slice{0, 1, 2, 3, 4, 5}, + expect: Uint32Slice{0, 1, 2, 3, 4, 5}, + }, + { actual: []int64{0, 1, 2, 3, 4, 5}, expect: []int64{1, 5, 3, 4, 2, 0},