[MSCTFIME][SDK] Improve CicArray (#6217)

- Add template type parameter.
- Use size_t for indexing instead of INT.
- Protect CicArray members.
- Adapt msctfime to new CicArray.
CORE-19360
This commit is contained in:
Katayama Hirofumi MZ 2023-12-21 20:17:35 +09:00 committed by GitHub
parent 7d6fc57ec9
commit df9c535542
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 37 deletions

View file

@ -348,7 +348,7 @@ typedef INT (CALLBACK *FN_EVENTSINK)(LPVOID, REFGUID);
class CCompartmentEventSink : public ITfCompartmentEventSink class CCompartmentEventSink : public ITfCompartmentEventSink
{ {
CicArray m_array; CicArray<CESMAP> m_array;
LONG m_cRefs; LONG m_cRefs;
FN_EVENTSINK m_fnEventSink; FN_EVENTSINK m_fnEventSink;
LPVOID m_pUserData; LPVOID m_pUserData;
@ -373,7 +373,7 @@ public:
* @implemented * @implemented
*/ */
CCompartmentEventSink::CCompartmentEventSink(FN_EVENTSINK fnEventSink, LPVOID pUserData) CCompartmentEventSink::CCompartmentEventSink(FN_EVENTSINK fnEventSink, LPVOID pUserData)
: m_array(8) : m_array()
, m_cRefs(1) , m_cRefs(1)
, m_fnEventSink(fnEventSink) , m_fnEventSink(fnEventSink)
, m_pUserData(pUserData) , m_pUserData(pUserData)
@ -438,7 +438,7 @@ STDMETHODIMP CCompartmentEventSink::OnChange(REFGUID rguid)
HRESULT HRESULT
CCompartmentEventSink::_Advise(IUnknown *pUnknown, REFGUID rguid, BOOL bThread) CCompartmentEventSink::_Advise(IUnknown *pUnknown, REFGUID rguid, BOOL bThread)
{ {
CESMAP *pCesMap = (CESMAP *)m_array.Append(1); CESMAP *pCesMap = m_array.Append(1);
if (!pCesMap) if (!pCesMap)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
@ -458,7 +458,7 @@ CCompartmentEventSink::_Advise(IUnknown *pUnknown, REFGUID rguid, BOOL bThread)
pCesMap->m_pComp->Release(); pCesMap->m_pComp->Release();
pCesMap->m_pComp = NULL; pCesMap->m_pComp = NULL;
} }
m_array.Remove(m_array.m_cItems - 1, 1); m_array.Remove(m_array.size() - 1, 1);
} }
else else
{ {
@ -478,11 +478,11 @@ CCompartmentEventSink::_Advise(IUnknown *pUnknown, REFGUID rguid, BOOL bThread)
*/ */
HRESULT CCompartmentEventSink::_Unadvise() HRESULT CCompartmentEventSink::_Unadvise()
{ {
CESMAP *pCesMap = (CESMAP *)m_array.m_pb; CESMAP *pCesMap = m_array.data();
if (!m_array.m_cItems) size_t cItems = m_array.size();
if (!cItems)
return S_OK; return S_OK;
INT cItems = m_array.m_cItems;
do do
{ {
ITfSource *pSource = NULL; ITfSource *pSource = NULL;

View file

@ -9,57 +9,79 @@
#include "cicbase.h" #include "cicbase.h"
class CicArray class CicArrayBase
{
protected:
LPBYTE m_pb;
size_t m_cItems, m_cbItem, m_cCapacity;
public:
CicArrayBase(size_t cbItem);
virtual ~CicArrayBase();
BOOL Insert(size_t iItem, size_t cGrow);
LPVOID Append(size_t cGrow);
void Remove(size_t iItem, size_t cRemove);
};
template <typename T_ITEM>
class CicArray : protected CicArrayBase
{ {
public: public:
LPBYTE m_pb; CicArray() : CicArrayBase(sizeof(T_ITEM)) { }
INT m_cItems;
INT m_cbItem;
INT m_cCapacity;
CicArray(INT cbItem); T_ITEM* data() const { return (T_ITEM*)m_pb; }
virtual ~CicArray(); size_t size() const { return m_cItems; }
bool empty() const { return !size(); }
BOOL Insert(INT iItem, INT cGrow); T_ITEM& operator[](size_t iItem)
LPVOID Append(INT cGrow); {
void Remove(INT iItem, INT cRemove); return *(T_ITEM*)&m_pb[iItem * m_cbItem];
}
const T_ITEM& operator[](size_t iItem) const
{
return *(const T_ITEM*)&m_pb[iItem * m_cbItem];
}
T_ITEM* Append(size_t cGrow)
{
return (T_ITEM*)CicArrayBase::Append(cGrow);
}
using CicArrayBase::Insert;
using CicArrayBase::Remove;
}; };
/******************************************************************************/ /******************************************************************************/
inline CicArray::CicArray(INT cbItem) inline CicArrayBase::CicArrayBase(size_t cbItem)
{ {
m_cbItem = cbItem; m_cbItem = cbItem;
m_pb = NULL; m_pb = NULL;
m_cItems = m_cCapacity = 0; m_cItems = m_cCapacity = 0;
} }
inline CicArray::~CicArray() inline CicArrayBase::~CicArrayBase()
{ {
cicMemFree(m_pb); cicMemFree(m_pb);
} }
inline LPVOID CicArray::Append(INT cGrow) inline LPVOID CicArrayBase::Append(size_t cGrow)
{ {
if (!Insert(m_cItems, cGrow)) if (!Insert(m_cItems, cGrow))
return NULL; return NULL;
return &m_pb[(m_cItems - cGrow) * m_cbItem]; return &m_pb[(m_cItems - cGrow) * m_cbItem];
} }
inline BOOL CicArray::Insert(INT iItem, INT cGrow) inline BOOL CicArrayBase::Insert(size_t iItem, size_t cGrow)
{ {
INT cNewCapacity = m_cItems + cGrow; size_t cNewCapacity = m_cItems + cGrow;
if (m_cCapacity < cNewCapacity) if (m_cCapacity < cNewCapacity)
{ {
if (cNewCapacity <= m_cItems + m_cItems / 2) if (cNewCapacity <= m_cItems + m_cItems / 2)
cNewCapacity = m_cItems + m_cItems / 2; cNewCapacity = m_cItems + m_cItems / 2;
BYTE *pbNew; LPBYTE pbNew = (LPBYTE)cicMemReAlloc(m_pb, cNewCapacity * m_cbItem);
if (m_pb)
pbNew = (BYTE *)cicMemReAlloc(m_pb, cNewCapacity * m_cbItem);
else
pbNew = (BYTE *)cicMemAlloc(cNewCapacity * m_cbItem);
if (!pbNew) if (!pbNew)
return FALSE; return FALSE;
@ -78,7 +100,7 @@ inline BOOL CicArray::Insert(INT iItem, INT cGrow)
return TRUE; return TRUE;
} }
inline void CicArray::Remove(INT iItem, INT cRemove) inline void CicArrayBase::Remove(size_t iItem, size_t cRemove)
{ {
if (iItem + cRemove < m_cItems) if (iItem + cRemove < m_cItems)
{ {
@ -89,14 +111,14 @@ inline void CicArray::Remove(INT iItem, INT cRemove)
m_cItems -= cRemove; m_cItems -= cRemove;
INT cHalfCapacity = m_cCapacity / 2; size_t cHalfCapacity = m_cCapacity / 2;
if (cHalfCapacity > m_cItems) if (cHalfCapacity <= m_cItems)
return;
LPBYTE pb = (LPBYTE)cicMemReAlloc(m_pb, cHalfCapacity * m_cbItem);
if (pb)
{ {
BYTE *pb = (BYTE *)cicMemReAlloc(m_pb, cHalfCapacity * m_cbItem); m_pb = pb;
if (pb) m_cCapacity = cHalfCapacity;
{
m_pb = pb;
m_cCapacity = cHalfCapacity;
}
} }
} }