mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 15:02:59 +00:00
100 lines
2.1 KiB
C++
100 lines
2.1 KiB
C++
/*
|
|
* PROJECT: ReactOS Cicero
|
|
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
|
|
* PURPOSE: Cicero dynamic array
|
|
* COPYRIGHT: Copyright 2023 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "cicbase.h"
|
|
|
|
class CicArray
|
|
{
|
|
LPVOID lpVtbl;
|
|
LPBYTE m_pb;
|
|
INT m_cItems;
|
|
INT m_cbItem;
|
|
INT m_cCapacity;
|
|
|
|
public:
|
|
CicArray(INT cbItem);
|
|
virtual CicArray();
|
|
|
|
void Insert(INT iItem, INT cGrow);
|
|
void Append(INT cGrow);
|
|
void Remove(INT iItem, INT cRemove);
|
|
};
|
|
|
|
/******************************************************************************/
|
|
|
|
inline CicArray::CicArray(INT cbItem)
|
|
{
|
|
m_cbItem = cbItem;
|
|
m_pb = NULL;
|
|
m_cItems = m_cCapacity = 0;
|
|
}
|
|
|
|
inline CicArray::~CicArray()
|
|
{
|
|
cicMemFree(m_pb);
|
|
}
|
|
|
|
inline void CicArray::Append(INT cGrow)
|
|
{
|
|
Insert(m_cItems, cGrow);
|
|
}
|
|
|
|
inline void CicArray::Insert(INT iItem, INT cGrow)
|
|
{
|
|
INT cNewCapacity = m_cItems + cGrow;
|
|
if (m_cCapacity < cNewCapacity)
|
|
{
|
|
if (cNewCapacity <= m_cItems + m_cItems / 2)
|
|
cNewCapacity = m_cItems + m_cItems / 2;
|
|
|
|
BYTE *pbNew;
|
|
if (m_pb)
|
|
pbNew = (BYTE *)cicMemReAlloc(m_pb, cNewCapacity * m_cbItem);
|
|
else
|
|
pbNew = (BYTE *)cicMemAlloc(cNewCapacity * m_cbItem);
|
|
|
|
if (!pbNew)
|
|
return;
|
|
|
|
m_pb = pbNew;
|
|
m_cCapacity = cNewCapacity;
|
|
}
|
|
|
|
if (iItem < m_cItems)
|
|
{
|
|
MoveMemory(&m_pb[(cGrow + iItem) * m_cbItem],
|
|
&m_pb[iItem * m_cbItem],
|
|
(m_cItems - iItem) * m_cbItem);
|
|
}
|
|
|
|
m_cItems += cGrow;
|
|
}
|
|
|
|
inline void CicArray::Remove(INT iItem, INT cRemove)
|
|
{
|
|
if (iItem + cRemove < m_cItems)
|
|
{
|
|
MoveMemory(&m_pb[iItem * m_cbItem],
|
|
&m_pb[(iItem + cRemove) * m_cbItem],
|
|
(m_cItems - iItem - cRemove) * m_cbItem);
|
|
}
|
|
|
|
m_cItems -= cRemove;
|
|
|
|
INT cHalfCapacity = m_cCapacity / 2;
|
|
if (cHalfCapacity > m_cItems)
|
|
{
|
|
BYTE *pb = (BYTE *)cicMemReAlloc(m_pb, cHalfCapacity * m_cbItem);
|
|
if (pb)
|
|
{
|
|
m_pb = pb;
|
|
m_cCapacity = cHalfCapacity;
|
|
}
|
|
}
|
|
}
|