码迷,mamicode.com
首页 > 其他好文 > 详细

[PRUI]第一个工程中第一个类·PRString

时间:2016-10-06 20:02:45      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

第一个类PRString的Beta版本算是做好了,ANSI 和Unicode转换那一块还有BUG,还有几个小功能没补。

PRString 就是一字符串类,类似std::string

PRMisc.h

#pragma once
#include "stdafx.h"
#include "PRUI_CodeArea\PRUI_Import.h"
template<class T>
BOOLEAN PRPURE_API PRMemory_PutValue(PVOID pvMem,T dwObject)
{
    if (IsBadWritePtr(pvMem, sizeof(T))) return FALSE;
    *(T*)pvMem = dwObject;
    return TRUE;
} 
class PRUI_CLASSAPI PRString
{
private:
    LPWSTR szStringBase;
    DWORD dwStringLength;
public:
    //Constructor 
    PRString();
    ~PRString();
    PRString(LPWSTR szReference);
    PRString(LPSTR szReference);
    //String equal
    //For UnicodeString
    PRString& operator=(LPWSTR szString);
    //For AnsiString
    PRString& operator=(LPSTR szString);
    //Get/Set Character
    WCHAR operator[](size_t dwIndex);
    void ModifyCharacter(size_t dwIndex, WCHAR chNewChar);
    WCHAR IndexOf(size_t dwIndex);
    //String API 
    DWORD LengthOf();
    PRString& Duplicate();
    //It‘s safe.
    LPWSTR GetString();
    //Unsafe Method
    LPWSTR GetBuffer();
    //Make it safe.
    void SyncBuffer();
    LPSTR GetStringA();
    //String Upper/Lower
    PRString& UpperString(BOOLEAN bUpdateThis);
    PRString& LowerString(BOOLEAN bUpdateThis);
    //String compare
    BOOLEAN Compare(PRString& szTarget, BOOLEAN bCaseInSensitive);
    bool operator == (PRString &szTarget);
    //Memory
    PRString& AllocateString(size_t dwSize, BOOLEAN bReAllocate, BOOLEAN bUpdateThis);
    PRString& WriteString
    (size_t dwLocation, LPWSTR szString, size_t dwCount, BOOLEAN bUpdateThis, LPDWORD lpdwCopied);
    //Reload
    PRString& WriteString
    (size_t dwLocation, PRString& szString, size_t dwCount, BOOLEAN bUpdateThis, LPDWORD lpdwCopied);
    //String append
    PRString& AppendString(PRString& szTarget, BOOLEAN bUpdateThis);
    PRString& operator + (PRString &szTarget);
    //Find
    //Replace
    //Trim from...to...
};

PRMisc.cpp

#pragma once
#include "stdafx.h"
#include "PRUI_CodeArea\PRUI_Import.h"
#include "PRMisc.h"
#pragma region PRString Area
    //Constructor 
    PRString::PRString() {
        PRString("");
    }
    PRString::~PRString()
    {
        LocalFree((HLOCAL)szStringBase);
        szStringBase = 0;
        dwStringLength = 0;
    }
    PRString::PRString(LPWSTR szReference) { *this = szReference; }
    PRString::PRString(LPSTR szReference) { *this = szReference; }
    //String equal
    //For UnicodeString
    PRString& PRString::operator=(LPWSTR szString)
    {
        AllocateString(lstrlenW(szString), FALSE, TRUE);
        WriteString(0, szString, lstrlenW(szString), TRUE, 0);
        return *this;
    }
    //For AnsiString
    PRString& PRString::operator=(LPSTR szString)
    {
        dwStringLength = MultiByteToWideChar(CP_ACP, 0, szString, -1, 0, 0);
        AllocateString(dwStringLength, FALSE, TRUE);
        MultiByteToWideChar(CP_ACP, 0, szString, -1, GetBuffer(), dwStringLength);
        dwStringLength--;
        //ANSI String->Unicode String,本类以Unicode String为主
        return *this;
    }
    //Get/Set Character
    WCHAR PRString::operator[](size_t dwIndex)
    {
        return szStringBase[dwIndex];
    }
    void PRString::ModifyCharacter(size_t dwIndex, WCHAR chNewChar)
    {
        szStringBase[dwIndex] = chNewChar;
        if (chNewChar == \0) SyncBuffer();
    }
    WCHAR PRString::IndexOf(size_t dwIndex) { return this->operator[](dwIndex); }
    //String API 
    DWORD PRString::LengthOf() { return dwStringLength; }
    PRString& PRString::Duplicate() 
    { 
        PRString* szObjRef = new PRString(GetBuffer());
        PRString& szReturn = *szObjRef;
        return szReturn;
    }
    LPWSTR PRString::GetString() { return Duplicate().GetBuffer(); }
    //It‘s safe.
    LPWSTR PRString::GetBuffer() { return szStringBase; }
    void PRString::SyncBuffer() { dwStringLength = lstrlenW(szStringBase); }
    //Make it safe.
    LPSTR PRString::GetStringA() {
        DWORD dwAnsiStringLength;
        CHAR* szAnsiString;
        dwAnsiStringLength = WideCharToMultiByte(CP_ACP, 0, szStringBase, -1, 0, 0, 0, 0);
        szAnsiString = new CHAR[dwAnsiStringLength];
        WideCharToMultiByte(CP_ACP, 0, szStringBase, -1, szAnsiString, dwAnsiStringLength, 0, 0);
        return szAnsiString;
    }
    PRString& PRString::UpperString(BOOLEAN bUpdateThis)
    {
        PRString& szTemp = bUpdateThis ? *this : Duplicate();
        _wcsupr_s(szTemp.GetBuffer(), szTemp.LengthOf());
        szTemp.SyncBuffer();
        return szTemp;
    }
    PRString& PRString::LowerString(BOOLEAN bUpdateThis)
    {
        PRString& szTemp = bUpdateThis ? *this : Duplicate();
        _wcslwr_s(szTemp.GetBuffer(), szTemp.LengthOf());
        szTemp.SyncBuffer();
        return szTemp;
    }
    //String compare
    BOOLEAN PRString::Compare(PRString& szTarget, BOOLEAN bCaseInSensitive)
    {
        PRString szTarget_ = szTarget,
            szDestination = *this;
        if (!bCaseInSensitive) {
            szTarget_ = szTarget_.UpperString(FALSE);
            szDestination = szDestination.UpperString(FALSE);
        }
        if (szTarget_.LengthOf() != szDestination.LengthOf()) return FALSE;
        for (size_t i = 0; i < szTarget_.LengthOf(); i++) {
            if (szTarget_[i] != szDestination[i]) return FALSE;
        }
        return TRUE;
    }
    bool PRString::operator == (PRString &szTarget) {
        return Compare(szTarget, 1) == 1 ?  true : false;
    }
    //Memory
    PRString& PRString::AllocateString(size_t dwSize, BOOLEAN bReAllocate, BOOLEAN bUpdateThis)
    {
        PRString& szResult = bUpdateThis ? *this : Duplicate();
        HANDLE hHeap = GetProcessHeap();
        LPWSTR szBuffer = (LPWSTR)HeapAlloc(hHeap, 8, dwSize * sizeof(WCHAR) + 1);
        if (bReAllocate) lstrcpyW(szBuffer, this->GetBuffer());
        szResult.szStringBase = szBuffer;
        szResult.dwStringLength = dwSize;
        return szResult;
    }
    PRString& PRString::WriteString
    (size_t dwLocation, LPWSTR szString, size_t dwCount, BOOLEAN bUpdateThis, LPDWORD lpdwCopied)
    {
        PRString& szTarget = bUpdateThis ? *this : Duplicate();
        PRMemory_PutValue<int>((PVOID)lpdwCopied, 0);
        for (size_t i = dwLocation;
            i < (((dwLocation + dwCount - 1) > szTarget.LengthOf()) ?
                szTarget.LengthOf() : dwLocation + dwCount);
            i++) {
            szTarget.ModifyCharacter(i, szString[i - dwLocation]);
            PRMemory_PutValue<int>((PVOID)lpdwCopied, i - dwLocation + 1);
        }
        return szTarget;
    }
    //Reload
    PRString& PRString::WriteString
    (size_t dwLocation, PRString& szString, size_t dwCount, BOOLEAN bUpdateThis, LPDWORD lpdwCopied)
    {
        PRString& szTarget = bUpdateThis ? *this : Duplicate();
        PRMemory_PutValue<int>((PVOID)lpdwCopied, 0);
        for (size_t i = dwLocation;
            i < (((dwLocation + dwCount - 1) > szTarget.LengthOf()) ?
                szTarget.LengthOf() : dwLocation + dwCount);
            i++) {
            szTarget.ModifyCharacter(i, szString[i - dwLocation]);
            PRMemory_PutValue<int>((PVOID)lpdwCopied, i - dwLocation + 1);
        }
        return szTarget;
    }
    //String append
    PRString& PRString::AppendString(PRString& szTarget, BOOLEAN bUpdateThis)
    {
        DWORD dwLengthTotal = szTarget.LengthOf() + this->LengthOf();
        PRString& szResult = bUpdateThis ? *this : Duplicate();
        szResult = szResult.AllocateString(dwLengthTotal, TRUE, TRUE);
        szResult.WriteString(this->LengthOf(), szTarget, szTarget.LengthOf(), TRUE, 0);
        return szResult;
    }
    PRString& PRString::operator + (PRString &szTarget) {
        return AppendString(szTarget, TRUE);
    }
#pragma endregion

 

[PRUI]第一个工程中第一个类·PRString

标签:

原文地址:http://www.cnblogs.com/MorningFrst/p/5934167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!