internal HpBlockStreamReader(HpLinkedRange *range)
 {
     m_CurrentBlock = range->m_blockStreamRange.m_block;
     if (m_CurrentBlock != null)
     {
         m_CurrentPtr = m_CurrentBlock->Start() + range->m_blockStreamRange.m_startByteOffset;
     }
     else
     {
         m_CurrentPtr = null;
     }
     m_NumElementsLeftInCurrentBlock = range->m_blockStreamRange.m_startBlockNumElements;
     m_NumElementsLeft = range->m_blockStreamRange.m_numElements;
     m_LastPtr         = null;
 }
        public HpBlockStreamReader(HpBlockStream *stream)
        {
            m_CurrentBlock = stream->FirstBlock();
            m_LastPtr      = null;
            if (m_CurrentBlock != null)
            {
                m_NumElementsLeftInCurrentBlock = m_CurrentBlock->NumElements;
                m_CurrentPtr = m_CurrentBlock->Start();
            }
            else
            {
                m_NumElementsLeftInCurrentBlock = 0;
                m_CurrentPtr = null;
            }

            m_NumElementsLeft = stream->m_NumTotalElements;
        }
        unsafe public void Advance(int size)
        {
            m_CurrentPtr += size;

            m_NumElementsLeft--;
            m_NumElementsLeftInCurrentBlock--;
            if (m_NumElementsLeftInCurrentBlock == 0)
            {
                m_CurrentBlock = m_CurrentBlock->Next;
                if (m_CurrentBlock != null)
                {
                    m_NumElementsLeftInCurrentBlock = m_CurrentBlock->NumElements;
                    m_CurrentPtr = m_CurrentBlock->Start();
                }
                else
                {
                    m_NumElementsLeftInCurrentBlock = 0;
                    m_CurrentPtr = null;
                }
            }
        }