DynArray.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #ifndef __DYNARRAY_H
  2. #define __DYNARRAY_H
  3. #include "assert.h"
  4. template <class T>
  5. class CDynArray
  6. {
  7. public:
  8. CDynArray (int bMemCopyable = 0, long nGrowBy = 128);
  9. ~CDynArray();
  10. T& operator[] (int nIndex);
  11. void Flush();
  12. long ArraySize() { return m_nArraySize; }
  13. void SetMemCopyable (int bMemCopyable) { m_bMemCopyable = bMemCopyable; }
  14. void SetGrowBy (long nGrowBy) { m_nGrowBy = nGrowBy; }
  15. protected:
  16. int Grow();
  17. T* m_pItems;
  18. long m_nArraySize;
  19. long m_nGrowBy;
  20. int m_bMemCopyable;
  21. };
  22. template <class T>
  23. CDynArray<T>::CDynArray (int bMemCopyable, long nGrowBy)
  24. {
  25. m_bMemCopyable = bMemCopyable;
  26. m_nGrowBy = nGrowBy;
  27. m_pItems = NULL;
  28. m_nArraySize = 0;
  29. }
  30. template <class T>
  31. CDynArray<T>::~CDynArray()
  32. {
  33. Flush();
  34. }
  35. template <class T>
  36. T& CDynArray<T>::operator[] (int nIndex)
  37. {
  38. assert (nIndex >= 0);
  39. while (nIndex >= m_nArraySize)
  40. {
  41. Grow();
  42. }
  43. return m_pItems[nIndex];
  44. }
  45. template <class T>
  46. void CDynArray<T>::Flush()
  47. {
  48. delete [] m_pItems;
  49. m_pItems = NULL;
  50. m_nArraySize = 0;
  51. }
  52. template <class T>
  53. int CDynArray<T>::Grow()
  54. {
  55. T* pNewArray = new T [m_nArraySize + m_nGrowBy];
  56. if (!pNewArray) return 0;
  57. if (m_bMemCopyable)
  58. {
  59. memcpy (pNewArray, m_pItems, m_nArraySize * sizeof(T));
  60. }
  61. else
  62. {
  63. for (long i = 0; i < m_nArraySize; i++)
  64. {
  65. pNewArray[i] = m_pItems[i];
  66. }
  67. }
  68. delete [] m_pItems;
  69. m_pItems = pNewArray;
  70. m_nArraySize += m_nGrowBy;
  71. return 1;
  72. }
  73. #endif