cbbqueue.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:18k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. /*******************************************************************
  36.  *
  37.  * NAME: CBBQueue.h
  38.  *
  39.  * CLASS:
  40.  * CBigByteQueue class declaration.
  41.  *
  42.  * DESCRIPTION:
  43.  * Class declaration for a 'Queue of bytes' object.
  44.  * This object is meant to serve the needs of either clients as
  45.  * an abstract object, or of subclasses as a base object.
  46.  *
  47.  * That is a client may use this instances of this class directly,
  48.  * or they may inherit from the class and provide expanded
  49.  * functionality.
  50.  *
  51.  * NOTES:
  52.  * This is a reimplementation of the existing CBigByteQueue
  53.  * class using 32-bit pointers instead of 16-bit pointers.
  54.  *
  55.  *******************************************************************/
  56. #ifndef _CBBQUEUE_H_
  57. #define _CBBQUEUE_H_
  58.  
  59. #include "hxtypes.h"
  60. #include "hxassert.h"
  61. #if !defined( NULL )
  62. #define NULL 0
  63. #endif
  64. #if !defined( FALSE )
  65. #define FALSE 0
  66. #endif // !defined( FALSE )
  67. #if !defined( TRUE )
  68. #define TRUE !FALSE
  69. #endif // !defined( TRUE )
  70. class CBigByteQueue
  71. {
  72. /*
  73.  * Our public interface.
  74.  * These are the methods we export to the world.
  75.  * These methods are primarily used by our clients.
  76.  */
  77. public:
  78.    /*
  79. ** CBigByteQueue( ulSize, ulElementSize )
  80. *
  81. *  PARAMETERS:
  82. * ulSize Size of the bytequeue in bytes.
  83. * ulElementSize For subclasses we ensure our size is a multiple of this.
  84. *
  85. *  DESCRIPTION:
  86. * Parameterized constructor.
  87. * This is the primary means of creating an instance of CBigByteQueue.
  88. *
  89. *  RETURNS:
  90. * void
  91. */
  92. CBigByteQueue( UINT32 ulSize, UINT32 ulElementSize = 1);
  93.    /*
  94. ** CBigByteQueue( rReferent )
  95. *
  96. *  PARAMETERS:
  97. * rReferent Constant reference to another CBigByteQueue object.
  98. *
  99. *  DESCRIPTION:
  100.      * Copy constructor (ctor).  Copies a CBigByteQueue into
  101. * another CBigByteQueue that is under construction.
  102. * This guy is called in construction situations like this:
  103. * CBigByteQueue rQueueOrig( 10 ); // Call param ctor
  104. * CBigByteQueue rQueueCopy = rQueueOrig; // Call copy ctor
  105. *
  106. *  RETURNS:
  107. * void
  108. */
  109. CBigByteQueue( const CBigByteQueue &rReferent );
  110.    /*********************************************************
  111.     * Here are are non-virtual methods that provide
  112. * primitive functionality to all queues.
  113. *********************************************************/
  114.    /*
  115. ** GetQueuedItemCount()
  116. *
  117. *  PARAMETERS:
  118. * void
  119. *
  120. *  DESCRIPTION:
  121. * Returns a count of the items we have queue'd up.
  122. * This function is accurate even in subclasses with
  123. * elements that are a different size from a UCHAR.
  124. *
  125. *  RETURNS:
  126. * Returns the number of ITEMS we have queued up.
  127. *
  128. */
  129. UINT32 GetQueuedItemCount() const
  130. {
  131. HX_ASSERT( this );
  132. HX_ASSERT( IsQueueValid() );    
  133. return( Base_GetUsedByteCount() / m_ulElementSize );
  134. }
  135.    /*
  136. ** UINT32 GetAvailableElements()
  137. *
  138. *  PARAMETERS:
  139. * void
  140. *
  141. *  DESCRIPTION:
  142. * Returns the number of ITEMS we can EnQueue w/o failing.
  143. *
  144. *  RETURNS:
  145. * 0 if the queue is full
  146. * non-zero to indicate how many ITEMS we can EnQueue.
  147. */
  148. UINT32 GetAvailableElements() const
  149. {
  150. HX_ASSERT( this );
  151. HX_ASSERT( IsQueueValid() );    
  152. return( Base_GetAvailableBytes() / m_ulElementSize );
  153. }
  154.    /*
  155. ** UINT32 GetMaxAvailableElements()
  156. *
  157. *  PARAMETERS:
  158. * void
  159. *
  160. *  DESCRIPTION:
  161. * Returns the number of ITEMS we can EnQueue w/o failing AFTER 
  162. * we have grown the queue to its Maximum size.
  163. *
  164. *  RETURNS:
  165. * 0 if the queue is full AND there is no more room to grow
  166. * beyond the max size
  167. * non-zero to indicate how many ITEMS we can EnQueue.
  168. */
  169. UINT32 GetMaxAvailableElements() const
  170. {
  171. HX_ASSERT( this );
  172. HX_ASSERT( IsQueueValid() );    
  173. return( Base_GetMaxAvailableBytes() / m_ulElementSize );
  174. }
  175.    /*
  176. ** BOOL IsEmpty()
  177. *
  178. *  PARAMETERS:
  179. * void
  180. *
  181. *  DESCRIPTION:
  182. * Tells us if the queue is empty.
  183. *
  184. *  RETURNS:
  185. * Returns TRUE if the queue is empty.
  186. *
  187. */
  188. BOOL IsEmpty() const
  189. {
  190. HX_ASSERT( this );
  191. HX_ASSERT( IsQueueValid() );    
  192. return( m_pTail == m_pHead );
  193. }
  194.    /*
  195. ** CBigByteQueue &operator=( rReferent )
  196. *
  197. *  PARAMETERS:
  198. * Constant reference to the CBigByteQueue object we are assigning from
  199. * (the rValue).
  200. *
  201. *  DESCRIPTION:
  202. * Assignment operator.
  203. * This guy gets called when we assign a CBigByteQueue.
  204. * This guy creates a fully functional copy of the source queue.
  205. *
  206. * Subclasses that want an assignment operator SHOULD redefine
  207. * this guy, but they should use the base method to copy the 
  208. * bits of the base class.
  209. *
  210. *  RETURNS:
  211. * A reference to the object we are assigning into.
  212. */
  213. CBigByteQueue &operator=( const CBigByteQueue &rReferent );
  214.    /*
  215. ** UINT32 PeekAt( ulIndex, pOutBuffer )
  216. *
  217. *  PARAMETERS:
  218. * ulIndex The ulIndex'th object from the head of the queue
  219. * that we are interested in.
  220. * pOutBuffer Pointer to the buffer to receive the contents of the
  221. * element.
  222. *
  223. *  DESCRIPTION:
  224.     * Peeks at a particular index off of the first element in the queue.
  225.     * The index is 0 based, hence an index of 0 will indicate the queue
  226.     * Head element.
  227. * Will copy the element of size GetElementSize() into the pOutBuffer.
  228. * *pbIsValid is set to FALSE if the element is not valid data.
  229. * Notice that the client needn't redifine this guy if the default
  230. * is satisfactory.
  231. * In particular this method will remain valid even across changes
  232. * of object size in the subclass.
  233. * The client will only NEED to imlement an override if they need
  234. * to provide another level of indirection.
  235. *
  236. *  RETURNS:
  237. * Returns the number of bytes copied into pOutBuffer.
  238. * 0 if nIndex specifies an invalid position in the queue.
  239. * (for instance if nIndex is 3, but there are only 2 elements
  240. * queued up we wil return 0)
  241. */
  242. UINT32 PeekAt( UINT32 ulIndex, void *pOutBuffer ) const;
  243.    /*
  244. ** FlushQueue()
  245. *
  246. *  PARAMETERS:
  247. * void
  248. *
  249. *  DESCRIPTION:
  250. * Instantly flush all elements from the queue.
  251. *
  252. *  RETURNS:
  253. * void
  254. */
  255. void FlushQueue()
  256. {
  257. HX_ASSERT( this );
  258. HX_ASSERT( IsQueueValid() );    
  259. Base_SetEmpty();
  260. }
  261.    /*********************************************************
  262.     * The rest of these public methods are virtual.
  263. *
  264. * HOWEVER, the default behavior is will remain fully
  265. * functional across all changes in object size.
  266. *
  267. * The only reason to provide overrides in subclasses
  268. * is to provide additional behavior.  If you do
  269. * implement an override make sure it calls the base
  270. * virtual method.
  271. *********************************************************/
  272.    /*
  273. ** ~CBigByteQueue()
  274. *
  275. *  PARAMETERS:
  276. * void
  277. *
  278. *  DESCRIPTION:
  279. * Destructor
  280. * Notice that this is a virtual destructor.  
  281. * The base class CBigByteQueue will delete the buffer.
  282. * The subclass need only implement on override if they
  283. * need additional cleanup besides the buffer.
  284. *
  285. *  RETURNS:
  286. * void
  287. */
  288. virtual ~CBigByteQueue();
  289.    /*
  290. ** BOOL IsQueueValid()
  291. *
  292. *  PARAMETERS:
  293. * void
  294. *
  295. *  DESCRIPTION:
  296. * This method allows the client to test the queue object for
  297. * validity.  The base class implements default behavior that
  298. * tests it's internal buffer pointers. 
  299. * The subclass will only need to implement an override if they
  300. * have additional validity checks.
  301. *
  302. * Any override of this funcion MUST return the logical AND of
  303. * it's validity checks and the checks of the base method.
  304. * Sort of like:
  305. * return( CBigByteQueue::IsQueueValid() && CSubClass::IsQueueValid() )
  306. *
  307. *  RETURNS:
  308. * TRUE If the queue is valid.
  309. * FALSE If there is an error in the queue members.
  310. */
  311. virtual BOOL IsQueueValid() const;
  312.    /*
  313. ** UINT32 DeQueue( pOutBuffer, ulItemCount )
  314. *
  315. *  PARAMETERS:
  316. * pOutBuffer Pointer to buffer to receive bytes we're pulling
  317. * out of the queue.
  318. * ulItemCount Number of items we want to dequeue.
  319. *
  320. *  DESCRIPTION:
  321. * One of our primary operations.
  322. * The client can redefine this function, but it is NOT necessary
  323. * as the default implementation will suffice for most cases.
  324. * In particular this method will remain valid even across changes
  325. * of object size in subclasses.
  326. * The client will only NEED to imlement an override if they need
  327. * to perform additional processing besides the block move of
  328. * bits.
  329. *
  330. *  RETURNS:
  331. * Number of bytes read out of the queue.
  332. */
  333. virtual UINT32 DeQueue( void *pOutBuffer, UINT32 ulItemCount )
  334. {
  335. HX_ASSERT( this );
  336. HX_ASSERT( IsQueueValid() );
  337. HX_ASSERT( pOutBuffer );
  338. return( Base_DeQueueBytes( pOutBuffer, ulItemCount * m_ulElementSize ) );
  339. }
  340.    /*
  341. ** UINT32 EnQueue( pInBuffer, ulItemCount )
  342. *
  343. *  PARAMETERS:
  344. * pInBuffer Pointer to bytes we want to enqueue.
  345. * ulItemCount Number of items we want to enqueue.
  346. *
  347. *  DESCRIPTION:
  348. * One of our primary operations.
  349. * The client can redefine this function, but it is NOT necessary
  350. * as the default implementation will suffice for most cases.
  351. * In particular this method will remain valid even across changes
  352. * of object size in subclasses.
  353. * The client will only NEED to imlement an override if they need
  354. * to perform additional processing besides the block move of
  355. * bits.
  356. *
  357. *  RETURNS:
  358. * 0 If there was not enough room to EnQueue() all the items 
  359. * specified.
  360. * Non-Zero  To indicate that all items specified were enqueue'd.
  361. *
  362. */
  363. virtual UINT32 EnQueue( void *pInBuffer, UINT32 ulItemCount )
  364. {
  365. HX_ASSERT( this );
  366. HX_ASSERT( IsQueueValid() );
  367. HX_ASSERT( pInBuffer );
  368. return( Base_EnQueueBytes( pInBuffer, ulItemCount * m_ulElementSize ) );
  369. }
  370. /*
  371.  * Grow the queue to twice its size or at least big enough to hold n more,
  372.  * whichever is greater.  Returns 1 for good, 0 for bad.
  373.  */
  374. int Grow(UINT32 ulItems);
  375. void SetMaxSize(UINT32 ulMax);
  376. /*
  377.  * Protected primitives for accessing the buffer and it's 
  378.  * pointers directly.
  379.  * These methods are available to our subclasses, but NOT to our
  380.  * clients.
  381.  */
  382. protected:
  383.    /*
  384. ** UINT32 Base_GetBufferSize()
  385. *
  386. *  PARAMETERS:
  387. * void
  388. *
  389. *  DESCRIPTION:
  390.     * Returns the actual allocated size of the buffer.
  391. *
  392. *  RETURNS:
  393. * Size of the allocated buffer.
  394. */
  395. UINT32 Base_GetBufferSize() const
  396. {
  397. HX_ASSERT( this );
  398. return( m_ulSize );
  399. }
  400.    /*
  401. ** UINT16 Base_GetMaxBufferSize()
  402. *
  403. *  PARAMETERS:
  404. * void
  405. *
  406. *  DESCRIPTION:
  407. * Returns the max size of the queue.
  408. *
  409. *  RETURNS:
  410. * Returns the max size of the queue.
  411. */
  412. UINT32 Base_GetMaxBufferSize() const
  413. {
  414. HX_ASSERT( this );
  415. return( m_ulMaxSize );
  416. }
  417.    /*
  418. ** UINT32 Base_GetUsedByteCount()
  419. *
  420. *  PARAMETERS:
  421. * void
  422. *
  423. *  DESCRIPTION:
  424. * Returns the actual number of bytes we've enqueued.
  425. *
  426. *  RETURNS:
  427. * Number of bytes in USE in the queue.
  428. */
  429. UINT32 Base_GetUsedByteCount() const
  430. {
  431. LONG32 iItemCount;
  432. HX_ASSERT( this );
  433. HX_ASSERT( IsQueueValid() );    
  434. iItemCount = (LONG32)(m_pTail - m_pHead);
  435. // If iItemCount < 0 then we need to add m_nSize
  436. iItemCount += (iItemCount < 0) ? Base_GetBufferSize() : 0;
  437. HX_ASSERT(iItemCount <= (LONG32)Base_GetBufferSize());
  438. return( (UINT32)iItemCount );
  439. }
  440.    /*
  441. ** UINT32 Base_GetAvailableBytes()
  442. *
  443. *  PARAMETERS:
  444. * void
  445. *
  446. *  DESCRIPTION:
  447. * Returns the number of bytes we can enqueue w/o failing.
  448. *
  449. *  RETURNS:
  450. * Returns the number of bytes we can enqueue w/o failing.
  451. */
  452. UINT32 Base_GetAvailableBytes() const
  453. {
  454. HX_ASSERT( this );
  455. HX_ASSERT( IsQueueValid() );    
  456. return( Base_GetBufferSize() - Base_GetUsedByteCount() - 1 );
  457. }
  458.    /*
  459. ** UINT32 Base_GetMaxAvailableBytes()
  460. *
  461. *  PARAMETERS:
  462. * void
  463. *
  464. *  DESCRIPTION:
  465. * Returns the number of bytes we can enqueue w/o failing AFTER
  466. * the queue has been grown to its maximum capacity.
  467. *
  468. *  RETURNS:
  469. * Returns the number of bytes we can enqueue w/o failing.
  470. */
  471. UINT32 Base_GetMaxAvailableBytes() const
  472. {
  473. HX_ASSERT( this );
  474. HX_ASSERT( IsQueueValid() );    
  475. return( Base_GetMaxBufferSize() - Base_GetUsedByteCount() - 1 );
  476. }
  477.    /*
  478. ** UINT32 Base_EnQueueBytes( pInBuffer, ulByteCount )
  479. *
  480. *  PARAMETERS:
  481. * pInBuffer Pointer to bytes to enqueue.
  482. * ulByteCount Number of bytes to enqueue.
  483. *
  484. *  DESCRIPTION:
  485. * Enqueue's a stream of bytes.
  486. * (Puts bytes INTO the queue)
  487. *
  488. *  RETURNS:
  489. * 0 if there was insufficient room to enqueue nByteCount bytes.
  490. * Number of bytes enqueued.
  491. *
  492. */
  493. UINT32 Base_EnQueueBytes( void *pInBuffer, UINT32 ulByteCount );
  494.    /*
  495. ** UINT32 Base_DeQueueBytes( pOutBuffer, ulByteCount )
  496. *
  497. *  PARAMETERS:
  498. * pOutBuffer Pointer to buffer to receive bytes from queue.
  499. * ulByteCount Number of bytes to remove from queue.
  500. *
  501. *  DESCRIPTION:
  502. * DeQueue's a stream of bytes.
  503. * (Takes bytes OUT of the queue)
  504. *
  505. *  RETURNS:
  506. * The number of bytes dequeued from the queue.
  507. */
  508. UINT32 Base_DeQueueBytes( void *pOutBuffer, UINT32 ulByteCount );
  509. /*
  510.  * Private Implementation data.  We don't share this stuff w/ our subclasses.
  511.  * this way we can enforce our public and protected interface.
  512.  */
  513. private:
  514. UCHAR *m_pData;   // the actual buffer pointer.
  515. UCHAR *m_pHead; // points one byte before the next bytes to be
  516. // dequeue'd() from the queue (if !Empty).
  517. UCHAR *m_pTail; // points at last byte of valid data in queue.
  518. // actually one byte before the next byte to receive new queue'd data
  519. UCHAR *m_pMax; // pointer to one position beyond what we've allocated
  520. // helps us limit check m_pHead & mpTail.
  521. UINT32 m_ulSize; // # of bytes in alloacated buffer
  522. UINT32 m_ulElementSize; // For our subclasses it's the size of an element
  523. // We'll make our buffer a multiple of this
  524. UINT32 m_ulMaxSize; // if set, max size queue can grow to.
  525. enum
  526. {
  527. FILLER_BYTE = 0xCC
  528. };
  529.    /*
  530. ** void Base_SetEmpty()
  531. *
  532. *  PARAMETERS:
  533. * void
  534. *
  535. *  DESCRIPTION:
  536. * Instantly empty the queue.
  537. *
  538. *  RETURNS:
  539. *
  540. */
  541. void Base_SetEmpty()
  542. {
  543. HX_ASSERT( this );
  544. m_pTail = m_pHead = m_pMax - 1;
  545. }
  546.    /*
  547. ** PBYTE Base_Normalize( pBuffer )
  548. *
  549. *  PARAMETERS:
  550. * pBuffer Pointer to our buffer that we want to normalize.
  551. *
  552. *  DESCRIPTION:
  553. * Used to keep buffer pointer elements (m_pHead & m_pTail) in range 
  554. * of m_pData to m_pMax-1.
  555. * Basically this method helps us implement the mod function except
  556. * we work w/ pointers, and we don't actually divide.
  557. *
  558. *  RETURNS:
  559. * Normalized pointer.
  560. */
  561. UCHAR * Base_Normalize( UCHAR * pBuffer, UINT32 offset ) const
  562. {
  563. HX_ASSERT( this );
  564. HX_ASSERT( IsQueueValid() );
  565. HX_ASSERT( pBuffer );
  566. pBuffer += offset;
  567. while (pBuffer >= m_pMax)
  568. {
  569. pBuffer -= m_ulSize;
  570. }
  571. return( pBuffer );
  572. }
  573.    /*
  574. ** UINT32 Base_GranulatedSize( ulSize, ulGranularity )
  575. *
  576. *  PARAMETERS:
  577. * ulSize A "proposed" size for our buffer.
  578. * ulGranularity The multiplier (for subclasses this is the size
  579. * of one of our elements).
  580. *
  581. *  DESCRIPTION:
  582. * Performs calcs to ensure our size is a multiple of our granularity.
  583. * This is done by rounding UP to the next even multiple of nGranularity
  584. * that is >= nSize.
  585. *
  586. *  RETURNS:
  587. * A rounded up quantity.
  588. */
  589. static UINT32 Base_GranulatedSize( UINT32 ulSize, UINT32 ulGranularity = 1 )
  590. {
  591. return( ((ulSize + ulGranularity - 1) / ulGranularity) * ulGranularity );
  592. }
  593.    /*
  594. ** CBigByteQueue()
  595. *
  596. *  PARAMETERS:
  597. * void
  598. *
  599. *  DESCRIPTION:
  600. * Default constructor:  We hide this guy because we want to enforce
  601. * the parameterized constructor.
  602. * We might at some later time relax that restriction and allow
  603. * a two step creation process, but not for now.
  604. *
  605. *  RETURNS:
  606. * void
  607. */
  608. CBigByteQueue() {}
  609.    /*
  610. ** UINT32 Base_PeekBuff( pOutBuffer, ulByteCount )
  611. *
  612. *  PARAMETERS:
  613. * pOutBuffer Pointer to buffer to receive bytes.
  614. * ulByteCount Desired max bytes to copy out of queue.
  615. *
  616. *  DESCRIPTION:
  617. * Copies bytes (nByteCount) from the Queue head to pOutBuffer.
  618. * returns the number of bytess actually copied into pOutBuffer.
  619. * This function does NOT modify the queue.  It is strictly a 
  620. * peek of the queue bytes specified.
  621. * Our limiting factor is:
  622. *  min( ulByteCount, Base_GetUsedByteCount() ).
  623. *
  624. *  RETURNS:
  625. * Number of bytes copied into pOutBuffer.
  626. */
  627. UINT32 Base_PeekBuff( void *pOutBuffer, UINT32 ulByteCount ) const;
  628. }; // class CBigByteQueue
  629. #endif // if !defined( _CBBQUEUE_H_ )