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);
                }
            }
        }
예제 #4
0
            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));
            }
예제 #5
0
        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);
예제 #10
0
 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));
 }