Skip to content

Commit edd73a2

Browse files
author
Chris Busbey
committed
more field map refactoring
1 parent 232221c commit edd73a2

File tree

3 files changed

+48
-31
lines changed

3 files changed

+48
-31
lines changed

field_map.go

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@ type tagValues struct {
1111
tvs []TagValue
1212
}
1313

14-
//FieldMap is a collection of fix fields that make up a fix message.
15-
type FieldMap struct {
16-
tagLookup map[Tag]*tagValues
17-
tagOrder
14+
func (f *tagValues) Tag() Tag {
15+
return f.tvs[0].tag
1816
}
1917

2018
// tagOrder true if tag i should occur before tag j
@@ -29,6 +27,12 @@ func (t tagSort) Len() int { return len(t.tags) }
2927
func (t tagSort) Swap(i, j int) { t.tags[i], t.tags[j] = t.tags[j], t.tags[i] }
3028
func (t tagSort) Less(i, j int) bool { return t.compare(t.tags[i], t.tags[j]) }
3129

30+
//FieldMap is a collection of fix fields that make up a fix message.
31+
type FieldMap struct {
32+
tagLookup map[Tag]*tagValues
33+
tagSort
34+
}
35+
3236
// ascending tags
3337
func normalFieldOrder(i, j Tag) bool { return i < j }
3438

@@ -38,7 +42,7 @@ func (m *FieldMap) init() {
3842

3943
func (m *FieldMap) initWithOrdering(ordering tagOrder) {
4044
m.tagLookup = make(map[Tag]*tagValues)
41-
m.tagOrder = ordering
45+
m.compare = ordering
4246
}
4347

4448
//Tags returns all of the Field Tags in this FieldMap
@@ -153,10 +157,9 @@ func (m FieldMap) GetGroup(parser FieldGroupReader) MessageRejectError {
153157

154158
//SetField sets the field with Tag tag
155159
func (m *FieldMap) SetField(tag Tag, field FieldValueWriter) *FieldMap {
156-
tValues := new(tagValues)
160+
tValues := m.getOrCreate(tag)
157161
tValues.tvs = make([]TagValue, 1)
158162
tValues.tvs[0].init(tag, field.Write())
159-
m.tagLookup[tag] = tValues
160163
return m
161164
}
162165

@@ -177,14 +180,34 @@ func (m *FieldMap) SetString(tag Tag, value string) *FieldMap {
177180

178181
//Clear purges all fields from field map
179182
func (m *FieldMap) Clear() {
183+
m.tags = m.tags[0:0]
180184
for k := range m.tagLookup {
181185
delete(m.tagLookup, k)
182186
}
183187
}
184188

189+
func (m *FieldMap) add(f *tagValues) {
190+
if _, ok := m.tagLookup[f.Tag()]; !ok {
191+
m.tags = append(m.tags, f.Tag())
192+
}
193+
194+
m.tagLookup[f.Tag()] = f
195+
}
196+
197+
func (m *FieldMap) getOrCreate(tag Tag) *tagValues {
198+
if f, ok := m.tagLookup[tag]; ok {
199+
return f
200+
}
201+
202+
f := new(tagValues)
203+
m.tagLookup[tag] = f
204+
m.tags = append(m.tags, tag)
205+
return f
206+
}
207+
185208
//Set is a setter for fields
186209
func (m *FieldMap) Set(field FieldWriter) *FieldMap {
187-
tValues := new(tagValues)
210+
tValues := m.getOrCreate(field.Tag())
188211
tValues.tvs = make([]TagValue, 1)
189212
tValues.tvs[0].init(field.Tag(), field.Write())
190213
m.tagLookup[field.Tag()] = tValues
@@ -193,24 +216,18 @@ func (m *FieldMap) Set(field FieldWriter) *FieldMap {
193216

194217
//SetGroup is a setter specific to group fields
195218
func (m *FieldMap) SetGroup(field FieldGroupWriter) *FieldMap {
196-
m.tagLookup[field.Tag()] = &tagValues{field.Write()}
219+
f := m.getOrCreate(field.Tag())
220+
f.tvs = field.Write()
197221
return m
198222
}
199223

200-
func (m FieldMap) sortedTags() []Tag {
201-
sortedTags := make([]Tag, len(m.tagLookup))
202-
for tag := range m.tagLookup {
203-
sortedTags = append(sortedTags, tag)
204-
}
205-
206-
sort.Sort(tagSort{sortedTags, m.tagOrder})
207-
return sortedTags
224+
func (m *FieldMap) sortedTags() []Tag {
225+
sort.Sort(m)
226+
return m.tags
208227
}
209228

210229
func (m FieldMap) write(buffer *bytes.Buffer) {
211-
tags := m.sortedTags()
212-
213-
for _, tag := range tags {
230+
for _, tag := range m.sortedTags() {
214231
if fields, ok := m.tagLookup[tag]; ok {
215232
for _, tv := range fields.tvs {
216233
buffer.Write(tv.bytes)

message.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,23 +144,23 @@ func ParseMessage(msg *Message, rawMessage *bytes.Buffer) (err error) {
144144
return
145145
}
146146

147-
msg.Header.tagLookup[msg.fields[fieldIndex].tag] = &tagValues{msg.fields[fieldIndex : fieldIndex+1]}
147+
msg.Header.add(&tagValues{msg.fields[fieldIndex : fieldIndex+1]})
148148
fieldIndex++
149149

150150
parsedFieldBytes := &msg.fields[fieldIndex]
151151
if rawBytes, err = extractSpecificField(parsedFieldBytes, tagBodyLength, rawBytes); err != nil {
152152
return
153153
}
154154

155-
msg.Header.tagLookup[parsedFieldBytes.tag] = &tagValues{msg.fields[fieldIndex : fieldIndex+1]}
155+
msg.Header.add(&tagValues{msg.fields[fieldIndex : fieldIndex+1]})
156156
fieldIndex++
157157

158158
parsedFieldBytes = &msg.fields[fieldIndex]
159159
if rawBytes, err = extractSpecificField(parsedFieldBytes, tagMsgType, rawBytes); err != nil {
160160
return
161161
}
162162

163-
msg.Header.tagLookup[parsedFieldBytes.tag] = &tagValues{msg.fields[fieldIndex : fieldIndex+1]}
163+
msg.Header.add(&tagValues{msg.fields[fieldIndex : fieldIndex+1]})
164164
fieldIndex++
165165

166166
trailerBytes := []byte{}
@@ -174,13 +174,13 @@ func ParseMessage(msg *Message, rawMessage *bytes.Buffer) (err error) {
174174

175175
switch {
176176
case parsedFieldBytes.tag.IsHeader():
177-
msg.Header.tagLookup[parsedFieldBytes.tag] = &tagValues{msg.fields[fieldIndex : fieldIndex+1]}
177+
msg.Header.add(&tagValues{msg.fields[fieldIndex : fieldIndex+1]})
178178
case parsedFieldBytes.tag.IsTrailer():
179-
msg.Trailer.tagLookup[parsedFieldBytes.tag] = &tagValues{msg.fields[fieldIndex : fieldIndex+1]}
179+
msg.Trailer.add(&tagValues{msg.fields[fieldIndex : fieldIndex+1]})
180180
default:
181181
foundBody = true
182182
trailerBytes = rawBytes
183-
msg.Body.tagLookup[parsedFieldBytes.tag] = &tagValues{msg.fields[fieldIndex : fieldIndex+1]}
183+
msg.Body.add(&tagValues{msg.fields[fieldIndex : fieldIndex+1]})
184184
}
185185
if parsedFieldBytes.tag == tagCheckSum {
186186
break

session.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,13 @@ func (s *session) waitForInSessionTime() {
8989
}
9090
}
9191

92-
func (s *session) insertSendingTime(header Header) {
92+
func (s *session) insertSendingTime(msg *Message) {
9393
sendingTime := time.Now().UTC()
9494

9595
if s.sessionID.BeginString >= enum.BeginStringFIX42 {
96-
header.SetField(tagSendingTime, FIXUTCTimestamp{Time: sendingTime})
96+
msg.Header.SetField(tagSendingTime, FIXUTCTimestamp{Time: sendingTime})
9797
} else {
98-
header.SetField(tagSendingTime, FIXUTCTimestamp{Time: sendingTime, NoMillis: true})
98+
msg.Header.SetField(tagSendingTime, FIXUTCTimestamp{Time: sendingTime, NoMillis: true})
9999
}
100100
}
101101

@@ -116,7 +116,7 @@ func (s *session) fillDefaultHeader(msg *Message, inReplyTo *Message) {
116116
optionallySetID(msg.Header, tagTargetSubID, s.sessionID.TargetSubID)
117117
optionallySetID(msg.Header, tagTargetLocationID, s.sessionID.TargetLocationID)
118118

119-
s.insertSendingTime(msg.Header)
119+
s.insertSendingTime(msg)
120120

121121
if s.EnableLastMsgSeqNumProcessed {
122122
if inReplyTo != nil {
@@ -189,7 +189,7 @@ func (s *session) resend(msg *Message) bool {
189189
msg.Header.SetField(tagOrigSendingTime, origSendingTime)
190190
}
191191

192-
s.insertSendingTime(msg.Header)
192+
s.insertSendingTime(msg)
193193

194194
return s.application.ToApp(msg, s.sessionID) == nil
195195
}

0 commit comments

Comments
 (0)