package reflect2
import (
"reflect"
"unsafe"
)
type safeMapType struct {
safeType
}
func (type2 *safeMapType ) Key () Type {
return type2 .safeType .cfg .Type2 (type2 .Type .Key ())
}
func (type2 *safeMapType ) MakeMap (cap int ) interface {} {
ptr := reflect .New (type2 .Type )
ptr .Elem ().Set (reflect .MakeMap (type2 .Type ))
return ptr .Interface ()
}
func (type2 *safeMapType ) UnsafeMakeMap (cap int ) unsafe .Pointer {
panic ("does not support unsafe operation" )
}
func (type2 *safeMapType ) SetIndex (obj interface {}, key interface {}, elem interface {}) {
keyVal := reflect .ValueOf (key )
elemVal := reflect .ValueOf (elem )
val := reflect .ValueOf (obj )
val .Elem ().SetMapIndex (keyVal .Elem (), elemVal .Elem ())
}
func (type2 *safeMapType ) UnsafeSetIndex (obj unsafe .Pointer , key unsafe .Pointer , elem unsafe .Pointer ) {
panic ("does not support unsafe operation" )
}
func (type2 *safeMapType ) TryGetIndex (obj interface {}, key interface {}) (interface {}, bool ) {
keyVal := reflect .ValueOf (key )
if key == nil {
keyVal = reflect .New (type2 .Type .Key ()).Elem ()
}
val := reflect .ValueOf (obj ).MapIndex (keyVal )
if !val .IsValid () {
return nil , false
}
return val .Interface (), true
}
func (type2 *safeMapType ) GetIndex (obj interface {}, key interface {}) interface {} {
val := reflect .ValueOf (obj ).Elem ()
keyVal := reflect .ValueOf (key ).Elem ()
elemVal := val .MapIndex (keyVal )
if !elemVal .IsValid () {
ptr := reflect .New (reflect .PtrTo (val .Type ().Elem ()))
return ptr .Elem ().Interface ()
}
ptr := reflect .New (elemVal .Type ())
ptr .Elem ().Set (elemVal )
return ptr .Interface ()
}
func (type2 *safeMapType ) UnsafeGetIndex (obj unsafe .Pointer , key unsafe .Pointer ) unsafe .Pointer {
panic ("does not support unsafe operation" )
}
func (type2 *safeMapType ) Iterate (obj interface {}) MapIterator {
m := reflect .ValueOf (obj ).Elem ()
return &safeMapIterator {
m : m ,
keys : m .MapKeys (),
}
}
func (type2 *safeMapType ) UnsafeIterate (obj unsafe .Pointer ) MapIterator {
panic ("does not support unsafe operation" )
}
type safeMapIterator struct {
i int
m reflect .Value
keys []reflect .Value
}
func (iter *safeMapIterator ) HasNext () bool {
return iter .i != len (iter .keys )
}
func (iter *safeMapIterator ) Next () (interface {}, interface {}) {
key := iter .keys [iter .i ]
elem := iter .m .MapIndex (key )
iter .i += 1
keyPtr := reflect .New (key .Type ())
keyPtr .Elem ().Set (key )
elemPtr := reflect .New (elem .Type ())
elemPtr .Elem ().Set (elem )
return keyPtr .Interface (), elemPtr .Interface ()
}
func (iter *safeMapIterator ) UnsafeNext () (unsafe .Pointer , unsafe .Pointer ) {
panic ("does not support unsafe operation" )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .