lldqueueptr.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldqueueptr.h
  3.  * @brief LLDynamicQueuePtr declaration
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLDQUEUEPTR_H
  33. #define LL_LLDQUEUEPTR_H
  34. template <class Type> 
  35. class LLDynamicQueuePtr
  36. {
  37. public:
  38. enum
  39. {
  40. OKAY = 0,
  41. FAIL = -1
  42. };
  43. LLDynamicQueuePtr(const S32 size=8);
  44. ~LLDynamicQueuePtr();
  45. void init();
  46. void destroy();
  47. void reset();
  48. void reallocate(U32 newsize);
  49. // ACCESSORS
  50. const Type& get(const S32 index) const; // no bounds checking
  51. Type&       get(const S32 index); // no bounds checking
  52. const Type& operator [] (const S32 index) const { return get(index); }
  53. Type&       operator [] (const S32 index) { return get(index); }
  54. S32 find(const Type &obj) const;
  55. S32 count() const { return (mLastObj >= mFirstObj ? mLastObj - mFirstObj : mLastObj + mMaxObj - mFirstObj); }
  56. S32 getMax() const { return mMaxObj; }
  57. S32 getFirst() const       { return mFirstObj; }
  58. S32 getLast () const       { return mLastObj; }
  59. // MANIPULATE
  60. S32         push(const Type &obj); // add to end of Queue, returns index from start
  61. S32 pull(      Type &obj);         // pull from Queue, returns index from start
  62. S32 remove   (S32 index);     // remove by index
  63. S32 removeObj(const Type &obj); // remove by object
  64. protected:
  65. S32           mFirstObj, mLastObj, mMaxObj;
  66. Type*   mMemory;
  67. public:
  68. void print()
  69. {
  70. /*
  71. Convert this to llinfos if it's intended to be used - djs 08/30/02
  72. printf("Printing from %d to %d (of %d): ",mFirstObj, mLastObj, mMaxObj);
  73. if (mFirstObj <= mLastObj)
  74. {
  75. for (S32 i=mFirstObj;i<mLastObj;i++)
  76. {
  77. printf("%d ",mMemory[i]);
  78. }
  79. }
  80. else
  81. {
  82. for (S32 i=mFirstObj;i<mMaxObj;i++)
  83. {
  84. printf("%d ",mMemory[i]);
  85. }
  86. for (i=0;i<mLastObj;i++)
  87. {
  88. printf("%d ",mMemory[i]);
  89. }
  90. }
  91. printf("n");
  92. */
  93. }
  94. };
  95. //--------------------------------------------------------
  96. // LLDynamicQueuePtrPtr implementation
  97. //--------------------------------------------------------
  98. template <class Type>
  99. inline LLDynamicQueuePtr<Type>::LLDynamicQueuePtr(const S32 size)
  100. {
  101. init();
  102. reallocate(size);
  103. }
  104. template <class Type>
  105. inline LLDynamicQueuePtr<Type>::~LLDynamicQueuePtr()
  106. {
  107. destroy();
  108. }
  109. template <class Type>
  110. inline void LLDynamicQueuePtr<Type>::init()
  111. mFirstObj    = 0;
  112. mLastObj     = 0;
  113. mMaxObj      = 0;
  114. mMemory      = NULL;
  115. }
  116. template <class Type>
  117. inline void LLDynamicQueuePtr<Type>::reallocate(U32 newsize)
  118. if (newsize)
  119. {
  120. if (mFirstObj > mLastObj && newsize > mMaxObj)
  121. {
  122. Type* new_memory = new Type[newsize];
  123. llassert(new_memory);
  124. S32 _count = count();
  125. S32 i, m = 0;
  126. for (i=mFirstObj; i < mMaxObj; i++)
  127. {
  128. new_memory[m++] = mMemory[i];
  129. }
  130. for (i=0; i <=mLastObj; i++)
  131. {
  132. new_memory[m++] = mMemory[i];
  133. }
  134. delete[] mMemory;
  135. mMemory = new_memory;
  136. mFirstObj = 0;
  137. mLastObj  = _count;
  138. }
  139. else
  140. {
  141. Type* new_memory = new Type[newsize];
  142. llassert(new_memory);
  143. S32 i, m = 0;
  144. for (i=0; i < mLastObj; i++)
  145. {
  146. new_memory[m++] = mMemory[i];
  147. }
  148. delete[] mMemory;
  149. mMemory = new_memory;
  150. }
  151. }
  152. else if (mMemory)
  153. {
  154. delete[] mMemory;
  155. mMemory = NULL;
  156. }
  157. mMaxObj = newsize;
  158. }
  159. template <class Type>
  160. inline void LLDynamicQueuePtr<Type>::destroy()
  161. {
  162. reset();
  163. delete[] mMemory;
  164. mMemory = NULL;
  165. }
  166. template <class Type>
  167. void LLDynamicQueuePtr<Type>::reset()    
  168. for (S32 i=0; i < mMaxObj; i++)
  169. {
  170. get(i) = NULL; // unrefs for pointers
  171. }
  172. mFirstObj    = 0;
  173. mLastObj     = 0;
  174. }
  175. template <class Type>
  176. inline S32 LLDynamicQueuePtr<Type>::find(const Type &obj) const
  177. {
  178. S32 i;
  179. if (mFirstObj <= mLastObj)
  180. {
  181. for ( i = mFirstObj; i < mLastObj; i++ )
  182. {
  183. if (mMemory[i] == obj)
  184. {
  185. return i;
  186. }
  187. }
  188. }
  189. else
  190. {
  191. for ( i = mFirstObj; i < mMaxObj; i++ )
  192. {
  193. if (mMemory[i] == obj)
  194. {
  195. return i;
  196. }
  197. }
  198. for ( i = 0; i < mLastObj; i++ )
  199. {
  200. if (mMemory[i] == obj)
  201. {
  202. return i;
  203. }
  204. }
  205. }
  206. return FAIL;
  207. }
  208. template <class Type>
  209. inline S32 LLDynamicQueuePtr<Type>::remove(S32 i)
  210. {
  211. if (mFirstObj > mLastObj)
  212. {
  213. if (i >= mFirstObj && i < mMaxObj)
  214. {
  215. while( i > mFirstObj)
  216. {
  217. mMemory[i] = mMemory[i-1];
  218. i--;
  219. }
  220. mMemory[mFirstObj] = NULL;
  221. mFirstObj++;
  222. if (mFirstObj >= mMaxObj) mFirstObj = 0;
  223. return count();
  224. }
  225. else if (i < mLastObj && i >= 0)
  226. {
  227. while(i < mLastObj)
  228. {
  229. mMemory[i] = mMemory[i+1];
  230. i++;
  231. }
  232. mMemory[mLastObj] = NULL;
  233. mLastObj--;
  234. if (mLastObj < 0) mLastObj = mMaxObj-1;
  235. return count();
  236. }
  237. }
  238. else if (i <= mLastObj && i >= mFirstObj)
  239. {
  240. while(i < mLastObj)
  241. {
  242. mMemory[i] = mMemory[i+1];
  243. i++;
  244. }
  245. mMemory[mLastObj] = NULL;
  246. mLastObj--;
  247. if (mLastObj < 0) mLastObj = mMaxObj-1;
  248. return count();
  249. }
  250. return FAIL;
  251. }
  252. template <class Type>
  253. inline S32 LLDynamicQueuePtr<Type>::removeObj(const Type& obj)
  254. {
  255. S32 ind = find(obj);
  256. if (ind >= 0)
  257. {
  258. return remove(ind);
  259. }
  260. return FAIL;
  261. }
  262. template <class Type>
  263. inline S32 LLDynamicQueuePtr<Type>::push(const Type &obj) 
  264. {
  265. if (mMaxObj - count() <= 1)
  266. {
  267. reallocate(mMaxObj * 2);
  268. }
  269. mMemory[mLastObj++] = obj;
  270. if (mLastObj >= mMaxObj) 
  271. {
  272. mLastObj = 0;
  273. }
  274. return count();
  275. }
  276. template <class Type>
  277. inline S32 LLDynamicQueuePtr<Type>::pull(Type &obj) 
  278. {
  279. obj = NULL;
  280. if (count() < 1) return -1;
  281. obj = mMemory[mFirstObj];
  282. mMemory[mFirstObj] = NULL;
  283. mFirstObj++;
  284. if (mFirstObj >= mMaxObj) 
  285. {
  286. mFirstObj = 0;
  287. }
  288. return count();
  289. }
  290. template <class Type>
  291. inline const Type& LLDynamicQueuePtr<Type>::get(const S32 i) const
  292. {
  293. return mMemory[i];
  294. }
  295. template <class Type>
  296. inline Type& LLDynamicQueuePtr<Type>::get(const S32 i)
  297. {
  298. return mMemory[i];
  299. }
  300. #endif // LL_LLDQUEUEPTR_H