Reactos
at master 78 lines 1.8 kB view raw
1/* 2 * PROJECT: ReactOS Cicero 3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) 4 * PURPOSE: Cicero dynamic array 5 * COPYRIGHT: Copyright 2023 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> 6 */ 7 8#pragma once 9 10#include "cicbase.h" 11 12class CicArrayBase 13{ 14protected: 15 LPBYTE m_pb; 16 size_t m_cItems, m_cbItem, m_cCapacity; 17 18public: 19 CicArrayBase(size_t cbItem); 20 virtual ~CicArrayBase(); 21 22 BOOL Insert(size_t iItem, size_t cGrow); 23 LPVOID Append(size_t cGrow); 24 void Remove(size_t iItem, size_t cRemove = 1); 25}; 26 27template <typename T_ITEM> 28class CicArray : protected CicArrayBase 29{ 30public: 31 CicArray() : CicArrayBase(sizeof(T_ITEM)) { } 32 33 T_ITEM* data() const { return (T_ITEM*)m_pb; } 34 size_t size() const { return m_cItems; } 35 bool empty() const { return !size(); } 36 void clear() 37 { 38 cicMemFree(m_pb); 39 m_pb = NULL; 40 m_cItems = m_cCapacity = 0; 41 } 42 43 T_ITEM& operator[](size_t iItem) 44 { 45 return *(T_ITEM*)&m_pb[iItem * m_cbItem]; 46 } 47 const T_ITEM& operator[](size_t iItem) const 48 { 49 return *(const T_ITEM*)&m_pb[iItem * m_cbItem]; 50 } 51 52 T_ITEM* Append(size_t cGrow) 53 { 54 return (T_ITEM*)CicArrayBase::Append(cGrow); 55 } 56 57 using CicArrayBase::Insert; 58 using CicArrayBase::Remove; 59 60 BOOL Add(const T_ITEM& item) 61 { 62 T_ITEM *pItem = Append(1); 63 if (!pItem) 64 return FALSE; 65 CopyMemory(pItem, &item, sizeof(T_ITEM)); 66 return TRUE; 67 } 68 69 ptrdiff_t Find(const T_ITEM& item) const 70 { 71 for (size_t iItem = 0; iItem < m_cItems; ++iItem) 72 { 73 if ((*this)[iItem] == item) 74 return iItem; 75 } 76 return -1; 77 } 78};