62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
|
package meta
|
||
|
|
||
|
const (
|
||
|
FieldsMaskCapacity = 4
|
||
|
FieldsMaskItemBitSize = 64
|
||
|
)
|
||
|
|
||
|
func MakeFieldsMaskFromInt64(v int64) FieldsMask {
|
||
|
var mask FieldsMask
|
||
|
mask.SetItemFromInt64(0, v)
|
||
|
|
||
|
return mask
|
||
|
}
|
||
|
|
||
|
type FieldsMaskItem uint64
|
||
|
|
||
|
func (fmi FieldsMaskItem) FieldIsDirty(index uint64) bool {
|
||
|
return (1<<index)&fmi != 0
|
||
|
}
|
||
|
|
||
|
type FieldsMask struct {
|
||
|
masks [FieldsMaskCapacity]FieldsMaskItem
|
||
|
}
|
||
|
|
||
|
func (fm *FieldsMask) SetItemFromUint64(index int, value uint64) {
|
||
|
fm.masks[index] = FieldsMaskItem(value)
|
||
|
}
|
||
|
|
||
|
func (fm *FieldsMask) SetItemFromInt64(index int, value int64) {
|
||
|
fm.masks[index] = FieldsMaskItem(value)
|
||
|
}
|
||
|
|
||
|
func (fm FieldsMask) FieldChanged(index uint64) bool {
|
||
|
itemIndex := fm.itemIndex(index)
|
||
|
maskIndex := fm.maskIndex(index)
|
||
|
mask := fm.masks[itemIndex]
|
||
|
return mask.FieldIsDirty(maskIndex)
|
||
|
}
|
||
|
|
||
|
func (fm *FieldsMask) SetFieldChanged(index uint64) {
|
||
|
itemIndex := fm.itemIndex(index)
|
||
|
maskIndex := fm.maskIndex(index)
|
||
|
fm.masks[itemIndex] |= (1 << maskIndex)
|
||
|
}
|
||
|
|
||
|
func (fm FieldsMask) IsFilled() bool {
|
||
|
for _, mask := range fm.masks {
|
||
|
if mask > 0 {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func (fm FieldsMask) itemIndex(index uint64) uint64 {
|
||
|
return index / FieldsMaskItemBitSize
|
||
|
}
|
||
|
|
||
|
func (fm FieldsMask) maskIndex(index uint64) uint64 {
|
||
|
return index % FieldsMaskItemBitSize
|
||
|
}
|