This commit is contained in:
2023-06-10 18:35:56 +02:00
parent a30da61419
commit ceff0161c6
5 changed files with 91 additions and 16 deletions

View File

@@ -7,19 +7,56 @@ import (
"strings"
)
func (c *Coll[TData]) init() {
func (c *Coll[TData]) EnsureInitializedReflection(v TData) {
c.dataTypeMap = make(map[string]fullTypeRef[TData])
if !c.isInterfaceDataType {
return // only dynamically load dataTypeMap on interface TData
}
rval := reflect.ValueOf(v)
for rval.Type().Kind() == reflect.Pointer {
rval = rval.Elem()
}
if _, ok := c.implDataTypeMap[rval.Type()]; ok {
return // already loaded
}
m := make(map[string]fullTypeRef)
c.initFields("", rval, m, make([]int, 0))
c.implDataTypeMap[rval.Type()] = m
}
func (c *Coll[TData]) init() {
example := *new(TData)
v := reflect.ValueOf(example)
datatype := reflect.TypeOf(&example).Elem()
c.initFields("", v, make([]int, 0))
if datatype.Kind() == reflect.Interface {
c.isInterfaceDataType = true
c.dataTypeMap = make(map[string]fullTypeRef)
c.implDataTypeMap = make(map[reflect.Type]map[string]fullTypeRef)
} else {
c.isInterfaceDataType = false
c.dataTypeMap = make(map[string]fullTypeRef)
c.implDataTypeMap = make(map[reflect.Type]map[string]fullTypeRef)
v := reflect.ValueOf(example)
c.initFields("", v, c.dataTypeMap, make([]int, 0))
}
}
func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, idxarr []int) {
func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, m map[string]fullTypeRef, idxarr []int) {
rtyp := rval.Type()
@@ -50,7 +87,7 @@ func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, idxarr []int
if rvfield.Type().Kind() == reflect.Pointer {
c.dataTypeMap[fullKey] = fullTypeRef[TData]{
m[fullKey] = fullTypeRef{
IsPointer: true,
RealType: rvfield.Type(),
Kind: rvfield.Type().Elem().Kind(),
@@ -62,7 +99,7 @@ func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, idxarr []int
} else {
c.dataTypeMap[fullKey] = fullTypeRef[TData]{
m[fullKey] = fullTypeRef{
IsPointer: false,
RealType: rvfield.Type(),
Kind: rvfield.Type().Kind(),
@@ -75,7 +112,7 @@ func (c *Coll[TData]) initFields(prefix string, rval reflect.Value, idxarr []int
}
if rvfield.Kind() == reflect.Struct {
c.initFields(fullKey+".", rvfield, newIdxArr)
c.initFields(fullKey+".", rvfield, m, newIdxArr)
}
}
@@ -102,7 +139,7 @@ func (c *Coll[TData]) getFieldValueAsTokenString(entity TData, fieldName string)
}
func (c *Coll[TData]) getFieldType(fieldName string) fullTypeRef[TData] {
func (c *Coll[TData]) getFieldType(fieldName string) fullTypeRef {
return c.dataTypeMap[fieldName]
}