8 type safeMapType struct {
12 func (type2 *safeMapType) Key() Type {
13 return type2.safeType.cfg.Type2(type2.Type.Key())
16 func (type2 *safeMapType) MakeMap(cap int) interface{} {
17 ptr := reflect.New(type2.Type)
18 ptr.Elem().Set(reflect.MakeMap(type2.Type))
19 return ptr.Interface()
22 func (type2 *safeMapType) UnsafeMakeMap(cap int) unsafe.Pointer {
23 panic("does not support unsafe operation")
26 func (type2 *safeMapType) SetIndex(obj interface{}, key interface{}, elem interface{}) {
27 keyVal := reflect.ValueOf(key)
28 elemVal := reflect.ValueOf(elem)
29 val := reflect.ValueOf(obj)
30 val.Elem().SetMapIndex(keyVal.Elem(), elemVal.Elem())
33 func (type2 *safeMapType) UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) {
34 panic("does not support unsafe operation")
37 func (type2 *safeMapType) TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) {
38 keyVal := reflect.ValueOf(key)
40 keyVal = reflect.New(type2.Type.Key()).Elem()
42 val := reflect.ValueOf(obj).MapIndex(keyVal)
46 return val.Interface(), true
49 func (type2 *safeMapType) GetIndex(obj interface{}, key interface{}) interface{} {
50 val := reflect.ValueOf(obj).Elem()
51 keyVal := reflect.ValueOf(key).Elem()
52 elemVal := val.MapIndex(keyVal)
53 if !elemVal.IsValid() {
54 ptr := reflect.New(reflect.PtrTo(val.Type().Elem()))
55 return ptr.Elem().Interface()
57 ptr := reflect.New(elemVal.Type())
58 ptr.Elem().Set(elemVal)
59 return ptr.Interface()
62 func (type2 *safeMapType) UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer {
63 panic("does not support unsafe operation")
66 func (type2 *safeMapType) Iterate(obj interface{}) MapIterator {
67 m := reflect.ValueOf(obj).Elem()
68 return &safeMapIterator{
74 func (type2 *safeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator {
75 panic("does not support unsafe operation")
78 type safeMapIterator struct {
84 func (iter *safeMapIterator) HasNext() bool {
85 return iter.i != len(iter.keys)
88 func (iter *safeMapIterator) Next() (interface{}, interface{}) {
89 key := iter.keys[iter.i]
90 elem := iter.m.MapIndex(key)
92 keyPtr := reflect.New(key.Type())
93 keyPtr.Elem().Set(key)
94 elemPtr := reflect.New(elem.Type())
95 elemPtr.Elem().Set(elem)
96 return keyPtr.Interface(), elemPtr.Interface()
99 func (iter *safeMapIterator) UnsafeNext() (unsafe.Pointer, unsafe.Pointer) {
100 panic("does not support unsafe operation")