cbbqueue.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:19k
源码类别:

Symbian

开发平台:

Visual C++

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