arraycontainer.h
上传用户:lbr_007
上传日期:2019-05-31
资源大小:282k
文件大小:5k
源码类别:

传真(Fax)编程

开发平台:

Visual C++

  1. #ifndef ARRAYCONTAINER_H__
  2. #define ARRAYCONTAINER_H__
  3. ///////////////////////////////////////////////////////////////////////////////
  4. //
  5. // class: ArrayContainer
  6. //
  7. // description: This template implements an array container class for any
  8. // type of variable. Its important that whatever type is used
  9. // with this class have copy methods implemented (i.e. copy
  10. // constructor and equals operator).
  11. //
  12. // purpose: This class manages an array of objects of type T. It uses
  13. // a variable sized buffer to allocate and de-allocate data.
  14. //
  15. ///////////////////////////////////////////////////////////////////////////////
  16. template <class T> class ArrayContainer {
  17. void InitArray(void)
  18. {
  19. m_data = 0;
  20. m_size = m_total_size = 0;
  21. m_buffer_size = 16;
  22. }
  23. protected:
  24. T * m_data;
  25. int m_size, m_total_size, m_buffer_size;
  26. protected:
  27. T * AllocT(int size)
  28. {
  29. return (new T[size]);
  30. }
  31. void FreeT(T * ptr)
  32. {
  33. if (ptr)
  34. {
  35. delete [] ptr;
  36. }
  37. }
  38. public:
  39. ArrayContainer(void){ InitArray();}
  40. ArrayContainer(const ArrayContainer<T>& cont)
  41. {
  42. InitArray();
  43. Copy(cont);
  44. }
  45. void CreateArray(int n)
  46. {
  47. ClearArray();
  48. m_size = m_total_size = n;
  49. m_data = AllocT(n);
  50. }
  51. const ArrayContainer<T>& GetArrayContainer(void)const{ return *this;}
  52. void Copy(const ArrayContainer<T>& cont)
  53. {
  54. int size = cont.GetSize();
  55. if (m_total_size < size)
  56. {
  57. ClearArray();
  58. m_data = AllocT(size);
  59. m_total_size = size;
  60. }
  61. m_size = size;
  62. T data;
  63. for (int i=0;i<size;i++){
  64. if (cont.GetElement(i,data))
  65. {
  66. m_data[i] = data;
  67. }
  68. }
  69. m_buffer_size = cont.GetBufferSize();
  70. }
  71. ArrayContainer& operator = (const ArrayContainer<T>& cont)
  72. {
  73. Copy(cont);
  74. return *this;
  75. }
  76. ~ArrayContainer(void){ ClearArray();}
  77. T * GetData(void)
  78. {
  79. return m_data;
  80. }
  81. const T * GetConstData(void)const
  82. {
  83. return m_data;
  84. }
  85. T& operator [] (int index)
  86. {
  87. return m_data[index];
  88. }
  89. void ClearArray(void)
  90. {
  91. FreeT(m_data);
  92. int buf_size = m_buffer_size;
  93. InitArray();
  94. SetBufferSize(buf_size);
  95. }
  96. void ResetArray(void)
  97. {
  98. m_size = 0;
  99. }
  100. int  SetSize(int size)
  101. {
  102. if (size>0)
  103. {
  104. if (!m_data)
  105. {
  106. m_total_size = size;
  107. m_data = AllocT(m_total_size);
  108. m_size = 0;
  109. }
  110. else if (size > m_total_size)
  111. {
  112. T * newdata = AllocT(size);
  113. for (int i=0;i<m_size;i++){
  114. newdata[i] = m_data[i];
  115. }
  116. FreeT(m_data);
  117. m_data = newdata;
  118. m_total_size = size;
  119. }
  120. }
  121. return m_total_size;
  122. }
  123. int  GetSize(void)const
  124. {
  125. return m_size;
  126. }
  127. int  GetTotalSize(void)const
  128. {
  129. return m_total_size;
  130. }
  131. int  AddElement(const T& data)
  132. {
  133. int result = m_size;
  134. if (!m_data)
  135. {
  136. m_total_size = m_buffer_size;
  137. m_data = AllocT(m_total_size);
  138. m_data[0] = data;
  139. m_size = 1;
  140. }
  141. else if (m_size == m_total_size)
  142. {
  143. m_total_size += m_buffer_size;
  144. T * newdata = AllocT(m_total_size);
  145. for (int i=0;i<m_size;i++){
  146. newdata[i] = m_data[i];
  147. }
  148. FreeT(m_data);
  149. m_data = newdata;
  150. m_data[m_size] = data;
  151. m_size++;
  152. }
  153. else if (m_size < m_total_size)
  154. {
  155. m_data[m_size] = data;
  156. m_size++;
  157. }
  158. return (m_size - result);
  159. }
  160. int InsertElement(int index, T& data)
  161. {
  162. int result = 0;
  163. if (index >= 0 && index < m_size)
  164. {
  165. if (m_size == m_total_size)
  166. {
  167. m_total_size += m_buffer_size;
  168. T * newdata = AllocT(m_total_size);
  169. for (int i=0;i<=m_size;i++){
  170. if (i == index)
  171. {
  172. newdata[i] = data;
  173. i++;
  174. }
  175. newdata[i] = data;
  176. }
  177. FreeT(m_data);
  178. m_data = newdata;
  179. m_size++;
  180. result++;
  181. }
  182. else if (m_size < m_total_size)
  183. {
  184. for (int i=m_size;i>index;i--){
  185. m_data[i] = m_data[i-1];
  186. }
  187. m_data[index] = data;
  188. m_size++;
  189. result++;
  190. }
  191. }
  192. else if (index == m_size)
  193. {
  194. result = AddElement(data);
  195. }
  196. return result;
  197. }
  198. int  DeleteElement(int index)
  199. {
  200. int result = 0;
  201. if (index>= 0 && index<m_size)
  202. {
  203. m_size--;
  204. for (int i=index;i<m_size;i++){
  205. m_data[i] = m_data[i+1];
  206. }
  207. result++;
  208. }
  209. return result;
  210. }
  211. int  GetElement(int index, T& data)const
  212. {
  213. int result = 0;
  214. if (index>=0 && index<m_size)
  215. {
  216. data = m_data[index];
  217. result++;
  218. }
  219. return result;
  220. }
  221. T Element(int index)
  222. {
  223. return m_data[index];
  224. }
  225. int  ChangeElement(int index, T& data)
  226. {
  227. int result = 0;
  228. if (index>=0 && index<m_size)
  229. {
  230. m_data[index] = data;
  231. result++;
  232. }
  233. return result;
  234. }
  235. int  GetBufferSize(void)const
  236. {
  237. return m_buffer_size;
  238. }
  239. int  SetBufferSize(int size)
  240. {
  241. int result = 0;
  242. if (size>0)
  243. {
  244. m_buffer_size = size;
  245. result++;
  246. }
  247. return result;
  248. }
  249. };
  250. #endif