protected virtual bool RegisterSubKeyPosition(ISubKeyMask <T> subKeyMask) { if (IsSubKeyPosition(subKeyMask)) { return(false); } AddSubKeyPosition(subKeyMask); return(true); }
protected override void AddPartial(K key) { int i = 0; foreach (T subKey in key) { ISubKeyMask <T> subKeyMask = subKey.ToSubKeyMask(i++); partMap.Add(subKeyMask, key); RegisterSubKeyPosition(subKeyMask); } }
protected override void DeletePartial(K key) { int i = 0; foreach (T subKey in key) { ISubKeyMask <T> subKeyMask = subKey.ToSubKeyMask(i++); if (partMap.Remove(subKeyMask, key, out bool removedEntireKey) && removedEntireKey) { RemoveSubKeyPosition(subKeyMask, out bool removedEntireSubKey); } } }
public override bool Equals(ISubKeyMask <T> x, ISubKeyMask <T> y) { if (ReferenceEquals(x, null)) { return(false); } if (ReferenceEquals(x, y)) { return(true); } return((x.Position == y.Position) && SubKeyComparer.Equals(x.SubKey, y.SubKey)); }
public bool Equals(ISubKeyMask <T> other) { if (ReferenceEquals(other, null)) { return(false); } if (ReferenceEquals(this, other)) { return(true); } return((Position == other.Position) && Equals(SubKey, other.SubKey)); }
//protected virtual IEqualityComparer<T> OriginalSubKeyComparer => (subKeyComparer as SubKeyMaskComparer<T>).SubKeyComparer; protected override bool AddSubKeyPosition(ISubKeyMask <T> subKeyMask) { if (subKeyPositions.TryGetValue(subKeyMask.SubKey, out IBitList positionMask)) { positionMask.Set(subKeyMask.Position, true); return(false); } else { positionMask = new BitList(subKeyMask.Position); positionMask.Set(subKeyMask.Position, true); subKeyPositions.Add(subKeyMask.SubKey, positionMask); return(true); } }
protected override bool RemoveSubKeyPosition(ISubKeyMask <T> subKeyMask, out bool removedEntireSubKey) { removedEntireSubKey = false; if (subKeyPositions.TryGetValue(subKeyMask.SubKey, out var positionMask)) { positionMask.Set(subKeyMask.Position, false); if (positionMask.CountTrue == 0) { subKeyPositions.Remove(subKeyMask.SubKey); removedEntireSubKey = true; } return(true); } return(false); }
protected abstract bool IsSubKeyPosition(ISubKeyMask <T> subKeyMask);
protected abstract bool RemoveSubKeyPosition(ISubKeyMask <T> subKeyMask, out bool removedEntireSubKey);
public override int GetHashCode(ISubKeyMask <T> obj) { return(ShiftAndWrap(obj.Position.GetHashCode(), 2) ^ SubKeyComparer.GetHashCode(obj.SubKey)); }
protected override bool IsSubKeyPosition(ISubKeyMask <T> subKeyMask) { return(subKeyPositions.TryGetValue(subKeyMask.SubKey, out var positionMask) && positionMask.TryGet(subKeyMask.Position)); }