@@ -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) }
2927func (t tagSort ) Swap (i , j int ) { t .tags [i ], t .tags [j ] = t .tags [j ], t .tags [i ] }
3028func (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
3337func normalFieldOrder (i , j Tag ) bool { return i < j }
3438
@@ -38,7 +42,7 @@ func (m *FieldMap) init() {
3842
3943func (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
155159func (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
179182func (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
186209func (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
195218func (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
210229func (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 )
0 commit comments