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); } } }
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); }