@@ -183,8 +183,11 @@ func (g *BuildersGenerator) generateStructBuilderFile(typ *concepts.Type) error
183183 Packages (g .packages ).
184184 Package (pkgName ).
185185 File (fileName ).
186+ Function ("fieldIndex" , g .types .FieldIndex ).
186187 Function ("bitMask" , g .types .BitMask ).
188+ Function ("fieldSetType" , g .types .FieldSetType ).
187189 Function ("bitmapType" , g .types .BitmapType ).
190+ Function ("fieldSetSize" , g .types .FieldSetSize ).
188191 Function ("builderCtor" , g .builderCtor ).
189192 Function ("builderName" , g .builderName ).
190193 Function ("fieldName" , g .fieldName ).
@@ -213,11 +216,11 @@ func (g *BuildersGenerator) generateStructBuilderSource(typ *concepts.Type) {
213216 {{ $builderCtor := builderCtor .Type }}
214217 {{ $objectName := objectName .Type }}
215218
216- // {{ $builderName }} contains the data and logic needed to build '{{ .Type.Name }}' objects.
219+
217220 //
218221 {{ lineComment .Type.Doc }}
219222 type {{ $builderName }} struct {
220- bitmap_ {{ bitmapType .Type }}
223+ fieldSet_ {{ fieldSetType .Type }}
221224 {{ if .Type.IsClass }}
222225 id string
223226 href string
@@ -236,45 +239,61 @@ func (g *BuildersGenerator) generateStructBuilderSource(typ *concepts.Type) {
236239
237240 // {{ $builderCtor }} creates a new builder of '{{ .Type.Name }}' objects.
238241 func {{ $builderCtor }}() *{{ $builderName }} {
239- return &{{ $builderName }}{}
242+ return &{{ $builderName }}{
243+ fieldSet_: make([]bool, {{ fieldSetSize .Type }}),
244+ }
240245 }
241246
242247 {{ if .Type.IsClass }}
243248 // Link sets the flag that indicates if this is a link.
244249 func (b *{{ $builderName }}) Link(value bool) *{{ $builderName }} {
245- b.bitmap_ |= 1
250+ b.fieldSet_[0] = true
246251 return b
247252 }
248253
249254 // ID sets the identifier of the object.
250255 func (b *{{ $builderName }}) ID(value string) *{{ $builderName }} {
251256 b.id = value
252- b.bitmap_ |= 2
257+ b.fieldSet_[1] = true
253258 return b
254259 }
255260
256261 // HREF sets the link to the object.
257262 func (b *{{ $builderName }}) HREF(value string) *{{ $builderName }} {
258263 b.href = value
259- b.bitmap_ |= 4
264+ b.fieldSet_[2] = true
260265 return b
261266 }
262267 {{ end }}
263268
264269 // Empty returns true if the builder is empty, i.e. no attribute has a value.
265270 func (b *{{ $builderName }}) Empty() bool {
271+ if b == nil || len(b.fieldSet_) == 0 {
272+ return true
273+ }
266274 {{ if .Type.IsClass }}
267- return b == nil || b.bitmap_&^1 == 0
275+ // Check all fields except the link flag (index 0)
276+ for i := 1; i < len(b.fieldSet_); i++ {
277+ if b.fieldSet_[i] {
278+ return false
279+ }
280+ }
281+ return true
268282 {{ else }}
269- return b == nil || b.bitmap_ == 0
283+ for _, set := range b.fieldSet_ {
284+ if set {
285+ return false
286+ }
287+ }
288+ return true
270289 {{ end }}
271290 }
272291
273292 {{ range .Type.Attributes }}
274293 {{ $fieldName := fieldName . }}
275294 {{ $setterName := setterName . }}
276295 {{ $setterType := setterType . }}
277- {{ $fieldMask := bitMask . }}
296+ {{ $fieldIndex := fieldIndex . }}
278297 {{ $selectorType := selectorType . }}
279298
280299 {{ if .Type.IsList }}
@@ -284,7 +303,7 @@ func (g *BuildersGenerator) generateStructBuilderSource(typ *concepts.Type) {
284303 {{ if .Link }}
285304 func (b *{{ $builderName }}) {{ $setterName }}(value {{ $setterType }}) *{{ $builderName }} {
286305 b.{{ $fieldName }} = value
287- b.bitmap_ |= {{ $fieldMask }}
306+ b.fieldSet_[ {{ $fieldIndex }}] = true
288307 return b
289308 }
290309 {{ else }}
@@ -293,15 +312,15 @@ func (g *BuildersGenerator) generateStructBuilderSource(typ *concepts.Type) {
293312 func (b *{{ $builderName }}) {{ $setterName }}(values ...{{ $elementType }}) *{{ $builderName }} {
294313 b.{{ $fieldName }} = make([]{{ $elementType }}, len(values))
295314 copy(b.{{ $fieldName }}, values)
296- b.bitmap_ |= {{ $fieldMask }}
315+ b.fieldSet_[ {{ $fieldIndex }}] = true
297316 return b
298317 }
299318 {{ else }}
300319 {{ $elementBuilderName := builderName .Type.Element }}
301320 func (b *{{ $builderName }}) {{ $setterName }}(values ...*{{ selectorType . }}{{ $elementBuilderName }}) *{{ $builderName }} {
302321 b.{{ $fieldName }} = make([]*{{ selectorType . }}{{ $elementBuilderName }}, len(values))
303322 copy(b.{{ $fieldName }}, values)
304- b.bitmap_ |= {{ $fieldMask }}
323+ b.fieldSet_[ {{ $fieldIndex }}] = true
305324 return b
306325 }
307326 {{ end }}
@@ -313,12 +332,12 @@ func (g *BuildersGenerator) generateStructBuilderSource(typ *concepts.Type) {
313332 func (b *{{ $builderName }}) {{ $setterName }}(value {{ $setterType }}) *{{ $builderName }} {
314333 b.{{ $fieldName }} = value
315334 {{ if .Type.IsScalar }}
316- b.bitmap_ |= {{ $fieldMask }}
335+ b.fieldSet_[ {{ $fieldIndex }}] = true
317336 {{ else }}
318337 if value != nil {
319- b.bitmap_ |= {{ $fieldMask }}
338+ b.fieldSet_[ {{ $fieldIndex }}] = true
320339 } else {
321- b.bitmap_ &^= {{ $fieldMask }}
340+ b.fieldSet_[ {{ $fieldIndex }}] = false
322341 }
323342 {{ end }}
324343 return b
@@ -331,7 +350,10 @@ func (g *BuildersGenerator) generateStructBuilderSource(typ *concepts.Type) {
331350 if object == nil {
332351 return b
333352 }
334- b.bitmap_ = object.bitmap_
353+ if len(object.fieldSet_) > 0 {
354+ b.fieldSet_ = make([]bool, len(object.fieldSet_))
355+ copy(b.fieldSet_, object.fieldSet_)
356+ }
335357 {{ if .Type.IsClass }}
336358 b.id = object.id
337359 b.href = object.href
@@ -394,7 +416,10 @@ func (g *BuildersGenerator) generateStructBuilderSource(typ *concepts.Type) {
394416 object.id = b.id
395417 object.href = b.href
396418 {{ end }}
397- object.bitmap_ = b.bitmap_
419+ if len(b.fieldSet_) > 0 {
420+ object.fieldSet_ = make([]bool, len(b.fieldSet_))
421+ copy(object.fieldSet_, b.fieldSet_)
422+ }
398423 {{ range .Type.Attributes }}
399424 {{ $fieldName := fieldName . }}
400425 {{ $fieldType := fieldType . }}
0 commit comments