private bool FindNext(SegmentedDictionaryNode node, ContextItem <int, SegmentedDictionaryNode> curContext) { bool flag = false; while (!flag && curContext.Key < node.Entries.Length) { ISegmentedDictionaryEntry segmentedDictionaryEntry = node.Entries[curContext.Key]; if (segmentedDictionaryEntry != null) { switch (segmentedDictionaryEntry.EntryType) { case SegmentedDictionaryEntryType.Node: { SegmentedDictionaryNode value = segmentedDictionaryEntry as SegmentedDictionaryNode; m_context.Push(new ContextItem <int, SegmentedDictionaryNode>(0, value)); flag = FindNext(); break; } case SegmentedDictionaryEntryType.Values: { SegmentedDictionaryValues segmentedDictionaryValues = segmentedDictionaryEntry as SegmentedDictionaryValues; if (m_currentValueIndex < segmentedDictionaryValues.Count) { m_currentPair = new KeyValuePair <TKey, TValue>(segmentedDictionaryValues.Keys[m_currentValueIndex], segmentedDictionaryValues.Values[m_currentValueIndex]); m_currentValueIndex++; return(true); } m_currentValueIndex = 0; break; } default: Global.Tracer.Assert(condition: false, "Unknown ObjectType"); break; } } curContext.Key++; } if (!flag) { m_currentValueIndex = 0; m_context.Pop(); } return(flag); }
private bool Find(SegmentedDictionaryNode node, int hashCode, TKey key, int level, out TValue value) { value = default(TValue); bool result = false; int num = HashToSlot(node, hashCode, level); ISegmentedDictionaryEntry segmentedDictionaryEntry = node.Entries[num]; if (segmentedDictionaryEntry != null) { switch (segmentedDictionaryEntry.EntryType) { case SegmentedDictionaryEntryType.Node: { SegmentedDictionaryNode node2 = segmentedDictionaryEntry as SegmentedDictionaryNode; result = Find(node2, hashCode, key, level + 1, out value); break; } case SegmentedDictionaryEntryType.Values: { SegmentedDictionaryValues segmentedDictionaryValues = segmentedDictionaryEntry as SegmentedDictionaryValues; for (int i = 0; i < segmentedDictionaryValues.Count; i++) { if (m_comparer.Equals(key, segmentedDictionaryValues.Keys[i])) { value = segmentedDictionaryValues.Values[i]; return(true); } } break; } default: Global.Tracer.Assert(condition: false, "Unknown ObjectType"); break; } } return(result); }
private bool Remove(SegmentedDictionaryNode node, int hashCode, TKey key, int level, out int newCount) { bool flag = false; int num = HashToSlot(node, hashCode, level); ISegmentedDictionaryEntry segmentedDictionaryEntry = node.Entries[num]; if (segmentedDictionaryEntry == null) { flag = false; } else { switch (segmentedDictionaryEntry.EntryType) { case SegmentedDictionaryEntryType.Node: { SegmentedDictionaryNode node2 = segmentedDictionaryEntry as SegmentedDictionaryNode; flag = Remove(node2, hashCode, key, level + 1, out int newCount2); if (flag && newCount2 == 0) { node.Entries[num] = null; } break; } case SegmentedDictionaryEntryType.Values: { SegmentedDictionaryValues segmentedDictionaryValues = segmentedDictionaryEntry as SegmentedDictionaryValues; for (int i = 0; i < segmentedDictionaryValues.Count; i++) { if (!m_comparer.Equals(key, segmentedDictionaryValues.Keys[i])) { continue; } if (segmentedDictionaryValues.Count == 1) { node.Entries[num] = null; } else { segmentedDictionaryValues.Keys[i] = default(TKey); segmentedDictionaryValues.Values[i] = default(TValue); segmentedDictionaryValues.Count--; int num2 = segmentedDictionaryValues.Count - i; if (num2 > 0) { Array.Copy(segmentedDictionaryValues.Keys, i + 1, segmentedDictionaryValues.Keys, i, num2); Array.Copy(segmentedDictionaryValues.Values, i + 1, segmentedDictionaryValues.Values, i, num2); } } flag = true; break; } break; } default: Global.Tracer.Assert(condition: false, "Unknown ObjectType"); break; } } if (flag) { node.Count--; } newCount = node.Count; return(flag); }
private bool Insert(SegmentedDictionaryNode node, int hashCode, TKey key, TValue value, bool add, int level) { bool flag = false; int num = HashToSlot(node, hashCode, level); ISegmentedDictionaryEntry segmentedDictionaryEntry = node.Entries[num]; if (segmentedDictionaryEntry == null) { SegmentedDictionaryValues segmentedDictionaryValues = new SegmentedDictionaryValues(m_valuesCapacity); segmentedDictionaryValues.Keys[0] = key; segmentedDictionaryValues.Values[0] = value; segmentedDictionaryValues.Count++; node.Entries[num] = segmentedDictionaryValues; flag = true; } else { switch (segmentedDictionaryEntry.EntryType) { case SegmentedDictionaryEntryType.Node: { SegmentedDictionaryNode node2 = segmentedDictionaryEntry as SegmentedDictionaryNode; flag = Insert(node2, hashCode, key, value, add, level + 1); break; } case SegmentedDictionaryEntryType.Values: { SegmentedDictionaryValues segmentedDictionaryValues2 = segmentedDictionaryEntry as SegmentedDictionaryValues; bool flag2 = false; for (int i = 0; i < segmentedDictionaryValues2.Count; i++) { if (m_comparer.Equals(key, segmentedDictionaryValues2.Keys[i])) { if (add) { Global.Tracer.Assert(condition: false, "SegmentedDictionary: An element with the same key already exists within the Dictionary"); } segmentedDictionaryValues2.Values[i] = value; flag2 = true; flag = false; break; } } if (flag2) { break; } if (segmentedDictionaryValues2.Count < segmentedDictionaryValues2.Capacity) { int count = segmentedDictionaryValues2.Count; segmentedDictionaryValues2.Keys[count] = key; segmentedDictionaryValues2.Values[count] = value; segmentedDictionaryValues2.Count++; flag = true; break; } SegmentedDictionaryNode segmentedDictionaryNode = BuildNode(level + 1, m_nodeCapacity); node.Entries[num] = segmentedDictionaryNode; for (int j = 0; j < segmentedDictionaryValues2.Count; j++) { TKey val = segmentedDictionaryValues2.Keys[j]; Insert(segmentedDictionaryNode, m_comparer.GetHashCode(val), val, segmentedDictionaryValues2.Values[j], add: false, level + 1); } flag = Insert(segmentedDictionaryNode, hashCode, key, value, add, level + 1); break; } default: Global.Tracer.Assert(condition: false, "Unknown ObjectType"); break; } } if (flag) { node.Count++; } return(flag); }
private bool Remove(SegmentedDictionaryNode node, int hashCode, TKey key, int level, out int newCount) { bool flag = false; int num = this.HashToSlot(node, hashCode, level); ISegmentedDictionaryEntry segmentedDictionaryEntry = node.Entries[num]; if (segmentedDictionaryEntry == null) { flag = false; } else { switch (segmentedDictionaryEntry.EntryType) { case SegmentedDictionaryEntryType.Node: { SegmentedDictionaryNode node2 = segmentedDictionaryEntry as SegmentedDictionaryNode; int num4 = default(int); flag = this.Remove(node2, hashCode, key, level + 1, out num4); if (flag && num4 == 0) { node.Entries[num] = null; } break; } case SegmentedDictionaryEntryType.Values: { SegmentedDictionaryValues segmentedDictionaryValues = segmentedDictionaryEntry as SegmentedDictionaryValues; int num2 = 0; while (num2 < segmentedDictionaryValues.Count) { if (!this.m_comparer.Equals(key, segmentedDictionaryValues.Keys[num2])) { num2++; continue; } if (segmentedDictionaryValues.Count == 1) { node.Entries[num] = null; } else { segmentedDictionaryValues.Keys[num2] = default(TKey); segmentedDictionaryValues.Values[num2] = default(TValue); segmentedDictionaryValues.Count--; int num3 = segmentedDictionaryValues.Count - num2; if (num3 > 0) { Array.Copy(segmentedDictionaryValues.Keys, num2 + 1, segmentedDictionaryValues.Keys, num2, num3); Array.Copy(segmentedDictionaryValues.Values, num2 + 1, segmentedDictionaryValues.Values, num2, num3); } } flag = true; break; } break; } default: Global.Tracer.Assert(false, "Unknown ObjectType"); break; } } if (flag) { node.Count--; } newCount = node.Count; return(flag); }