zoukankan      html  css  js  c++  java
  • 重写String类,也有些区别,供参考

    头文件如下:

    #pragma once
    #include <string>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <assert.h>
    using namespace std;
    
    typedef int   BOOL;
    #define FALSE 0
    #define TRUE  1
    
    
    typedef unsigned char BYTE;
    typedef unsigned int UINT;
    
    class MBuffer
    {
    public:
    	MBuffer();
    	MBuffer(const char * other);
    	MBuffer(const MBuffer&  other);
    	MBuffer(const string&  other);
    	virtual ~MBuffer();
    private:
    	BYTE*	 m_pBuffer;
    	UINT	 m_nBufferSize;
    
    	BYTE*	 m_pData;
    	UINT	 m_nDataSize;
    
    public:
    	virtual void FreeBuffer();
    	virtual BOOL AppendData(unsigned char* pData, UINT nDataSize);
    	virtual BOOL append( char* str,int nSize /*= 0*/ );
    	virtual BOOL append(const MBuffer &other);
    	virtual BOOL append(unsigned int value);
    	virtual void ClearData();
    	const char* GetData() ;
    	char* c_str()  const;
    	unsigned long   length() const;
    	virtual void clear();
    	MBuffer& operator=(const char * other);//赋值操作符重载
    	MBuffer& operator=(const MBuffer& other);//赋值操作符重载
    	MBuffer& operator=(const string& other);//赋值操作符重载
    	BOOL operator==(const MBuffer& other);//赋值操作符重载
    	char* substr( int nStart,int iSize );
    	int findlastofindex(char *cStr);
    	int findlastofindex(char cChr);
    	bool subbuffer(MBuffer& outBuffer,int istart,int ilen);
    private:
    	virtual BOOL AllocateBuffer(UINT nBufferSize);
    	virtual BOOL ExtendBuffer(UINT nBufferSize);
    	virtual BOOL FillData(unsigned char* pData, UINT nDataSize);
    
    };
    

      CPP文件:

    #include "MBuffer.h"
    
    MBuffer::MBuffer()
    {
    	m_pBuffer = NULL;
    	m_nBufferSize = 0;
    
    	m_pData = NULL;
    	m_nDataSize = 0;
    }
    
    MBuffer::MBuffer( const char * other )
     {
    	 m_pBuffer = NULL;
    	 m_nBufferSize = 0;
    
    	 m_pData = NULL;
    	 m_nDataSize = 0;
    	 if (other != NULL)
    	 {
    		 AppendData((unsigned char*)other,strlen(other));
    	 }
    }
    
    MBuffer::MBuffer( const MBuffer& other )
    {
    	m_pBuffer = NULL;
    	m_nBufferSize = 0;
    
    	m_pData = NULL;
    	m_nDataSize = 0;
    	AppendData(other.m_pData,other.m_nDataSize);
    }
    
    MBuffer::MBuffer( const string& other )
    {
    	FreeBuffer();
    	AppendData((unsigned char*)other.c_str(),other.length());
    }
    
    MBuffer::~MBuffer()
    {
    	FreeBuffer();
    }
    
    void MBuffer::FreeBuffer()
    {
    	if (m_pBuffer == NULL)
    		return;
    
    	delete[] m_pBuffer;
    
    	m_pBuffer = NULL;
    	m_nBufferSize = 0;
    
    	m_pData = NULL;
    	m_nDataSize = 0;
    }
    
    BOOL MBuffer::AllocateBuffer( UINT nBufferSize )
    {
    	if ( nBufferSize == 0)
    		return FALSE;
    
    	FreeBuffer();
    
    	m_pBuffer = new BYTE[nBufferSize + 1];
    	if ( m_pBuffer == NULL)
    		return FALSE;
    	m_nBufferSize = nBufferSize;
    	memset(m_pBuffer,0,nBufferSize + 1);
    	m_pData = m_pBuffer;
    
    	return true;
    }
    
    BOOL MBuffer::ExtendBuffer( UINT nBufferSize )
    {
    	if (nBufferSize <= m_nBufferSize)
    		return TRUE;
    
    	return AllocateBuffer(nBufferSize);
    }
    
    BOOL MBuffer::FillData( unsigned char* pData, UINT nDataSize )
    {
    	if (pData == NULL || nDataSize == 0)
    		return FALSE;
    
    	if (m_nBufferSize < nDataSize)
    		AllocateBuffer(nDataSize);
    
    	memcpy(m_pBuffer, pData, nDataSize);
    	m_nDataSize = nDataSize;
    
    	return TRUE;
    }
    
    BOOL MBuffer::AppendData( unsigned char* pData, UINT nDataSize )
    {
    	if (nDataSize == 0)
    		return FALSE;
    
    	if (!m_pBuffer && !m_nBufferSize)
    		AllocateBuffer(nDataSize);
    
    	if ( ( m_nBufferSize - ( m_pData - m_pBuffer)) < ( m_nDataSize + nDataSize))
    	{
    		MBuffer bufferTemp;
    		if (m_nDataSize)
    		{
    			if ( bufferTemp.FillData(m_pData, m_nDataSize) == FALSE)
    				return FALSE;
    		}
    
    		unsigned char* pBuffer = NULL;
    		pBuffer = new BYTE[m_nDataSize + nDataSize + 1];
    		if ( pBuffer == NULL)
    			return FALSE;
    
    		if ( m_pBuffer != NULL)
    			{
    				delete [] m_pBuffer;
    				m_pBuffer = NULL;
    			}
    
    		m_pBuffer = pBuffer;
    		m_pData = pBuffer;
    
    		m_nBufferSize = m_nDataSize + nDataSize;
    
    		if (bufferTemp.m_nDataSize)
    			memcpy( m_pData, bufferTemp.m_pData, bufferTemp.m_nDataSize);
    		m_pData[m_nDataSize + nDataSize] = '';
    		m_nDataSize = bufferTemp.m_nDataSize;
    	}
    	memcpy( m_pData + m_nDataSize, pData, nDataSize);
    	m_nDataSize += nDataSize;
    
    	return TRUE;
    }
    
    void MBuffer::ClearData()
    {
    	m_nDataSize = 0;
    	m_pData = m_pBuffer;
    }
    
    const char* MBuffer::GetData()
    {
    	return  (char*)m_pData;
    }
    
    char* MBuffer::c_str() const
    {
    	if (m_pData == NULL || m_nDataSize<=0)
    	{
    		return NULL;
    	}
    	return  (char*)m_pData;
    }
    
    unsigned long MBuffer::length() const
    {
    	return m_nDataSize;
    }
    
    MBuffer& MBuffer::operator=( const char * other )
    {
    	FreeBuffer();
    	if (other)
    	{
    		AppendData((unsigned char*)other,strlen(other));
    	}
    	return *this;
    }
    
    MBuffer& MBuffer::operator=( const MBuffer& other )
    {
    	FreeBuffer();
    	AppendData(other.m_pData,other.m_nDataSize);
    	return *this;
    }
    
    MBuffer& MBuffer::operator=( const string& other )
    {
    	FreeBuffer();
    	AppendData((unsigned char*)other.c_str(),other.length());
    	return *this;
    }
    
    void MBuffer::clear()
    {
    	FreeBuffer();
    }
    
    char* MBuffer::substr( int nStart,int iSize )
    {
    	if (nStart > m_nDataSize || iSize < 0 || iSize > m_nDataSize - nStart)
    	{
    		return NULL;
    	}
    	char *temp = (char*)malloc(iSize + 1);
    	memcpy(temp,m_pData + nStart,iSize);
    	temp[iSize] = '';
    	return temp;
    }
    
    int MBuffer::findlastofindex( char cChr )
    {
    	if (m_pData == NULL || m_nDataSize < 1)
    	{
    		return -1;
    	}
    	for (int i = m_nDataSize-1 ;i >=0 ; i--)
    	{
    		if (m_pData[i] == cChr)
    		{
    			return i;
    		}
    	}
    	return -1;
    }
    
    int MBuffer::findlastofindex( char *cStr )
    {
    	if (m_pData == NULL || cStr == NULL)
    	{
    		return -1;
    	}
    
    	int i, s1_len = strlen(cStr), end = m_nDataSize - s1_len;
    	char* last_index = NULL;
    	for (i = end - 1; i >= 0; i--)
    		if (!strncmp((char*)(m_pData + i), cStr, s1_len))
    			return i;
    	return -1;
    }
    
    BOOL MBuffer::append( char* str,int nSize /*= 0*/ )
    {
    	if (nSize == 0)
    	{
    		nSize = strlen(str);
    	}
    	return AppendData((unsigned char*)str,nSize);
    
    }
    
    BOOL MBuffer::append( unsigned int value )
    {
    	char cBuf[10]={0};
    	sprintf(cBuf,"%d",value);
    	return AppendData((unsigned char*)cBuf,strlen(cBuf));
    
    }
    
    BOOL MBuffer::append(const MBuffer &other )
    {
    	return AppendData((unsigned char*)other.c_str(),other.length());
    }
    
    BOOL MBuffer::operator==( const MBuffer& other )
    {
    	BOOL res = TRUE;
    	if (m_nDataSize != other.m_nDataSize)
    	{
    		return FALSE;
    	}
    	if (m_nDataSize<=0)
    	{
    		return FALSE;
    	}
    	for (int i =0;i<m_nDataSize;i++)
    	{
    		if (m_pData[i]!= other.m_pData[i])
    		{
    			res = FALSE;
    			break;
    		}
    	}
    	return res;
    }
    
    bool MBuffer::subbuffer( MBuffer& outBuffer,int istart,int ilen )
    {
    	if (m_nDataSize < istart + ilen || ilen <=0 || istart <0)
    	{
    		return false;
    	}
    
    	char *sbfer = new char[ilen+1];
    	memset(sbfer,0,ilen+1);
    	memcpy(sbfer,m_pData + istart + 1,ilen -1);
    	outBuffer = sbfer;
    	delete sbfer;
    	return true;
    }
    

      如果有bug还请大家帮忙指正,提出大家的宝贵意见,不断完善~谢谢~

  • 相关阅读:
    springcloud之配置中心和消息总线(配置中心终结版)
    yaml
    RESTful API
    单元测试Junit5
    IDEA社区版创建web项目
    Mybatis常见面试题
    mybatis逆向工程
    mybatis注解
    延迟加载
    缓存
  • 原文地址:https://www.cnblogs.com/forbeat/p/5035561.html
Copyright © 2011-2022 走看看