Skip to content

Commit 28a80ab

Browse files
authored
Merge pull request #428 from Ektaros/no-for-loop
Remove for loop from getFieldPathForName
2 parents b70c827 + b8a4f97 commit 28a80ab

File tree

2 files changed

+34
-11
lines changed

2 files changed

+34
-11
lines changed

pkg/demoinfocs/sendtables2/parser.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ func (p *Parser) ParsePacket(b []byte) error {
210210
}
211211

212212
// add the field to the serializer
213-
serializer.fields = append(serializer.fields, fields[i])
213+
serializer.addField(fields[i])
214214
}
215215

216216
// store the serializer for field reference

pkg/demoinfocs/sendtables2/serializer.go

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@ import (
55
"strings"
66
)
77

8+
type fieldIndex struct {
9+
index int
10+
field *field
11+
}
12+
813
type serializer struct {
9-
name string
10-
version int32
11-
fields []*field
14+
name string
15+
version int32
16+
fields []*field
17+
fieldIndexes map[string]*fieldIndex
1218
}
1319

1420
func (s *serializer) id() string {
@@ -36,15 +42,18 @@ func (s *serializer) getFieldForFieldPath(fp *fieldPath, pos int) *field {
3642
}
3743

3844
func (s *serializer) getFieldPathForName(fp *fieldPath, name string) bool {
39-
for i, f := range s.fields {
40-
if name == f.varName {
41-
fp.path[fp.last] = i
42-
return true
43-
}
45+
if s.fieldIndexes[name] != nil {
46+
fp.path[fp.last] = s.fieldIndexes[name].index
47+
return true
48+
}
4449

45-
if strings.HasPrefix(name, f.varName+".") {
46-
fp.path[fp.last] = i
50+
dotIndex := strings.Index(name, ".")
51+
if dotIndex != -1 {
52+
nameBeforeDot := name[:dotIndex]
53+
if s.fieldIndexes[nameBeforeDot] != nil {
54+
fp.path[fp.last] = s.fieldIndexes[nameBeforeDot].index
4755
fp.last++
56+
f := s.fieldIndexes[nameBeforeDot].field
4857
return f.getFieldPathForName(fp, name[len(f.varName)+1:])
4958
}
5059
}
@@ -64,3 +73,17 @@ func (s *serializer) getFieldPaths(fp *fieldPath, state *fieldState) []*fieldPat
6473
func serializerId(name string, version int32) string {
6574
return fmt.Sprintf("%s(%d)", name, version)
6675
}
76+
77+
func (s *serializer) addField(f *field) {
78+
newFieldIndex := len(s.fields)
79+
s.fields = append(s.fields, f)
80+
81+
if s.fieldIndexes == nil {
82+
s.fieldIndexes = make(map[string]*fieldIndex)
83+
}
84+
85+
s.fieldIndexes[f.varName] = &fieldIndex{
86+
index: newFieldIndex,
87+
field: f,
88+
}
89+
}

0 commit comments

Comments
 (0)