///<summary> /// Remove /// removes the key and data object (delete) ///<summary> public bool Remove(object cacheKey, object node) { bool isNodeRemoved = false; try { rwLock.AcquireWriterLock(Timeout.Infinite); RedBlackNodeReference <T> keyNodeReference = (RedBlackNodeReference <T>)node; RedBlackNode <T> keyNode = keyNodeReference.RBReference; if (cacheKey != null && keyNode.Data.Count > 1) { if (keyNode.Data.Contains(cacheKey)) { long initialSize = keyNode.IndexInMemorySize; keyNode.Data.Remove(cacheKey); //_nTrace.error(cacheKey + " removed from the tree"); isNodeRemoved = false; _rbNodeDataSize += keyNode.IndexInMemorySize - initialSize; } } else { if (_typeSize != AttributeTypeSize.Variable) { _rbNodeKeySize -= MemoryUtil.GetTypeSize(_typeSize); } else { _rbNodeKeySize -= MemoryUtil.GetStringSize(keyNode.Key); } _rbNodeDataSize -= keyNode.IndexInMemorySize; Delete(keyNode); isNodeRemoved = true; } } catch (Exception) { throw; } finally { rwLock.ReleaseWriterLock(); } if (isNodeRemoved) { intCount = intCount - 1; } return(isNodeRemoved); }
///<summary> /// Remove /// removes the key and data object (delete) ///<summary> public bool Remove(object cacheKey, object node) { lock (_mutex) { bool isNodeRemoved = false; RedBlackNodeReference <T> keyNodeReference = (RedBlackNodeReference <T>)node; RedBlackNode <T> keyNode = keyNodeReference.RBReference; try { if (cacheKey != null && keyNode.Data.Count > 1) { if (keyNode.Data.Contains(cacheKey)) { long initialSize = keyNode.IndexInMemorySize; keyNode.Data.Remove(cacheKey); isNodeRemoved = false; _rbNodeDataSize += keyNode.IndexInMemorySize - initialSize; } } else { if (_typeSize != AttributeTypeSize.Variable) { _rbNodeKeySize -= MemoryUtil.GetTypeSize(_typeSize); } else { _rbNodeKeySize -= MemoryUtil.GetStringSize(keyNode.Key); } _rbNodeDataSize -= keyNode.IndexInMemorySize; Delete(keyNode); isNodeRemoved = true; } } catch (Exception) { throw; } if (isNodeRemoved) { intCount = intCount - 1; } return(isNodeRemoved); } }
/// <summary> /// Default constructor. /// </summary> public RedBlackNode() { Color = RED; Data = new HashVector(); _rbReference = new RedBlackNodeReference <T>(this); }
///<summary> /// Add /// args: ByVal key As T, ByVal data As Object /// key is object that implements IComparable interface /// performance tip: change to use use int type (such as the hashcode) ///</summary> public object Add(T key, object data) { bool collision = false; RedBlackNodeReference <T> keyNodeRfrnce = null; try { rwLock.AcquireWriterLock(Timeout.Infinite); if (key == null || data == null) { throw (new RedBlackException("RedBlackNode key and data must not be null")); } // traverse tree - find where node belongs int result = 0; // create new node RedBlackNode <T> node = new RedBlackNode <T>(); RedBlackNode <T> temp = rbTree; // grab the rbTree node of the tree while (temp != _sentinelNode) { // find Parent node.Parent = temp; if (key is string) { result = key.ToString().ToLower().CompareTo(temp.Key.ToString().ToLower()); } else { result = key.CompareTo(temp.Key); } if (result == 0) { collision = true; //data with the same key. break; } if (result > 0) { temp = temp.Right; collision = false; } else { temp = temp.Left; collision = false; } } if (collision) { long prevSize = temp.IndexInMemorySize; temp.Insert(data, null); keyNodeRfrnce = temp.RBNodeReference; _rbNodeDataSize += temp.IndexInMemorySize - prevSize; } else { node.Key = key; node.Insert(data, null); node.Left = _sentinelNode; node.Right = _sentinelNode; if (_typeSize != AttributeTypeSize.Variable) { _rbNodeKeySize += MemoryUtil.GetTypeSize(_typeSize); } else { _rbNodeKeySize += MemoryUtil.GetStringSize(key); } _rbNodeDataSize += node.IndexInMemorySize; // insert node into tree starting at parent's location if (node.Parent != null) { if (key is string) { result = node.Key.ToString().ToLower().CompareTo(node.Parent.Key.ToString().ToLower()); } else { result = node.Key.CompareTo(node.Parent.Key); } if (result > 0) { node.Parent.Right = node; } else { node.Parent.Left = node; } } else { rbTree = node; // first node added } RestoreAfterInsert(node); // restore red-black properities lastNodeFound = node; intCount = intCount + 1; keyNodeRfrnce = node.RBNodeReference; } } catch (Exception ex) { } finally { rwLock.ReleaseWriterLock(); } return(keyNodeRfrnce); }
/// <summary> /// Default constructor. /// </summary> public RedBlackNode() { Color = RED; Data = new Hashtable(); _rbReference = new RedBlackNodeReference(this); }