Beispiel #1
0
        public override bool Set(ref KeyWalker key, ref T value, ref CPNode <T> self, CPMode mode)
        {
            CheckValidity();

            if (key.Left > 0)
            {
                int i = key[0] >> 5;
                if (_children[i] != null)
                {
                    CPSNode <T> child  = _children[i];
                    CPNode <T>  child2 = child;
                    _localCount -= child.LocalCount;
                    bool existed = child.Set(ref key, ref value, ref child2, mode | CPMode.FixedStructure);
                    _localCount += child.LocalCount;
                    Debug.Assert(child == child2);
                    return(existed);
                }
                else
                {
                    if ((mode & CPMode.Create) != (CPMode)0)
                    {
                        _children[i] = new CPSNode <T>(ref key, value);
                        _localCount++;
                    }
                    return(false);
                }
            }
            else
            {
                // key.Left == 0
                if (_zlk == NoZLK)
                {
                    if ((mode & CPMode.Create) != (CPMode)0)
                    {
                        _zlk = value;
                        _localCount++;
                    }
                    return(false);
                }
                else
                {
                    T oldValue = (T)_zlk;
                    if ((mode & CPMode.Set) != (CPMode)0)
                    {
                        _zlk = value;
                    }
                    value = oldValue;
                    return(true);
                }
            }
        }
Beispiel #2
0
        private void ConvertToSNode(ref CPNode <T> self)
        {
            Debug.Assert(_localCount <= 32);
            int count = 0;             // debug check

            self = new CPSNode <T>(_localCount);
            for (int i = 0; i < _children.Length; i++)
            {
                if (_children[i] != null)
                {
                    count += _children[i].LocalCount;
                    _children[i].MoveAllTo(self);
                }
            }
            if (_zlk != NoZLK)
            {
                KeyWalker kw    = new KeyWalker(EmptyArray <byte> .Value, 0);
                T         value = (T)_zlk;
                G.Verify(!self.Set(ref kw, ref value, ref self, CPMode.Create));
                count++;
            }
            Debug.Assert(count == _localCount);
        }