chxavbuffer.h

来自「symbian 下的helix player源代码」· C头文件 代码 · 共 278 行

H
278
字号
/*============================================================================*
 *
 * (c) 1995-2002 RealNetworks, Inc. Patents pending. All rights reserved.
 *
 *============================================================================*/
 
#ifndef _UT_BUFFER_H
#define _UT_BUFFER_H

#include "chxbody.h"
#include "chxsmartptr.h"
#include "chxmakesmartptr.h"

class CHXAvBuffer;

// Symbian
#include <e32std.h>
#define NEW new (ELeave)

// CHXAvBufferRep:
//   Underlying (shared) buffer representation.

class CHXAvBufferRep : public CHXBody {
private:
    friend class CHXAvBuffer;
    friend class CHXSmartCPtr<CHXAvBufferRep>;

    CHXAvBufferRep(int size);
    ~CHXAvBufferRep();
    CHXAvBufferRep(const CHXAvBufferRep& rep);
    CHXAvBufferRep& operator=(const CHXAvBufferRep& rep);

    void Reaize(int size);
    int Length() const;
    int MaxLength() const;
    void Copy(const char* buf, int size);
    void Append(const char* buf, int size);
    void Grow(int size);
    const char* Base() const;
    char *Base();

    char* m_pData;		// Data
    int m_len;			// Current Length
    int m_maxLen;		// Maximum Length
};

MakeSmartPtr(CHXAvBufferRep);

// CHXAvBuffer:
//   Implements a referenced counted buffer. Copy construction and
//   assignment result in a shared copy of the underlying buffer.
//   This is implemented by the utSmartPtr semantics of the underlying
//   buffer rep.  CHXAvBuffer's should always be used as objects, not
//   pointers.

class CHXAvBuffer {
public:
    CHXAvBuffer();
				// Allocate buffer, with max size
    CHXAvBuffer(int size);
				// Allocate buffer, and initialize
    CHXAvBuffer(const char* pData, int size);
    CHXAvBuffer(const unsigned char* pData, int size);

				// Deep copy.  Shared references
				// do not change.
    void Copy(const CHXAvBuffer& buffer);

			// Shallow operations: Shared references change
    void Set(const CHXAvBuffer& buffer);
    void Set(const unsigned char*, int size);
    void Set(const char* pData, int size);

    void Append(const CHXAvBuffer& buffer);
    void Append(const unsigned char*, int size);
    void Append(const char* pData, int size);

				// Current length of buffer
    int Length() const;
				// Maximum length of buffer
    int MaxLength() const;
				// MaxLength will increase if necessary
    void Resize(int size);

			// These leak the pointer and break the
			// interface, but are required to to get a
			// handle on the raal data.  The data pointed
			// to may go away before the pointer does.
			// The pointers should never be deleted.
    operator const char*() const;
    operator char*() const;
    operator const unsigned char*() const;
    operator unsigned char*() const;

private:
    CHXAvBufferRepPtr m_pRep;	// The real stuff
};




inline
CHXAvBufferRep::CHXAvBufferRep(int size)
  : m_pData(0),
    m_len(0),
    m_maxLen(0)
{
    if (size > 0)
	Grow(size);
}

inline
CHXAvBufferRep::~CHXAvBufferRep()
{
    delete [] m_pData;
}

inline
int CHXAvBufferRep::Length() const
{
    return m_len;
}

inline
int CHXAvBufferRep::MaxLength() const
{
    return m_maxLen;
}

inline
const char* CHXAvBufferRep::Base() const
{
    return m_pData;
}

inline
char* CHXAvBufferRep::Base()
{
    return m_pData;
}

//
// CHXAvBuffer
//

inline
CHXAvBuffer::CHXAvBuffer()
   : m_pRep(NEW CHXAvBufferRep(0))
{}

inline
CHXAvBuffer::CHXAvBuffer(int size)
    : m_pRep(NEW CHXAvBufferRep(size))
{}
    
inline
CHXAvBuffer::CHXAvBuffer(const char* pData, int size)
    : m_pRep(NEW CHXAvBufferRep(size))
{
    m_pRep->Copy(pData, size);
}

inline
CHXAvBuffer::CHXAvBuffer(const unsigned char* pData, int size)
    : m_pRep(NEW CHXAvBufferRep(size))
{
    m_pRep->Copy((const char*) pData, size);
}

// CHXAvBuffer::Copy:
//   Deep copy.  If there is another reference to the buffer,
//   Let it go, and create a new one for this CHXAvBuffer

inline
void CHXAvBuffer::Copy(const CHXAvBuffer& buffer)
{
    if (m_pRep->refcount() > 1)
	m_pRep = NEW CHXAvBufferRep(buffer.m_pRep->Length());

    m_pRep->Copy(buffer.m_pRep->Base(), buffer.m_pRep->Length());
}

// CHXAvBuffer::Set
//   Shallow set operations. All reference are changed

inline
void CHXAvBuffer::Set(const char* pData, int size)
{
    m_pRep->Copy(pData, size);
}

inline
void CHXAvBuffer::Set(const unsigned char* pData, int size)
{
    m_pRep->Copy((const char*) pData, size);
}

inline
void CHXAvBuffer::Set(const CHXAvBuffer& buffer)
{
    if (m_pRep != buffer.m_pRep) // check for self copy
	m_pRep->Copy(buffer.m_pRep->Base(), buffer.m_pRep->Length());
}

// CHXAvBuffer::Append
//   Shallow append operations. All reference are changed

inline
void CHXAvBuffer::Append(const char* pData, int size)
{
    m_pRep->Append(pData, size);
}

inline
void CHXAvBuffer::Append(const unsigned char* pData, int size)
{
    m_pRep->Append((const char*) pData, size);
}

inline
void CHXAvBuffer::Append(const CHXAvBuffer& buffer)
{
    CHXAvBufferRepPtr p = buffer.m_pRep;

    if (m_pRep == buffer.m_pRep) // self append
	p = NEW CHXAvBufferRep(*buffer.m_pRep);

    m_pRep->Append(p->Base(), p->Length());
}

inline
void CHXAvBuffer::Resize(int size)
{
    if (size > m_pRep->MaxLength())
	m_pRep->Grow(size);
    m_pRep->m_len = size;
}

inline
int CHXAvBuffer::Length() const
{
    return m_pRep->Length();
}

inline
int CHXAvBuffer::MaxLength() const
{
    return m_pRep->MaxLength();
}

inline
CHXAvBuffer::operator const char*() const
{
    return m_pRep->Base();
}

inline
CHXAvBuffer::operator char*() const
{
    return m_pRep->Base();
}

inline
CHXAvBuffer::operator const unsigned char*() const
{
    return (const unsigned char*) m_pRep->Base();
}

inline
CHXAvBuffer::operator unsigned char*() const
{
    return (unsigned char*) m_pRep->Base();
}



#endif // _UT_BUFFER_H

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?