Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

437 lines
9.2 KiB

  1. //
  2. // RefPtr.h -- definition of TRefPtr template
  3. //
  4. // Copyright (c) 1998-2001 Microsoft Corporation, All Rights Reserved
  5. //
  6. //
  7. //=================================================================
  8. #if _MSC_VER > 1000
  9. #pragma once
  10. #endif
  11. #ifndef __TREFPTR_H__
  12. #define __TREFPTR_H__
  13. #include <chptrarr.h>
  14. // Enumeration helpers
  15. typedef DWORD REFPTR_POSITION;
  16. #define REFPTR_START 0xFFFFFFFF;
  17. template <class TYPED_PTR> class TRefPtr
  18. {
  19. public:
  20. // Construction/Destruction
  21. TRefPtr();
  22. ~TRefPtr();
  23. // Allows addition and enumeration of collection
  24. BOOL Add( TYPED_PTR* ptr );
  25. BOOL Remove( DWORD dwElement );
  26. BOOL BeginEnum( REFPTR_POSITION& pos );
  27. TYPED_PTR* GetNext( REFPTR_POSITION& pos );
  28. void EndEnum( void );
  29. // Allows for direct access
  30. TYPED_PTR* GetAt( DWORD dwElement );
  31. void Empty( void );
  32. DWORD GetSize( void );
  33. const TRefPtr<TYPED_PTR>& Append( const TRefPtr<TYPED_PTR>& );
  34. protected:
  35. // Allows easy and quick transference of data (it was =, but
  36. // because we'll inherit classes off the template, we won't
  37. // inherit that particular overload (some C++ thingie)
  38. const TRefPtr<TYPED_PTR>& Copy( const TRefPtr<TYPED_PTR>& );
  39. private:
  40. CHPtrArray m_ptrArray;
  41. };
  42. ////////////////////////////////////////////////////////////////////////
  43. //
  44. // Function: TRefPtr::TRefPtr
  45. //
  46. // Class Constructor.
  47. //
  48. // Inputs: None.
  49. //
  50. // Outputs: None.
  51. //
  52. // Return: None.
  53. //
  54. // Comments: None.
  55. //
  56. ////////////////////////////////////////////////////////////////////////
  57. template <class TYPED_PTR>
  58. TRefPtr<TYPED_PTR>::TRefPtr( void ): m_ptrArray()
  59. {
  60. }
  61. ////////////////////////////////////////////////////////////////////////
  62. //
  63. // Function: CRefPtr::~CRefPtr
  64. //
  65. // Class Destructor.
  66. //
  67. // Inputs: None.
  68. //
  69. // Outputs: None.
  70. //
  71. // Return: None.
  72. //
  73. // Comments: None.
  74. //
  75. ////////////////////////////////////////////////////////////////////////
  76. template <class TYPED_PTR>
  77. TRefPtr<TYPED_PTR>::~TRefPtr( void )
  78. {
  79. Empty();
  80. }
  81. ////////////////////////////////////////////////////////////////////////
  82. //
  83. // Function: TRefPtr::Add
  84. //
  85. // Adds a new referenced pointer to the collection.
  86. //
  87. // Inputs: T* ptr - Pointer to add.
  88. //
  89. // Outputs: None.
  90. //
  91. // Return: TRUE/FALSE Success/Failure of Add.
  92. //
  93. // Comments: AddRefs the pointer, then adds it to the array. We
  94. // will need Write Access to do this.
  95. //
  96. ////////////////////////////////////////////////////////////////////////
  97. template <class TYPED_PTR>
  98. BOOL TRefPtr<TYPED_PTR>::Add( TYPED_PTR* ptr )
  99. {
  100. BOOL fReturn = FALSE;
  101. if ( NULL != ptr )
  102. {
  103. if ( m_ptrArray.Add( (void*) ptr ) >= 0 )
  104. {
  105. // Corresponding Release() is in Empty().
  106. ptr->AddRef();
  107. fReturn = TRUE;
  108. }
  109. }
  110. return fReturn;
  111. }
  112. ////////////////////////////////////////////////////////////////////////
  113. //
  114. // Function: TRefPtr::Remove
  115. //
  116. // Removes an element based on an index.
  117. //
  118. // Inputs: None.
  119. //
  120. // Outputs: None.
  121. //
  122. // Return: TRUE/FALSE Success/Failure of remove.
  123. //
  124. // Comments:
  125. //
  126. ////////////////////////////////////////////////////////////////////////
  127. template <class TYPED_PTR>
  128. BOOL TRefPtr<TYPED_PTR>::Remove( DWORD dwElement )
  129. {
  130. BOOL fReturn = FALSE;
  131. TYPED_PTR* ptr = NULL;
  132. if ( dwElement < m_ptrArray.GetSize() )
  133. {
  134. ptr = (TYPED_PTR*) m_ptrArray[dwElement];
  135. if ( NULL != ptr )
  136. {
  137. // Clean up our pointer
  138. ptr->Release();
  139. }
  140. m_ptrArray.RemoveAt( dwElement );
  141. fReturn = TRUE;
  142. }
  143. return fReturn;
  144. }
  145. ////////////////////////////////////////////////////////////////////////
  146. //
  147. // Function: TRefPtr::BeginEnum
  148. //
  149. // Gains Read Access to the collection, then returns an appropriate
  150. // REFPTR_POSITION to get the first index in the array.
  151. //
  152. // Inputs: None.
  153. //
  154. // Outputs: REFPTR_POSITION& pos - Position we retrieved.
  155. //
  156. // Return: BOOL TRUE/FALSE - Access was granted
  157. //
  158. // Comments: We need Read Access to do this. This can effectively
  159. // lock out other threads.
  160. //
  161. ////////////////////////////////////////////////////////////////////////
  162. template <class TYPED_PTR>
  163. BOOL TRefPtr<TYPED_PTR>::BeginEnum( REFPTR_POSITION& pos )
  164. {
  165. BOOL fReturn = FALSE;
  166. pos = REFPTR_START;
  167. fReturn = TRUE;
  168. return fReturn;
  169. }
  170. ////////////////////////////////////////////////////////////////////////
  171. //
  172. // Function: TRefPtr::EndEnum
  173. //
  174. // Signals the end of an enumeration.
  175. //
  176. // Inputs: None.
  177. //
  178. // Outputs: None.
  179. //
  180. // Return: None.
  181. //
  182. // Comments: Place Holder should we make Begin do something that
  183. // needs cleaning up.
  184. //
  185. ////////////////////////////////////////////////////////////////////////
  186. template <class TYPED_PTR>
  187. void TRefPtr<TYPED_PTR>::EndEnum( void )
  188. {
  189. }
  190. ////////////////////////////////////////////////////////////////////////
  191. //
  192. // Function: TRefPtr::GetNext
  193. //
  194. // Uses the REFPTR_POSITION to get the next index in the
  195. // collection.
  196. //
  197. // Inputs: None.
  198. //
  199. // Outputs: REFPTR_POSITION& pos - Position we retrieved.
  200. //
  201. // Return: T* NULL if failure.
  202. //
  203. // Comments: We need Read Access to do this. The pointer is AddRef'd
  204. // on the way out. User must Release the pointer himself.
  205. //
  206. ////////////////////////////////////////////////////////////////////////
  207. template <class TYPED_PTR>
  208. TYPED_PTR* TRefPtr<TYPED_PTR>::GetNext( REFPTR_POSITION& pos )
  209. {
  210. TYPED_PTR* ptr = NULL;
  211. if ( ++pos < (DWORD) m_ptrArray.GetSize() )
  212. {
  213. ptr = (TYPED_PTR*) m_ptrArray.GetAt( pos );
  214. if ( NULL != ptr )
  215. {
  216. ptr->AddRef();
  217. }
  218. }
  219. return ptr;
  220. }
  221. ////////////////////////////////////////////////////////////////////////
  222. //
  223. // Function: TRefPtr::GetAt
  224. //
  225. // Gets at the requested member of the device list.
  226. //
  227. // Inputs: None.
  228. //
  229. // Outputs: None.
  230. //
  231. // Return: T* NULL if failure.
  232. //
  233. // Comments: We need Read Access to do this. The pointer is AddRef'd
  234. // on the way out. User must Release the pointer himself.
  235. //
  236. ////////////////////////////////////////////////////////////////////////
  237. template <class TYPED_PTR>
  238. TYPED_PTR* TRefPtr<TYPED_PTR>::GetAt( DWORD dwElement )
  239. {
  240. TYPED_PTR* ptr = NULL;
  241. if ( dwElement < m_ptrArray.GetSize() )
  242. {
  243. ptr = (TYPED_PTR*) m_ptrArray.GetAt( dwElement );
  244. if ( NULL != ptr )
  245. {
  246. ptr->AddRef();
  247. }
  248. }
  249. return ptr;
  250. }
  251. ////////////////////////////////////////////////////////////////////////
  252. //
  253. // Function: TRefPtr::Empty
  254. //
  255. // Empties out the collection, Releasing Pointers as it does do.
  256. //
  257. // Inputs: None.
  258. //
  259. // Outputs: None.
  260. //
  261. // Return: None.
  262. //
  263. // Comments: We need Write Access to do this.
  264. //
  265. ////////////////////////////////////////////////////////////////////////
  266. template <class TYPED_PTR>
  267. void TRefPtr<TYPED_PTR>::Empty( void )
  268. {
  269. // By default this is an infinite wait, so it best come back
  270. int nSize = m_ptrArray.GetSize();
  271. // Only empty it if it is not empty
  272. if ( nSize > 0 )
  273. {
  274. TYPED_PTR* ptr = NULL;
  275. for ( int nCtr = 0; nCtr < nSize; nCtr++ )
  276. {
  277. ptr = (TYPED_PTR*) m_ptrArray[nCtr];
  278. if ( NULL != ptr )
  279. {
  280. // Clean up our pointers (not AddRef/Releasing so delete)
  281. ptr->Release();
  282. }
  283. }
  284. // Now dump the array
  285. m_ptrArray.RemoveAll();
  286. } // IF nSize > 0
  287. }
  288. ////////////////////////////////////////////////////////////////////////
  289. //
  290. // Function: TRefPtr::GetSize
  291. //
  292. // Returns the size of the collection
  293. //
  294. // Inputs: None.
  295. //
  296. // Outputs: None.
  297. //
  298. // Return: DWORD Number of elements
  299. //
  300. // Comments: We need Read Access to do this.
  301. //
  302. ////////////////////////////////////////////////////////////////////////
  303. template <class TYPED_PTR>
  304. DWORD TRefPtr<TYPED_PTR>::GetSize( void )
  305. {
  306. return m_ptrArray.GetSize();
  307. }
  308. ////////////////////////////////////////////////////////////////////////
  309. //
  310. // Function: TRefPtr::Copy
  311. //
  312. // Empties out the collection, copies in another one, addrefing
  313. // pointers as we go.
  314. //
  315. // Inputs: const T& collection
  316. //
  317. // Outputs: None.
  318. //
  319. // Return: const T& this
  320. //
  321. // Comments: We need Write Access to do this.
  322. //
  323. ////////////////////////////////////////////////////////////////////////
  324. template <class TYPED_PTR>
  325. const TRefPtr<TYPED_PTR>& TRefPtr<TYPED_PTR>::Copy( const TRefPtr<TYPED_PTR>& collection )
  326. {
  327. // Dump out the array
  328. Empty();
  329. int nSize = collection.m_ptrArray.GetSize();
  330. for ( int nCount = 0; nCount < nSize; nCount++ )
  331. {
  332. TYPED_PTR* ptr = (TYPED_PTR*) collection.m_ptrArray[nCount];
  333. // Add will automatically AddRef the pointer again.
  334. Add( ptr );
  335. }
  336. return *this;
  337. }
  338. ////////////////////////////////////////////////////////////////////////
  339. //
  340. // Function: TRefPtr::Append
  341. //
  342. // Appends the supplied collection to this one.
  343. //
  344. // Inputs: const T& collection
  345. //
  346. // Outputs: None.
  347. //
  348. // Return: const T& this
  349. //
  350. // Comments: We need Write Access to do this.
  351. //
  352. ////////////////////////////////////////////////////////////////////////
  353. template <class TYPED_PTR>
  354. const TRefPtr<TYPED_PTR>& TRefPtr<TYPED_PTR>::Append( const TRefPtr<TYPED_PTR>& collection )
  355. {
  356. int nSize = collection.m_ptrArray.GetSize();
  357. for ( int nCount = 0; nCount < nSize; nCount++ )
  358. {
  359. TYPED_PTR* ptr = (TYPED_PTR*) collection.m_ptrArray[nCount];
  360. // Add will automatically AddRef the pointer again.
  361. Add( ptr );
  362. }
  363. return *this;
  364. }
  365. #endif