Made the Dispose() method of the parenting collection public (for now only?); found another, better, priority queue implementation to use for reference

git-svn-id: file:///srv/devel/repo-conversion/nusu@3 d2e56fa2-650e-0410-a79f-9358c0239efd
This commit is contained in:
Markus Ewald 2007-03-01 21:24:19 +00:00
parent fb7dba1c2c
commit d339e00bce
3 changed files with 362 additions and 204 deletions

View File

@ -95,7 +95,7 @@ namespace Nuclex.Support.Collections {
}
/// <summary>Release all resources owned by the instance explicitely</summary>
void IDisposable.Dispose() {
public void Dispose() {
Dispose(true); // Called by user
}

View File

@ -3,7 +3,165 @@ using System.Collections.Generic;
using System.Collections;
namespace Nuclex.Support.Collections {
/*
/*
public class PriorityQueue : ICollection {
private struct HeapEntry {
public HeapEntry(object item, int priority) {
this.item = item;
this.priority = priority;
}
public object Item {
get { return item; }
}
public int Priority {
get { return priority; }
}
private object item;
private int priority;
}
private int count;
private int capacity;
private int version;
private HeapEntry[] heap;
public PriorityQueue() {
capacity = 15; // 15 is equal to 4 complete levels
heap = new HeapEntry[capacity];
}
public object Dequeue() {
if(count == 0)
throw new InvalidOperationException();
object result = heap[0].Item;
count--;
trickleDown(0, heap[count]);
version++;
return result;
}
public void Enqueue(object item, int priority) {
if(count == capacity)
growHeap();
count++;
bubbleUp(count - 1, new HeapEntry(item, priority));
version++;
}
private void bubbleUp(int index, HeapEntry he) {
int parent = getParent(index);
// note: (index > 0) means there is a parent
while((index > 0) && (heap[parent].Priority < he.Priority)) {
heap[index] = heap[parent];
index = parent;
parent = getParent(index);
}
heap[index] = he;
}
private int getLeftChild(int index) {
return (index * 2) + 1;
}
private int getParent(int index) {
return (index - 1) / 2;
}
private void growHeap() {
capacity = (capacity * 2) + 1;
HeapEntry[] newHeap = new HeapEntry[capacity];
System.Array.Copy(heap, 0, newHeap, 0, count);
heap = newHeap;
}
private void trickleDown(int index, HeapEntry he) {
int child = getLeftChild(index);
while(child < count) {
if(((child + 1) < count) &&
(heap[child].Priority < heap[child + 1].Priority)) {
child++;
}
heap[index] = heap[child];
index = child;
child = getLeftChild(index);
}
bubbleUp(index, he);
}
#region IEnumerable implementation
public IEnumerator GetEnumerator() {
return new PriorityQueueEnumerator(this);
}
#endregion
#region ICollection implementation
public int Count {
get { return count; }
}
public void CopyTo(Array array, int index) {
System.Array.Copy(heap, 0, array, index, count);
}
public object SyncRoot {
get { return this; }
}
public bool IsSynchronized {
get { return false; }
}
#endregion
#region Priority Queue enumerator
private class PriorityQueueEnumerator : IEnumerator {
private int index;
private PriorityQueue pq;
private int version;
public PriorityQueueEnumerator(PriorityQueue pq) {
this.pq = pq;
Reset();
}
private void checkVersion() {
if(version != pq.version)
throw new InvalidOperationException();
}
#region IEnumerator Members
public void Reset() {
index = -1;
version = pq.version;
}
public object Current {
get {
checkVersion();
return pq.heap[index].Item;
}
}
public bool MoveNext() {
checkVersion();
if(index + 1 == pq.count)
return false;
index++;
return true;
}
#endregion
}
#endregion
}
*/
/*
/// <summary>Queue that dequeues items in order of their priority</summary>
public class PriorityQueue<ItemType> : ICollection, IEnumerable<ItemType> {
@ -231,5 +389,5 @@ namespace Nuclex.Support.Collections {
protected ArrayList InnerList = new ArrayList();
protected IComparer Comparer;
}
*/
*/
} // namespace Nuclex.Support.Collections

View File

@ -59,7 +59,7 @@ namespace Nuclex.Support.Serialization {
);
// Let the blueprint load its own data and add it to the collection
((IBinarySerializable)item).Load(reader);
(item as IBinarySerializable).Load(reader);
collection.Add(item);
} // for