public void TransferTo(IScalabilityCache scaleCache) { for (int i = 0; i < this.Entries.Length; i++) { IScalableDictionaryEntry scalableDictionaryEntry = this.Entries[i]; if (scalableDictionaryEntry != null) { switch (scalableDictionaryEntry.GetObjectType()) { case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryNodeReference: { ScalableDictionaryNodeReference scalableDictionaryNodeReference = scalableDictionaryEntry as ScalableDictionaryNodeReference; this.Entries[i] = (ScalableDictionaryNodeReference)scalableDictionaryNodeReference.TransferTo(scaleCache); break; } case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryValues: { ScalableDictionaryValues scalableDictionaryValues = scalableDictionaryEntry as ScalableDictionaryValues; scalableDictionaryValues.TransferTo(scaleCache); break; } default: Global.Tracer.Assert(false, "Unknown ObjectType"); break; } } } }
private void FreeChildren(ScalableDictionaryNodeReference nodeRef) { using (nodeRef.PinValue()) { ScalableDictionaryNode scalableDictionaryNode = nodeRef.Value(); for (int i = 0; i < scalableDictionaryNode.Entries.Length; i++) { IScalableDictionaryEntry scalableDictionaryEntry = scalableDictionaryNode.Entries[i]; if (scalableDictionaryEntry != null) { switch (scalableDictionaryEntry.GetObjectType()) { case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryNodeReference: { ScalableDictionaryNodeReference scalableDictionaryNodeReference = scalableDictionaryEntry as ScalableDictionaryNodeReference; this.FreeChildren(scalableDictionaryNodeReference); scalableDictionaryNodeReference.Free(); break; } default: Global.Tracer.Assert(false, "Unknown ObjectType"); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryValues: break; } } scalableDictionaryNode.Entries[i] = null; } scalableDictionaryNode.Count = 0; } }
public void Deserialize(IntermediateFormatReader reader) { reader.RegisterDeclaration(ScalableDictionary <TKey, TValue> .m_declaration); IScalabilityCache scalabilityCache = this.m_scalabilityCache = (reader.PersistenceHelper as IScalabilityCache); while (reader.NextMember()) { switch (reader.CurrentMember.MemberName) { case MemberName.NodeCapacity: this.m_nodeCapacity = reader.ReadInt32(); break; case MemberName.ValuesCapacity: this.m_valuesCapacity = reader.ReadInt32(); break; case MemberName.Comparer: { int id = reader.ReadInt32(); if (scalabilityCache.CacheType == ScalabilityCacheType.Standard) { this.m_comparer = (IEqualityComparer <TKey>)scalabilityCache.FetchStaticReference(id); } break; } case MemberName.Count: this.m_count = reader.ReadInt32(); break; case MemberName.Version: this.m_version = reader.ReadInt32(); break; case MemberName.Root: this.m_root = (ScalableDictionaryNodeReference)reader.ReadRIFObject(); break; case MemberName.UseFixedReferences: this.m_useFixedReferences = reader.ReadBoolean(); break; case MemberName.Priority: this.m_priority = reader.ReadInt32(); break; default: Global.Tracer.Assert(false); break; } } }
private bool FindNext() { bool flag = false; while (this.m_context.Count > 0 && !flag) { ContextItem <int, ScalableDictionaryNodeReference> contextItem = this.m_context.Peek(); ScalableDictionaryNodeReference value = contextItem.Value; using (value.PinValue()) { flag = this.FindNext(value.Value(), contextItem); } } return(flag); }
public ScalableDictionary(int priority, IScalabilityCache cache, int nodeCapacity, int entryCapacity, IEqualityComparer <TKey> comparer, bool useFixedReferences) { this.m_priority = priority; this.m_scalabilityCache = cache; this.m_nodeCapacity = nodeCapacity; this.m_valuesCapacity = entryCapacity; this.m_comparer = comparer; this.m_version = 0; this.m_count = 0; this.m_useFixedReferences = useFixedReferences; if (this.m_comparer == null) { this.m_comparer = EqualityComparer <TKey> .Default; } this.m_root = this.BuildNode(0, this.m_nodeCapacity); }
private bool FindNext(ScalableDictionaryNode node, ContextItem <int, ScalableDictionaryNodeReference> curContext) { bool flag = false; while (!flag && curContext.Key < node.Entries.Length) { IScalableDictionaryEntry scalableDictionaryEntry = node.Entries[curContext.Key]; if (scalableDictionaryEntry != null) { switch (scalableDictionaryEntry.GetObjectType()) { case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryNodeReference: { ScalableDictionaryNodeReference value = scalableDictionaryEntry as ScalableDictionaryNodeReference; this.m_context.Push(new ContextItem <int, ScalableDictionaryNodeReference>(0, value)); flag = this.FindNext(); break; } case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryValues: { ScalableDictionaryValues scalableDictionaryValues = scalableDictionaryEntry as ScalableDictionaryValues; if (this.m_currentValueIndex < scalableDictionaryValues.Count) { this.m_currentPair = new KeyValuePair <TKey, TValue>((TKey)scalableDictionaryValues.Keys[this.m_currentValueIndex], (TValue)scalableDictionaryValues.Values[this.m_currentValueIndex]); this.m_currentValueIndex++; return(true); } this.m_currentValueIndex = 0; break; } default: Global.Tracer.Assert(false, "Unknown ObjectType"); break; } } curContext.Key++; } if (!flag) { this.m_currentValueIndex = 0; this.m_context.Pop(); } return(flag); }
private bool Find(ScalableDictionaryNodeReference nodeRef, int hashCode, TKey key, int level, out TValue value, out IDisposable containingNodeRef) { containingNodeRef = null; IDisposable disposable = nodeRef.PinValue(); ScalableDictionaryNode scalableDictionaryNode = nodeRef.Value(); value = default(TValue); bool result = false; int num = this.HashToSlot(scalableDictionaryNode, hashCode, level); IScalableDictionaryEntry scalableDictionaryEntry = scalableDictionaryNode.Entries[num]; if (scalableDictionaryEntry != null) { switch (scalableDictionaryEntry.GetObjectType()) { case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryNodeReference: { ScalableDictionaryNodeReference nodeRef2 = scalableDictionaryEntry as ScalableDictionaryNodeReference; result = this.Find(nodeRef2, hashCode, key, level + 1, out value, out containingNodeRef); break; } case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryValues: { ScalableDictionaryValues scalableDictionaryValues = scalableDictionaryEntry as ScalableDictionaryValues; for (int i = 0; i < scalableDictionaryValues.Count; i++) { if (this.m_comparer.Equals(key, (TKey)scalableDictionaryValues.Keys[i])) { value = (TValue)scalableDictionaryValues.Values[i]; containingNodeRef = disposable; return(true); } } break; } default: Global.Tracer.Assert(false, "Unknown ObjectType"); break; } } disposable.Dispose(); return(result); }
public bool TryCreateReference(AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType referenceObjectType, out BaseReference reference) { switch (referenceObjectType) { case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.Null: case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.None: Global.Tracer.Assert(false, "Cannot create reference to Nothing or Null"); reference = null; return(false); case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.StorableArrayReference: reference = new SimpleReference <StorableArray>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryNodeReference: reference = new ScalableDictionaryNodeReference(); break; default: reference = null; return(false); } return(true); }
public bool TryCreateReference(AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType referenceObjectType, out BaseReference reference) { switch (referenceObjectType) { case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.Null: case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.None: Global.Tracer.Assert(false, "Cannot create reference to Nothing or Null"); reference = null; return(false); case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeTablixCellReference: reference = new RuntimeTablixCellReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeCellReference: reference = new RuntimeCellReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeDetailObjReference: reference = new RuntimeDetailObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeDataTablixObjReference: reference = new RuntimeDataTablixObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeHierarchyObjReference: reference = new RuntimeHierarchyObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeDataRegionObjReference: reference = new RuntimeDataRegionObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeDataTablixGroupRootObjReference: reference = new RuntimeDataTablixGroupRootObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeGroupRootObjReference: reference = new RuntimeGroupRootObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeGroupObjReference: reference = new RuntimeGroupObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeTablixGroupLeafObjReference: reference = new RuntimeTablixGroupLeafObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeChartCriGroupLeafObjReference: reference = new RuntimeChartCriGroupLeafObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeDataTablixGroupLeafObjReference: reference = new RuntimeDataTablixGroupLeafObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeGroupLeafObjReference: reference = new RuntimeGroupLeafObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeOnDemandDataSetObjReference: reference = new RuntimeOnDemandDataSetObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeSortHierarchyObjReference: reference = new RuntimeSortHierarchyObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeTablixObjReference: reference = new RuntimeTablixObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeChartObjReference: reference = new RuntimeChartObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeGaugePanelObjReference: reference = new RuntimeGaugePanelObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeMapDataRegionObjReference: reference = new RuntimeMapDataRegionObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeCriObjReference: reference = new RuntimeCriObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.AggregateRowReference: reference = new SimpleReference <AggregateRow>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.DataAggregateReference: reference = new SimpleReference <AspNetCore.ReportingServices.ReportIntermediateFormat.DataAggregate>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.DataAggregateObjReference: reference = new SimpleReference <AspNetCore.ReportingServices.ReportIntermediateFormat.DataAggregateObj>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.DataFieldRowReference: reference = new SimpleReference <DataFieldRow>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.IHierarchyObjReference: reference = new SimpleReference <IHierarchyObj>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeCellsReference: reference = new SimpleReference <RuntimeCells>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeChartCriCellReference: reference = new RuntimeChartCriCellReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeChartCriObjReference: reference = new RuntimeChartCriObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeDataTablixMemberObjReference: reference = new RuntimeDataTablixMemberObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeGroupingObjReference: reference = new SimpleReference <RuntimeGroupingObj>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeMemberObjReference: reference = new RuntimeMemberObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeRDLDataRegionObjReference: reference = new SimpleReference <RuntimeRDLDataRegionObj>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeRICollectionReference: reference = new SimpleReference <RuntimeRICollection>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeSortFilterEventInfoReference: reference = new SimpleReference <AspNetCore.ReportingServices.OnDemandProcessing.TablixProcessing.RuntimeSortFilterEventInfo>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.RuntimeUserSortTargetInfoReference: reference = new SimpleReference <AspNetCore.ReportingServices.OnDemandProcessing.TablixProcessing.RuntimeUserSortTargetInfo>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.SortExpressionScopeInstanceHolderReference: reference = new SortExpressionScopeInstanceHolderReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.SortFilterExpressionScopeObjReference: reference = new SortFilterExpressionScopeObjReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.StorableArrayReference: reference = new SimpleReference <StorableArray>(referenceObjectType); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryNodeReference: reference = new ScalableDictionaryNodeReference(); break; case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.LookupTableReference: reference = new SimpleReference <LookupTable>(referenceObjectType); break; default: reference = null; return(false); } return(true); }
private bool Remove(ScalableDictionaryNodeReference nodeRef, int hashCode, TKey key, int level, out int newCount) { using (nodeRef.PinValue()) { ScalableDictionaryNode scalableDictionaryNode = nodeRef.Value(); bool flag = false; int num = this.HashToSlot(scalableDictionaryNode, hashCode, level); IScalableDictionaryEntry scalableDictionaryEntry = scalableDictionaryNode.Entries[num]; if (scalableDictionaryEntry == null) { flag = false; } else { switch (scalableDictionaryEntry.GetObjectType()) { case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryNodeReference: { ScalableDictionaryNodeReference scalableDictionaryNodeReference = scalableDictionaryEntry as ScalableDictionaryNodeReference; int num4 = default(int); flag = this.Remove(scalableDictionaryNodeReference, hashCode, key, level + 1, out num4); if (flag && num4 == 0) { scalableDictionaryNode.Entries[num] = null; scalableDictionaryNodeReference.Free(); } break; } case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryValues: { ScalableDictionaryValues scalableDictionaryValues = scalableDictionaryEntry as ScalableDictionaryValues; int num2 = 0; while (num2 < scalableDictionaryValues.Count) { if (!this.m_comparer.Equals(key, (TKey)scalableDictionaryValues.Keys[num2])) { num2++; continue; } if (scalableDictionaryValues.Count == 1) { scalableDictionaryNode.Entries[num] = null; } else { scalableDictionaryValues.Keys[num2] = null; scalableDictionaryValues.Values[num2] = null; scalableDictionaryValues.Count--; int num3 = scalableDictionaryValues.Count - num2; if (num3 > 0) { Array.Copy(scalableDictionaryValues.Keys, num2 + 1, scalableDictionaryValues.Keys, num2, num3); Array.Copy(scalableDictionaryValues.Values, num2 + 1, scalableDictionaryValues.Values, num2, num3); } } flag = true; break; } break; } default: Global.Tracer.Assert(false, "Unknown ObjectType"); break; } } if (flag) { scalableDictionaryNode.Count--; } newCount = scalableDictionaryNode.Count; return(flag); } }
private bool Insert(ScalableDictionaryNodeReference nodeRef, int hashCode, TKey key, TValue value, bool add, int level, bool updateSize, out IDisposable cleanupRef) { IDisposable disposable = nodeRef.PinValue(); ScalableDictionaryNode scalableDictionaryNode = nodeRef.Value(); bool flag = false; int num = this.HashToSlot(scalableDictionaryNode, hashCode, level); IScalableDictionaryEntry scalableDictionaryEntry = scalableDictionaryNode.Entries[num]; if (scalableDictionaryEntry == null) { ScalableDictionaryValues scalableDictionaryValues = new ScalableDictionaryValues(this.m_valuesCapacity); scalableDictionaryValues.Keys[0] = key; scalableDictionaryValues.Values[0] = value; scalableDictionaryValues.Count++; scalableDictionaryNode.Entries[num] = scalableDictionaryValues; flag = true; cleanupRef = disposable; if (!this.m_useFixedReferences && updateSize) { int sizeBytesDelta = ItemSizes.SizeOfInObjectArray(key) + ItemSizes.SizeOfInObjectArray(value) + scalableDictionaryValues.EmptySize; nodeRef.UpdateSize(sizeBytesDelta); } } else { switch (scalableDictionaryEntry.GetObjectType()) { case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryNodeReference: { ScalableDictionaryNodeReference nodeRef2 = scalableDictionaryEntry as ScalableDictionaryNodeReference; flag = this.Insert(nodeRef2, hashCode, key, value, add, level + 1, updateSize, out cleanupRef); break; } case AspNetCore.ReportingServices.ReportIntermediateFormat.Persistence.ObjectType.ScalableDictionaryValues: { ScalableDictionaryValues scalableDictionaryValues2 = scalableDictionaryEntry as ScalableDictionaryValues; bool flag2 = false; cleanupRef = null; int num2 = 0; while (num2 < scalableDictionaryValues2.Count) { if (!this.m_comparer.Equals(key, (TKey)scalableDictionaryValues2.Keys[num2])) { num2++; continue; } if (add) { Global.Tracer.Assert(false, "ScalableDictionary: An element with the same key already exists within the Dictionary"); } scalableDictionaryValues2.Values[num2] = value; flag2 = true; flag = false; cleanupRef = disposable; break; } if (!flag2) { if (scalableDictionaryValues2.Count < scalableDictionaryValues2.Capacity) { int count = scalableDictionaryValues2.Count; scalableDictionaryValues2.Keys[count] = key; scalableDictionaryValues2.Values[count] = value; scalableDictionaryValues2.Count++; flag = true; cleanupRef = disposable; if (!this.m_useFixedReferences && updateSize) { nodeRef.UpdateSize(ItemSizes.SizeOfInObjectArray(key)); nodeRef.UpdateSize(ItemSizes.SizeOfInObjectArray(value)); } } else { ScalableDictionaryNodeReference scalableDictionaryNodeReference = this.BuildNode(level + 1, this.m_nodeCapacity); scalableDictionaryNode.Entries[num] = scalableDictionaryNodeReference; using (scalableDictionaryNodeReference.PinValue()) { if (!this.m_useFixedReferences && updateSize) { int num3 = ItemSizes.SizeOfInObjectArray(scalableDictionaryValues2); nodeRef.UpdateSize(num3 * -1); scalableDictionaryNodeReference.UpdateSize(num3); } for (int i = 0; i < scalableDictionaryValues2.Count; i++) { TKey key2 = (TKey)scalableDictionaryValues2.Keys[i]; IDisposable disposable2 = default(IDisposable); this.Insert(scalableDictionaryNodeReference, this.GetHashCode(key2), key2, (TValue)scalableDictionaryValues2.Values[i], false, level + 1, false, out disposable2); disposable2.Dispose(); } flag = this.Insert(scalableDictionaryNodeReference, hashCode, key, value, add, level + 1, updateSize, out cleanupRef); } } } break; } default: Global.Tracer.Assert(false, "Unknown ObjectType"); cleanupRef = null; break; } } if (flag) { scalableDictionaryNode.Count++; } if (disposable != cleanupRef) { disposable.Dispose(); } return(flag); }
public void TransferTo(IScalabilityCache scaleCache) { this.m_root = (ScalableDictionaryNodeReference)this.m_root.TransferTo(scaleCache); this.m_scalabilityCache = scaleCache; }