public void Test()
        {
            MemoryPoolTest.TestMemoryLeak();
            int x = 0;
            ResourceQueue <string> queue = new ResourceQueue <string>(() => (x++).ToString(), 3, 4);

            x = 10;

            Assert.AreEqual(queue.Dequeue(), "0");
            Assert.AreEqual(queue.Dequeue(), "1");
            Assert.AreEqual(queue.Dequeue(), "2");
            Assert.AreEqual(queue.Dequeue(), "10");
            Assert.AreEqual(queue.Dequeue(), "11");

            queue.Enqueue("0");
            queue.Enqueue("1");
            Assert.AreEqual(queue.Dequeue(), "0");
            queue.Enqueue("3");
            Assert.AreEqual(queue.Dequeue(), "1");
            Assert.AreEqual(queue.Dequeue(), "3");
            Assert.AreEqual(queue.Dequeue(), "12");

            queue.Enqueue("1");
            queue.Enqueue("2");
            queue.Enqueue("3");
            queue.Enqueue("4");
            queue.Enqueue("5");
            Assert.AreEqual(queue.Dequeue(), "1");
            Assert.AreEqual(queue.Dequeue(), "2");
            Assert.AreEqual(queue.Dequeue(), "3");
            Assert.AreEqual(queue.Dequeue(), "4");
            Assert.AreEqual(queue.Dequeue(), "13");
            MemoryPoolTest.TestMemoryLeak();
        }
        public void Test()
        {
            MemoryPoolTest.TestMemoryLeak();
            int x = 0;
            ResourceQueue<string> queue = new ResourceQueue<string>(() => (x++).ToString(), 3, 4);

            x = 10;

            Assert.AreEqual(queue.Dequeue(), "0");
            Assert.AreEqual(queue.Dequeue(), "1");
            Assert.AreEqual(queue.Dequeue(), "2");
            Assert.AreEqual(queue.Dequeue(), "10");
            Assert.AreEqual(queue.Dequeue(), "11");

            queue.Enqueue("0");
            queue.Enqueue("1");
            Assert.AreEqual(queue.Dequeue(), "0");
            queue.Enqueue("3");
            Assert.AreEqual(queue.Dequeue(), "1");
            Assert.AreEqual(queue.Dequeue(), "3");
            Assert.AreEqual(queue.Dequeue(), "12");

            queue.Enqueue("1");
            queue.Enqueue("2");
            queue.Enqueue("3");
            queue.Enqueue("4");
            queue.Enqueue("5");
            Assert.AreEqual(queue.Dequeue(), "1");
            Assert.AreEqual(queue.Dequeue(), "2");
            Assert.AreEqual(queue.Dequeue(), "3");
            Assert.AreEqual(queue.Dequeue(), "4");
            Assert.AreEqual(queue.Dequeue(), "13");
            MemoryPoolTest.TestMemoryLeak();
        }
        /// <summary>
        /// Reads an entire page at the provided location. Also computes the checksum information.
        /// </summary>
        /// <param name="position">The stream position. May be any position inside the desired block</param>
        /// <param name="locationToCopyData">The place where to write the data to.</param>
        public void Read(long position, IntPtr locationToCopyData)
        {
            byte[] buffer    = m_bufferQueue.Dequeue();
            int    bytesRead = ReadRaw(position, buffer, buffer.Length);

            if (bytesRead < buffer.Length)
            {
                Array.Clear(buffer, bytesRead, buffer.Length - bytesRead);
            }

            Marshal.Copy(buffer, 0, locationToCopyData, buffer.Length);

            m_bufferQueue.Enqueue(buffer);

            Footer.WriteChecksumResultsToFooter(locationToCopyData, m_fileStructureBlockSize, buffer.Length);
        }