//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TWArraysAr.cpp // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: ÀàµÄ¶¨Òå // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "TWArraysAr.h" TWArraysAr::TWArraysAr(long unitSize) : m_iUnitSize(unitSize) { } TWArraysAr::~TWArraysAr() { } long TWArraysAr::GetUnitSize()const { return m_iUnitSize; } long TWArraysAr::GetUnit(long i)const { return i / GetUnitSize(); } long TWArraysAr::GetSubIndex(long i)const { return i % GetUnitSize(); } void TWArraysAr::Clear() { TWArchive::Clear(); m_bufTable.Clear(); } void TWArraysAr::Read(void *p, long size) { if (GetLength() - GetCur() < size) { size = GetLength() - GetCur(); } char *pData = (char*)p; long i = 0; for (m_bufTable.MoveTo(GetUnit(GetCur())); i < size && !m_bufTable.IsOut(); m_bufTable.MoveToNext()) { TWArrayAr &ar = m_bufTable.GetCurPData(); if (i == 0) { ar.MoveTo(GetSubIndex(GetCur())); } else { ar.MoveToFirst(); } long num = size - i; if (num > GetUnitSize() - ar.GetCur()) { num = GetUnitSize() - ar.GetCur(); } ar.Read(pData,num); pData += num; i += num; } } void TWArraysAr::Write(void *p, long size) { long iEndUnit = GetUnit(GetCur() + size - 1); while (m_bufTable.GetLength() <= iEndUnit) { TWArrayAr* pAr = new TWArrayAr(GetUnitSize()); pAr->SetLength(GetUnitSize()); m_bufTable.AddTail(pAr); } char *pData = (char*)p; long i = 0; for (m_bufTable.MoveTo(GetUnit(GetCur())); i < size; m_bufTable.MoveToNext()) { TWArrayAr &ar = m_bufTable.GetCurPData(); if (i == 0) { ar.MoveTo(GetSubIndex(GetCur())); } else { ar.MoveToFirst(); } long num = size - i; if (num > GetUnitSize() - ar.GetCur()) { num = GetUnitSize() - ar.GetCur(); } ar.Write(pData,num); pData += num; i += num; } if ((GetCur() + size) > m_iLength) { m_iLength = GetCur() + size; } }