74 lines
1.4 KiB
Go
74 lines
1.4 KiB
Go
package meta
|
|
|
|
const (
|
|
FieldsMaskCapacity = 4
|
|
FieldsMaskPartBitSize = 64
|
|
)
|
|
|
|
func MakeFieldsMaskFromInt64(v int64) FieldsMask {
|
|
var mask FieldsMask
|
|
mask.SetPartFromInt64(0, v)
|
|
|
|
return mask
|
|
}
|
|
|
|
type FieldsMaskPart uint64
|
|
|
|
func (part FieldsMaskPart) FieldIsDirty(index uint64) bool {
|
|
return (1<<index)&part != 0
|
|
}
|
|
|
|
type FieldsMask struct {
|
|
parts [FieldsMaskCapacity]FieldsMaskPart
|
|
}
|
|
|
|
func (fm *FieldsMask) SetPartFromUint64(index int, value uint64) {
|
|
fm.parts[index] = FieldsMaskPart(value)
|
|
}
|
|
|
|
func (fm *FieldsMask) SetPartFromInt64(index int, value int64) {
|
|
fm.parts[index] = FieldsMaskPart(value)
|
|
}
|
|
|
|
func (fm FieldsMask) FieldChanged(index uint64) bool {
|
|
partIndex := fm.partIndex(index)
|
|
fieldIndex := fm.fieldIndex(index)
|
|
part := fm.parts[partIndex]
|
|
return part.FieldIsDirty(fieldIndex)
|
|
}
|
|
|
|
func (fm *FieldsMask) SetFieldChanged(index uint64) {
|
|
partIndex := fm.partIndex(index)
|
|
fieldIndex := fm.fieldIndex(index)
|
|
fm.parts[partIndex] |= (1 << fieldIndex)
|
|
}
|
|
|
|
func (fm FieldsMask) IsFilled() bool {
|
|
for _, mask := range fm.parts {
|
|
if mask > 0 {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (fm *FieldsMask) Reset() {
|
|
for i := range fm.parts {
|
|
fm.parts[i] = 0
|
|
}
|
|
}
|
|
|
|
func (fm *FieldsMask) SetChangedAll() {
|
|
for i := range fm.parts {
|
|
fm.parts[i] = 1<<64 - 1
|
|
}
|
|
}
|
|
|
|
func (fm FieldsMask) partIndex(index uint64) uint64 {
|
|
return index / FieldsMaskPartBitSize
|
|
}
|
|
|
|
func (fm FieldsMask) fieldIndex(index uint64) uint64 {
|
|
return index % FieldsMaskPartBitSize
|
|
}
|