Files
go-mc/nbt/typeinfo.go
2019-07-16 23:28:02 +08:00

49 lines
860 B
Go

package nbt
import (
"reflect"
"sync"
)
type typeInfo struct {
tagName string
nameToIndex map[string]int
}
var tInfoMap sync.Map
func getTypeInfo(typ reflect.Type) *typeInfo {
if ti, ok := tInfoMap.Load(typ); ok {
return ti.(*typeInfo)
}
tInfo := new(typeInfo)
tInfo.nameToIndex = make(map[string]int)
if typ.Kind() == reflect.Struct {
n := typ.NumField()
for i := 0; i < n; i++ {
f := typ.Field(i)
tag := f.Tag.Get("nbt")
if (f.PkgPath != "" && !f.Anonymous) || tag == "-" {
continue // Private field
}
tInfo.nameToIndex[tag] = i
if _, ok := tInfo.nameToIndex[f.Name]; !ok {
tInfo.nameToIndex[f.Name] = i
}
}
}
ti, _ := tInfoMap.LoadOrStore(typ, tInfo)
return ti.(*typeInfo)
}
func (t *typeInfo) findIndexByName(name string) int {
i, ok := t.nameToIndex[name]
if !ok {
return -1
}
return i
}