mirror of
https://codeberg.org/superseriousbusiness/gotosocial.git
synced 2024-12-27 19:38:26 +03:00
68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
|
package internal
|
||
|
|
||
|
import "reflect"
|
||
|
|
||
|
var ifaceType = reflect.TypeOf((*interface{})(nil)).Elem()
|
||
|
|
||
|
type MapKey struct {
|
||
|
iface interface{}
|
||
|
}
|
||
|
|
||
|
func NewMapKey(is []interface{}) MapKey {
|
||
|
return MapKey{
|
||
|
iface: newMapKey(is),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func newMapKey(is []interface{}) interface{} {
|
||
|
switch len(is) {
|
||
|
case 1:
|
||
|
ptr := new([1]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
case 2:
|
||
|
ptr := new([2]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
case 3:
|
||
|
ptr := new([3]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
case 4:
|
||
|
ptr := new([4]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
case 5:
|
||
|
ptr := new([5]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
case 6:
|
||
|
ptr := new([6]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
case 7:
|
||
|
ptr := new([7]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
case 8:
|
||
|
ptr := new([8]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
case 9:
|
||
|
ptr := new([9]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
case 10:
|
||
|
ptr := new([10]interface{})
|
||
|
copy((*ptr)[:], is)
|
||
|
return *ptr
|
||
|
default:
|
||
|
}
|
||
|
|
||
|
at := reflect.New(reflect.ArrayOf(len(is), ifaceType)).Elem()
|
||
|
for i, v := range is {
|
||
|
*(at.Index(i).Addr().Interface().(*interface{})) = v
|
||
|
}
|
||
|
return at.Interface()
|
||
|
}
|