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

Symbian

开发平台:

C/C++

  1. /*============================================================================*
  2.  *
  3.  * (c) 1995-2002 RealNetworks, Inc. Patents pending. All rights reserved.
  4.  *
  5.  *============================================================================*/
  6.  
  7. #ifndef _UT_BUFFER_H
  8. #define _UT_BUFFER_H
  9. #include "chxbody.h"
  10. #include "chxsmartptr.h"
  11. #include "chxmakesmartptr.h"
  12. class CHXAvBuffer;
  13. // Symbian
  14. #include <e32std.h>
  15. #define NEW new (ELeave)
  16. // CHXAvBufferRep:
  17. //   Underlying (shared) buffer representation.
  18. class CHXAvBufferRep : public CHXBody {
  19. private:
  20.     friend class CHXAvBuffer;
  21.     friend class CHXSmartCPtr<CHXAvBufferRep>;
  22.     CHXAvBufferRep(int size);
  23.     ~CHXAvBufferRep();
  24.     CHXAvBufferRep(const CHXAvBufferRep& rep);
  25.     CHXAvBufferRep& operator=(const CHXAvBufferRep& rep);
  26.     void Reaize(int size);
  27.     int Length() const;
  28.     int MaxLength() const;
  29.     void Copy(const char* buf, int size);
  30.     void Append(const char* buf, int size);
  31.     void Grow(int size);
  32.     const char* Base() const;
  33.     char *Base();
  34.     char* m_pData; // Data
  35.     int m_len; // Current Length
  36.     int m_maxLen; // Maximum Length
  37. };
  38. MakeSmartPtr(CHXAvBufferRep);
  39. // CHXAvBuffer:
  40. //   Implements a referenced counted buffer. Copy construction and
  41. //   assignment result in a shared copy of the underlying buffer.
  42. //   This is implemented by the utSmartPtr semantics of the underlying
  43. //   buffer rep.  CHXAvBuffer's should always be used as objects, not
  44. //   pointers.
  45. class CHXAvBuffer {
  46. public:
  47.     CHXAvBuffer();
  48. // Allocate buffer, with max size
  49.     CHXAvBuffer(int size);
  50. // Allocate buffer, and initialize
  51.     CHXAvBuffer(const char* pData, int size);
  52.     CHXAvBuffer(const unsigned char* pData, int size);
  53. // Deep copy.  Shared references
  54. // do not change.
  55.     void Copy(const CHXAvBuffer& buffer);
  56. // Shallow operations: Shared references change
  57.     void Set(const CHXAvBuffer& buffer);
  58.     void Set(const unsigned char*, int size);
  59.     void Set(const char* pData, int size);
  60.     void Append(const CHXAvBuffer& buffer);
  61.     void Append(const unsigned char*, int size);
  62.     void Append(const char* pData, int size);
  63. // Current length of buffer
  64.     int Length() const;
  65. // Maximum length of buffer
  66.     int MaxLength() const;
  67. // MaxLength will increase if necessary
  68.     void Resize(int size);
  69. // These leak the pointer and break the
  70. // interface, but are required to to get a
  71. // handle on the raal data.  The data pointed
  72. // to may go away before the pointer does.
  73. // The pointers should never be deleted.
  74.     operator const char*() const;
  75.     operator char*() const;
  76.     operator const unsigned char*() const;
  77.     operator unsigned char*() const;
  78. private:
  79.     CHXAvBufferRepPtr m_pRep; // The real stuff
  80. };
  81. inline
  82. CHXAvBufferRep::CHXAvBufferRep(int size)
  83.   : m_pData(0),
  84.     m_len(0),
  85.     m_maxLen(0)
  86. {
  87.     if (size > 0)
  88. Grow(size);
  89. }
  90. inline
  91. CHXAvBufferRep::~CHXAvBufferRep()
  92. {
  93.     delete [] m_pData;
  94. }
  95. inline
  96. int CHXAvBufferRep::Length() const
  97. {
  98.     return m_len;
  99. }
  100. inline
  101. int CHXAvBufferRep::MaxLength() const
  102. {
  103.     return m_maxLen;
  104. }
  105. inline
  106. const char* CHXAvBufferRep::Base() const
  107. {
  108.     return m_pData;
  109. }
  110. inline
  111. char* CHXAvBufferRep::Base()
  112. {
  113.     return m_pData;
  114. }
  115. //
  116. // CHXAvBuffer
  117. //
  118. inline
  119. CHXAvBuffer::CHXAvBuffer()
  120.    : m_pRep(NEW CHXAvBufferRep(0))
  121. {}
  122. inline
  123. CHXAvBuffer::CHXAvBuffer(int size)
  124.     : m_pRep(NEW CHXAvBufferRep(size))
  125. {}
  126.     
  127. inline
  128. CHXAvBuffer::CHXAvBuffer(const char* pData, int size)
  129.     : m_pRep(NEW CHXAvBufferRep(size))
  130. {
  131.     m_pRep->Copy(pData, size);
  132. }
  133. inline
  134. CHXAvBuffer::CHXAvBuffer(const unsigned char* pData, int size)
  135.     : m_pRep(NEW CHXAvBufferRep(size))
  136. {
  137.     m_pRep->Copy((const char*) pData, size);
  138. }
  139. // CHXAvBuffer::Copy:
  140. //   Deep copy.  If there is another reference to the buffer,
  141. //   Let it go, and create a new one for this CHXAvBuffer
  142. inline
  143. void CHXAvBuffer::Copy(const CHXAvBuffer& buffer)
  144. {
  145.     if (m_pRep->refcount() > 1)
  146. m_pRep = NEW CHXAvBufferRep(buffer.m_pRep->Length());
  147.     m_pRep->Copy(buffer.m_pRep->Base(), buffer.m_pRep->Length());
  148. }
  149. // CHXAvBuffer::Set
  150. //   Shallow set operations. All reference are changed
  151. inline
  152. void CHXAvBuffer::Set(const char* pData, int size)
  153. {
  154.     m_pRep->Copy(pData, size);
  155. }
  156. inline
  157. void CHXAvBuffer::Set(const unsigned char* pData, int size)
  158. {
  159.     m_pRep->Copy((const char*) pData, size);
  160. }
  161. inline
  162. void CHXAvBuffer::Set(const CHXAvBuffer& buffer)
  163. {
  164.     if (m_pRep != buffer.m_pRep) // check for self copy
  165. m_pRep->Copy(buffer.m_pRep->Base(), buffer.m_pRep->Length());
  166. }
  167. // CHXAvBuffer::Append
  168. //   Shallow append operations. All reference are changed
  169. inline
  170. void CHXAvBuffer::Append(const char* pData, int size)
  171. {
  172.     m_pRep->Append(pData, size);
  173. }
  174. inline
  175. void CHXAvBuffer::Append(const unsigned char* pData, int size)
  176. {
  177.     m_pRep->Append((const char*) pData, size);
  178. }
  179. inline
  180. void CHXAvBuffer::Append(const CHXAvBuffer& buffer)
  181. {
  182.     CHXAvBufferRepPtr p = buffer.m_pRep;
  183.     if (m_pRep == buffer.m_pRep) // self append
  184. p = NEW CHXAvBufferRep(*buffer.m_pRep);
  185.     m_pRep->Append(p->Base(), p->Length());
  186. }
  187. inline
  188. void CHXAvBuffer::Resize(int size)
  189. {
  190.     if (size > m_pRep->MaxLength())
  191. m_pRep->Grow(size);
  192.     m_pRep->m_len = size;
  193. }
  194. inline
  195. int CHXAvBuffer::Length() const
  196. {
  197.     return m_pRep->Length();
  198. }
  199. inline
  200. int CHXAvBuffer::MaxLength() const
  201. {
  202.     return m_pRep->MaxLength();
  203. }
  204. inline
  205. CHXAvBuffer::operator const char*() const
  206. {
  207.     return m_pRep->Base();
  208. }
  209. inline
  210. CHXAvBuffer::operator char*() const
  211. {
  212.     return m_pRep->Base();
  213. }
  214. inline
  215. CHXAvBuffer::operator const unsigned char*() const
  216. {
  217.     return (const unsigned char*) m_pRep->Base();
  218. }
  219. inline
  220. CHXAvBuffer::operator unsigned char*() const
  221. {
  222.     return (unsigned char*) m_pRep->Base();
  223. }
  224. #endif // _UT_BUFFER_H