diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-01-30 23:00:11 -0700 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-01-30 23:00:11 -0700 |
commit | 5d5ac549dc1a25963418fda4b20ed181b7afd8d2 (patch) | |
tree | 8c5c2e9f5bd1c3a2208efe4d11965ecaa95472ec /struct.go | |
parent | 005dfe26e308b965c2f42c81d34a4b48757414a3 (diff) | |
parent | ccf8dc4b21bb1a547f118affab22bca3a02df270 (diff) |
Merge branch 'lukeshu/tune'
Diffstat (limited to 'struct.go')
-rw-r--r-- | struct.go | 14 |
1 files changed, 13 insertions, 1 deletions
@@ -7,6 +7,8 @@ package lowmemjson import ( "reflect" + "git.lukeshu.com/go/typedsync" + "git.lukeshu.com/go/lowmemjson/internal" ) @@ -25,9 +27,19 @@ type structIndex struct { byName map[string]int } +var structIndexCache typedsync.CacheMap[reflect.Type, structIndex] + // indexStruct takes a struct Type, and indexes its fields for use by -// Decoder.Decode() and Encoder.Encode(). +// Decoder.Decode() and Encoder.Encode(). indexStruct caches its +// results. func indexStruct(typ reflect.Type) structIndex { + ret, _ := structIndexCache.LoadOrCompute(typ, indexStructReal) + return ret +} + +// indexStructReal is like indexStruct, but is the real indexer, +// bypassing the cache. +func indexStructReal(typ reflect.Type) structIndex { var byPos []structField byName := make(map[string][]int) |