119 lines
2.1 KiB
C++
119 lines
2.1 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// 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;
|
|
}
|
|
} |