ChString.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:11k
- //***************************************************************************
- //
- // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
- //
- // CHSTRING.h
- //
- // Purpose: Utility library version of MFC CString
- //
- //***************************************************************************
- #if _MSC_VER > 1000
- #pragma once
- #endif
- #ifndef _CHSTRING_H
- #define _CHSTRING_H
- /////////////////////////////////////////////////////////////////////////////
- #include <windows.h>
- #include <limits.h>
- #include <tchar.h>
- #include <polarity.h>
- #pragma warning( disable : 4290 ) // Ignore 'C++ Exception Specification ignored'
- #include <ProvExce.h>
- /////////////////////////////////////////////////////////////////////////////
- struct _DOUBLE { BYTE doubleBits[sizeof(double)]; };
- #ifdef FRAMEWORK_ALLOW_DEPRECATED
- void POLARITY WINAPI SetCHStringResourceHandle(HINSTANCE handle);
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CHString formatting
- /////////////////////////////////////////////////////////////////////////////
- #define TCHAR_ARG WCHAR
- #define WCHAR_ARG WCHAR
- #define CHAR_ARG char
- #if defined(_68K_) || defined(_X86_)
- #define DOUBLE_ARG _DOUBLE
- #else
- #define DOUBLE_ARG double
- #endif
- struct CHStringData
- {
- long nRefs;
- int nDataLength;
- int nAllocLength;
- WCHAR* data()
- {
- return (WCHAR*)(this+1);
- }
- };
- /////////////////////////////////////////////////////////////////////////////
- class POLARITY CHString
- {
- protected:
- LPWSTR m_pchData; // pointer to ref counted string data
- protected:
- // implementation helpers
- CHStringData* GetData() const; // returns data pointer
- void Init();
- void AllocCopy(CHString& dest, int nCopyLen, int nCopyIndex, int nExtraLen) const throw ( CHeap_Exception ) ;
- void AllocBuffer(int nLen) throw ( CHeap_Exception ) ;
- void AssignCopy(int nSrcLen, LPCWSTR lpszSrcData) throw ( CHeap_Exception ) ;
- void ConcatCopy(int nSrc1Len, LPCWSTR lpszSrc1Data, int nSrc2Len, LPCWSTR lpszSrc2Data) throw ( CHeap_Exception ) ;
- void ConcatInPlace(int nSrcLen, LPCWSTR lpszSrcData);
- void CopyBeforeWrite() throw ( CHeap_Exception ) ;
- void AllocBeforeWrite(int nLen) throw ( CHeap_Exception ) ;
- void Release();
- static void WINAPI Release(CHStringData* pData);
- static inline int WINAPI SafeStrlen(LPCWSTR lpsz) { return (lpsz == NULL) ? 0 : wcslen(lpsz); }
- // Helper function used to load resource into lpszBuf buffer.
- #ifdef FRAMEWORK_ALLOW_DEPRECATED
- int LoadStringW(UINT nID, LPWSTR lpszBuf, UINT nMaxBuf) throw ( CHeap_Exception ) ;
- #endif
- public:
- // Constructors/Destruction
- CHString();
- CHString(const CHString& stringSrc);
- CHString(WCHAR ch, int nRepeat = 1) throw ( CHeap_Exception ) ;
- CHString(LPCSTR lpsz) throw ( CHeap_Exception ) ;
- CHString(LPCWSTR lpsz) throw ( CHeap_Exception ) ;
- CHString(LPCWSTR lpch, int nLength) throw ( CHeap_Exception ) ;
- inline CHString(const unsigned char* lpsz) { Init(); *this = (LPCSTR)lpsz; }
- ~CHString();
- // Functions
- void SetAt(int nIndex, WCHAR ch) throw ( CHeap_Exception ) ;
- void Empty();
- // inlines
- inline int GetLength() const { return GetData()->nDataLength; }
- inline BOOL IsEmpty() const { return GetData()->nDataLength == 0; }
- #if (!defined DEBUG && !defined _DEBUG)
- inline WCHAR GetAt(int nIndex) const{ return m_pchData[nIndex]; }
- inline WCHAR operator[](int nIndex) const{ return m_pchData[nIndex]; }
- #else
- WCHAR GetAt(int nIndex) const;
- WCHAR operator[](int nIndex) const;
- #endif
- inline operator LPCWSTR() const { return m_pchData; }
- inline int GetAllocLength() const { return GetData()->nAllocLength; }
- // overloaded assignment
- const CHString& operator=(const CHString& stringSrc) throw ( CHeap_Exception ) ;
- const CHString& operator=(WCHAR ch) throw ( CHeap_Exception ) ;
- const CHString& operator=(LPCSTR lpsz) throw ( CHeap_Exception ) ;
- const CHString& operator=(LPCWSTR lpsz) throw ( CHeap_Exception ) ;
- inline const CHString& operator=(const unsigned char* lpsz) throw ( CHeap_Exception ) { *this = (LPCSTR)lpsz; return *this; }
- inline const CHString& operator=(CHString *p) throw ( CHeap_Exception ) { *this = *p; return *this; }
- inline const CHString& operator=(char ch) throw ( CHeap_Exception ) { *this = (WCHAR)ch; return *this; }
-
- inline const CHString& CHString::operator+=(char ch) throw ( CHeap_Exception ) { *this += (WCHAR)ch; return *this; }
- friend inline CHString operator+(const CHString& string, char ch) throw ( CHeap_Exception ) { return string + (WCHAR)ch; }
- friend inline CHString operator+(char ch, const CHString& string) throw ( CHeap_Exception ) { return (WCHAR)ch + string; }
- const CHString& operator+=(const CHString& string) throw ( CHeap_Exception ) ;
- const CHString& operator+=(WCHAR ch) throw ( CHeap_Exception ) ;
- const CHString& operator+=(LPCWSTR lpsz) throw ( CHeap_Exception ) ;
- friend CHString POLARITY WINAPI operator+(const CHString& string1, const CHString& string2) throw ( CHeap_Exception ) ;
- friend CHString POLARITY WINAPI operator+(const CHString& string, WCHAR ch) throw ( CHeap_Exception ) ;
- friend CHString POLARITY WINAPI operator+(WCHAR ch, const CHString& string) throw ( CHeap_Exception ) ;
- friend CHString POLARITY WINAPI operator+(const CHString& string, LPCWSTR lpsz) throw ( CHeap_Exception ) ;
- friend CHString POLARITY WINAPI operator+(LPCWSTR lpsz, const CHString& string) throw ( CHeap_Exception ) ;
- // string comparison
- int Compare(LPCWSTR lpsz) const;
- inline int CompareNoCase(LPCWSTR lpsz) const
- {
- // ignore case
- return _wcsicmp(m_pchData, lpsz);
- } // MBCS/Unicode aware
- inline int Collate(LPCWSTR lpsz) const
- {
- // NLS aware
- // CHString::Collate is often slower than Compare but is MBSC/Unicode
- // aware as well as locale-sensitive with respect to sort order.
- return wcscoll(m_pchData, lpsz);
- } // locale sensitive
- // Load string from resource file.
- #ifdef FRAMEWORK_ALLOW_DEPRECATED
- BOOL LoadStringW(UINT nID) throw ( CHeap_Exception ) ;
- #endif
- // Access to string implementation buffer as "C" character array
- LPWSTR GetBuffer(int nMinBufLength) throw ( CHeap_Exception ) ;
- void ReleaseBuffer(int nNewLength = -1) throw ( CHeap_Exception ) ;
- LPWSTR GetBufferSetLength(int nNewLength) throw ( CHeap_Exception ) ;
- void FreeExtra() throw ( CHeap_Exception ) ;
- // Use LockBuffer/UnlockBuffer to turn refcounting off
- LPWSTR LockBuffer() ;
- void UnlockBuffer();
- // searching (return starting index, or -1 if not found)
- // look for a single character match
- int Find(WCHAR ch) const; // like "C" strchr
- int FindOneOf(LPCWSTR lpszCharSet) const;
- int ReverseFind(WCHAR ch) const;
- // look for a specific sub-string
- int Find(LPCWSTR lpszSub) const; // like "C" strstr
- // upper/lower/reverse conversion
- void MakeUpper() throw ( CHeap_Exception ) ;
- void MakeLower() throw ( CHeap_Exception ) ;
- void MakeReverse() throw ( CHeap_Exception ) ;
- // simple sub-string extraction
- CHString Mid(int nFirst, int nCount) const throw ( CHeap_Exception ) ;
- CHString Mid(int nFirst) const throw ( CHeap_Exception ) ;
- CHString Left(int nCount) const throw ( CHeap_Exception ) ;
- CHString Right(int nCount) const throw ( CHeap_Exception ) ;
- CHString SpanIncluding(LPCWSTR lpszCharSet) const throw ( CHeap_Exception ) ;
- CHString SpanExcluding(LPCWSTR lpszCharSet) const throw ( CHeap_Exception ) ;
- // trimming whitespace (either side)
- void TrimRight() throw ( CHeap_Exception ) ;
- void TrimLeft() throw ( CHeap_Exception ) ;
-
- // printf-like formatting using passed string
- void __cdecl Format(LPCWSTR lpszFormat, ...) throw ( CHeap_Exception ) ;
- void FormatV(LPCWSTR lpszFormat, va_list argList);
- // printf-like formatting using referenced string resource
- #ifdef FRAMEWORK_ALLOW_DEPRECATED
- void __cdecl Format(UINT nFormatID, ...) throw ( CHeap_Exception ) ;
- #endif
- // format using FormatMessage API on passed string
- // Warning: if you pass string inserts to this function, they must
- // be LPCSTRs on Win9x and LPCWSTRs on NT.
- void __cdecl FormatMessageW(LPCWSTR lpszFormat, ...) throw ( CHeap_Exception ) ;
- // format using FormatMessage API on referenced string resource
- // Warning: if you pass string inserts to this function, they must
- // be LPCSTRs on Win9x and LPCWSTRs on NT.
- #ifdef FRAMEWORK_ALLOW_DEPRECATED
- void __cdecl FormatMessageW(UINT nFormatID, ...) throw ( CHeap_Exception ) ;
- #endif
- #ifndef _NO_BSTR_SUPPORT
- // OLE BSTR support (use for OLE automation)
- BSTR AllocSysString() const throw ( CHeap_Exception ) ;
- #endif
- };
- inline BOOL operator==(const CHString& s1, const CHString& s2) { return s1.Compare(s2) == 0; }
- inline BOOL operator==(const CHString& s1, LPCWSTR s2) { return s1.Compare(s2) == 0; }
- inline BOOL operator!=(const CHString& s1, const CHString& s2) { return s1.Compare(s2) != 0; }
- inline BOOL operator!=(const CHString& s1, LPCWSTR s2) { return s1.Compare(s2) != 0; }
- inline BOOL operator<(const CHString& s1, const CHString& s2) { return s1.Compare(s2) < 0; }
- inline BOOL operator<(const CHString& s1, LPCWSTR s2) { return s1.Compare(s2) < 0; }
- inline BOOL operator>(const CHString& s1, const CHString& s2) { return s1.Compare(s2) > 0; }
- inline BOOL operator>(const CHString& s1, LPCWSTR s2) { return s1.Compare(s2) > 0; }
- inline BOOL operator<=(const CHString& s1, const CHString& s2) { return s1.Compare(s2) <= 0; }
- inline BOOL operator<=(const CHString& s1, LPCWSTR s2) { return s1.Compare(s2) <= 0; }
- inline BOOL operator>=(const CHString& s1, const CHString& s2) { return s1.Compare(s2) >= 0; }
- inline BOOL operator>=(const CHString& s1, LPCWSTR s2) { return s1.Compare(s2) >= 0; }
- #endif