www.pudn.com > acdx.rar > StringEx.h


#if !defined(StringEx_H) 
#define StringEx_H 
 
// disable long template name warning 
#pragma warning( disable:4786 ) 
#pragma warning( disable:4172 ) 
 
#if !defined(_WINDOWS_) 
///#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers 
#include  
#include  
#endif 
 
#include "sfc.h" 
 
#define	SS_NO_REFCOUNT 
#include "stdstring.h" 
 
//##ModelId=424BB64103A4 
typedef CStdStr	StringEx; 
 
#include "stringlist.h" 
 
#if 0 
 
#include  
#include  
#include  
#include  
 
// using std::string; 
 
/* 
#if defined(UNICODE) 
#undef string 
#define	string wstring 
#endif 
*/ 
 
////////////////////////////////////////////////////////////////////////////// 
// StringEx 
// 
// Purpose:		to extend the stl class string 
 
 
class SFC_CLASS_STG StringEx : 
	public string 
{ 
public: 
 
	StringEx () : 
	  string () 
	{} 
 
	StringEx ( TCHAR ch ) : 
	  string ( "" ) 
	{ *this = ch; } 
 
	StringEx ( LPCTSTR str ) : 
	  string ( str ) 
	{} 
 
	StringEx ( LPCTSTR str, int len ) : 
	  string (str,len) 
	{} 
 
	StringEx ( LPWSTR wstr ) : 
	  string () 
		{ *this = wstr; } 
 
	StringEx ( string & str ) : 
	  string ( str ) 
	{} 
 
	StringEx ( const StringEx & str ) : 
	  string ( str ) 
	{} 
 
	virtual ~StringEx () 
	{} 
 
	// release resources 
	void release () 
	{ 
		if ( !empty() ) 
			erase(begin(),end()); 
	} 
 
	// test if empty 
	bool IsEmpty () const 
	{ return empty(); } 
 
	// test if empty 
	void Empty () 
	{ erase(begin(),end()); } 
 
	// get element 
	TCHAR GetAt ( long index ) 
	{ return ( (string &) *this)[index]; } 
 
	long GetLength ()  const 
	{ return size(); } 
 
	LPTSTR GetBufferSetLength ( long index ) 
	{ return (LPTSTR) c_str(); } 
 
	LPTSTR GetBuffer ( long index ) 
	{ return (LPTSTR) c_str(); } 
 
	long Find ( LPCTSTR str ) 
	{ return find(str); } 
 
	long Find ( LPCTSTR str ) const 
	{ return find(str); } 
 
	long Find ( TCHAR str ) 
	{ return find(str); } 
 
	long Find ( TCHAR str ) const 
	{ return find(str); } 
 
	long ReverseFind ( LPCTSTR str ) 
	{ return rfind(str); } 
 
	long ReverseFind ( LPCTSTR str ) const 
	{ return rfind(str); } 
 
	long ReverseFind ( TCHAR str ) 
	{ return rfind(str); } 
 
	long ReverseFind ( TCHAR str ) const 
	{ return rfind(str); } 
 
 
 
	// operators 
	operator string &   ()					{ return (string &) *this; } 
	operator StringEx & ()					{ return *this; } 
	operator LPCTSTR    () const			{ return c_str(); } 
	operator LPTSTR     ()					{ return (LPTSTR) c_str(); } 
 
	void operator =    ( LPCTSTR str )		{ (string &) *this = str; } 
	void operator =    ( LPTSTR str )		{ (string &) *this = str; } 
	void operator =    ( TCHAR str )		{ (string &) *this = str; } 
	void operator =	   ( string & str )		{ (string &) *this = str; } 
	//void operator =	   ( StringEx & str )	{ (string &) *this = (string &) str; } 
	void operator =	   ( const StringEx & str )	{ (string &) *this = (string &) str; } 
	void operator =    ( LPWSTR str ); 
	void operator +=   ( LPWSTR str ); 
 
	TCHAR operator [] ( int index ) 
	{ return (TCHAR) ( (string &) *this )[index]; } 
 
	/* 
	void operator +=   ( StringEx & str ) 
	{ ( (string &) *this ) += (string &) str; } 
 
	void operator +=   ( LPTSTR str ) 
	{ ( (string &) *this ) += str; } 
 
	void operator +=   ( TCHAR str ) 
	{ ( (string &) *this ) += str; } 
	*/ 
 
	StringEx & operator+= ( LPCTSTR lpsz ) 
	{ 
		long   len    = strlen(lpsz); 
		char * buffer = new char[len+1]; 
		 
		if ( buffer ) 
		{ 
			strncpy( buffer, lpsz, len +1 ); 
			((string &) *this) += buffer; 
			delete [] buffer; 
		} 
 
		return *this; 
	} 
 
	StringEx & operator+= ( const StringEx & str ) 
	{ 
		*this += str.c_str(); 
		return *this; 
	} 
 
	StringEx & operator+= ( const string & str ) 
	{ 
		*this += str.c_str(); 
		return *this; 
	} 
 
	StringEx & operator+= ( TCHAR ch ) 
	{ 
		StringEx	str(ch); 
		*this += str.c_str(); 
		return *this; 
	} 
 
	/* 
	StringEx & operator+ ( const StringEx & str ) 
	{ 
		*this + str; 
		return *this; 
	} 
 
	StringEx & operator+ ( const string & str ) 
	{ 
		return (StringEx &) append(str); 
	} 
 
	StringEx & operator+ ( TCHAR ch) 
	{ 
		*this + ch; 
		return *this; 
	} 
 
	StringEx & operator+ ( LPCTSTR lpsz) 
	{ 
		*this + lpsz; 
		return *this; 
	} 
	*/ 
 
	// format a string 
	void Format ( LPCTSTR lpszFormat, ... ); 
 
	// load string resource 
	void LoadString	( int id ); 
 
	// straight character comparison 
	int Compare(LPCTSTR lpsz) const; 
	int Compare(TCHAR lpsz) const; 
 
	// compare ignoring case 
	int CompareNoCase(LPCTSTR lpsz) const; 
 
	// trim white space 
	void TrimRight (); 
	void TrimLeft  (); 
 
	// remove continuous occurrences of chTarget starting from right 
	void TrimRight(TCHAR chTarget); 
	// remove continuous occcurrences of characters in passed string, 
	// starting from right 
	void TrimRight(LPCTSTR lpszTargets); 
	// remove continuous occurrences of chTarget starting from left 
	void TrimLeft(TCHAR chTarget); 
	// remove continuous occcurrences of characters in 
	// passed string, starting from left 
	void TrimLeft(LPCTSTR lpszTargets); 
 
	// advanced manipulation 
 
	// replace occurrences of chOld with chNew 
	int Replace(TCHAR chOld, TCHAR chNew); 
	// replace occurrences of substring lpszOld with lpszNew; 
	// empty lpszNew removes instances of lpszOld 
	int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew); 
	// remove occurrences of chRemove 
	int Remove(TCHAR chRemove); 
	// insert character at zero-based index; concatenates 
	// if index is past end of string 
	int Insert(int nIndex, TCHAR ch); 
	// insert substring at zero-based index; concatenates 
	// if index is past end of string 
	int Insert(int nIndex, LPCTSTR pstr); 
	// delete nCount characters starting at zero-based index 
	int Delete(int nIndex, int nCount = 1); 
 
 
	// allocat and copy 
	void		allocCopy		( StringEx & dest, int copyLen, int copyIndex, 
								  int extraLen ) const; 
 
	StringEx	Mid				( int first ) const; 
	StringEx	Mid				( int first, int count ) const; 
	StringEx	Right			( int count ) const; 
	StringEx	Left			( int count ) const; 
	StringEx	SpanIncluding	( LPCTSTR charSet ) const; 
	StringEx	SpanExcluding	( LPCTSTR charSet ) const; 
 
	// case methods 
	void MakeUpper			(); 
	void MakeLower			(); 
 
	// friends 
	friend StringEx & operator+ ( const StringEx & str2, const StringEx & str1 ); 
	friend StringEx & operator+ ( const StringEx & str2, const string & str1 ); 
	friend StringEx & operator+ ( const StringEx & str2, TCHAR ch ); 
	friend StringEx & operator+ ( const StringEx & str2, LPCTSTR lpsz); 
 
 
 
 
 
}; 
 
// compare helpers 
inline bool operator==(const StringEx& s1, const StringEx& s2) 
{ return s1.Compare(s2) == 0; } 
 
inline bool operator==(const StringEx& s1, LPCTSTR s2) 
{ return s1.Compare(s2) == 0; } 
 
inline bool operator==(LPCTSTR s1, const StringEx& s2) 
{ return s2.Compare(s1) == 0; } 
 
inline bool operator!=(const StringEx& s1, const StringEx& s2) 
{ return s1.Compare(s2) != 0; } 
 
inline bool operator!=(const StringEx& s1, LPCTSTR s2) 
{ return s1.Compare(s2) != 0; } 
 
 
inline bool operator!=(const LPCTSTR & s1, const StringEx& s2) 
{ return s2.Compare(s1) != 0; } 
 
inline bool operator<(const StringEx& s1, const StringEx& s2) 
{ return s1.Compare(s2) < 0; } 
 
inline bool operator<(const StringEx& s1, LPCTSTR s2) 
{ return s1.Compare(s2) < 0; } 
 
inline bool operator<(LPCTSTR s1, const StringEx& s2) 
{ return s2.Compare(s1) > 0; } 
 
inline bool operator>(const StringEx& s1, const StringEx& s2) 
{ return s1.Compare(s2) > 0; } 
 
inline bool operator>(const StringEx& s1, LPCTSTR s2) 
{ return s1.Compare(s2) > 0; } 
 
 
inline bool operator>(LPCTSTR s1, const StringEx& s2) 
{ return s2.Compare(s1) < 0; } 
 
inline bool operator<=(const StringEx& s1, const StringEx& s2) 
{ return s1.Compare(s2) <= 0; } 
 
inline bool operator<=(const StringEx& s1, LPCTSTR s2) 
{ return s1.Compare(s2) <= 0; } 
 
inline bool operator<=(LPCTSTR s1, const StringEx& s2) 
{ return s2.Compare(s1) >= 0; } 
 
inline bool operator>=(const StringEx& s1, const StringEx& s2) 
{ return s1.Compare(s2) >= 0; } 
 
inline bool operator>=(const StringEx& s1, LPCTSTR s2) 
{ return s1.Compare(s2) >= 0; } 
 
inline bool operator>=(LPCTSTR s1, const StringEx& s2) 
{ return s2.Compare(s1) <= 0; } 
 
 
inline 
StringEx & operator+ ( const StringEx & str2, const StringEx & str1 ) 
{ 
	StringEx str = str2 + str1.c_str(); 
	return StringEx(str); 
} 
 
inline 
StringEx & operator+ ( const StringEx & str2, const string & str1 ) 
{ 
	// get buffer 
	long   len    = str1.size(); 
	char * buffer = new char[len+1]; 
	 
	if ( buffer ) 
	{ 
		_tcsncpy( buffer, str1.c_str(), len + 1 ); 
		((string &) *this) += buffer; 
		delete [] buffer; 
	} 
 
	StringEx str = str2 + str1.c_str(); 
	return StringEx(str); 
} 
 
inline 
StringEx & operator+ ( const StringEx & str2, TCHAR ch ) 
{ 
	str2.append(1, ch); 
	StringEx	c(ch); 
	StringEx str = str2 + c.c_str(); 
	return StringEx(str); 
} 
 
inline 
StringEx & operator+ ( const StringEx & str2, LPCTSTR lpsz) 
{ 
	StringEx str = str2 + StringEx(lpsz); 
	return StringEx(str); 
} 
 
 
////////////////////////////////////////////////////////////////////////////////////// 
// StringList 
 
 
class StringList : 
	public std::vector 
{ 
public: 
 
	StringList () : 
	  std::vector () 
	{} 
 
	StringList ( int noElements ) : 
	  std::vector (noElements) 
	{} 
 
	virtual ~StringList () 
	{ release(); } 
 
 
	void release () 
	{ 
		if ( !empty() ) 
			erase(begin(),end()); 
	} 
 
	// test if empty 
	bool IsEmpty () 
	{ return empty(); } 
 
	// get list size 
	long GetSize () 
	{ return size(); } 
 
	// get element 
	string GetAt ( long index ) 
	{ return ( (std::vector &) *this)[index]; } 
 
	// clear list 
	void RemoveAll () 
	{ clear(); } 
 
	// embedded string methods 
	void getEmbeddedStr		( string & embeddedStr ); 
	void setEmbeddedStr		( string & embeddedStr ); 
	void appendEmbeddedStr	( string & embeddedStr ); 
 
	// remove duplicates from list 
	void removeDuplicates	(); 
 
	// list manipulation methods 
	void operator -=		( StringList & list ); 
	void operator +=		( StringList & list ); 
	void operator  =		( StringList & list ); 
 
	// add a string 
	void operator << (  const string & depends ) 
	{ 
		push_back( depends ); 
	} 
 
	void operator << ( LPTSTR depends ) 
	{ 
		string dependsStr = depends; 
		push_back( dependsStr ); 
	} 
 
 
	void Add ( LPTSTR depends ) 
	{ 
		string dependsStr = depends; 
		push_back( dependsStr ); 
	} 
 
	void Add ( string & depends ) 
	{ 
		push_back( depends ); 
	} 
 
}; 
 
 
	typedef std::vector::iterator itrString; 
 
 
 
 
 
////////////////////////////////////////////////////////////////////////////////////// 
// UIntList 
 
 
class UIntList : 
	public std::vector 
{ 
public: 
 
	UIntList () : 
	  std::vector () 
	{} 
 
	UIntList ( int noElements ) : 
	  std::vector (noElements) 
	{} 
 
	virtual ~UIntList () 
	{ release(); } 
 
 
	void release () 
	{ 
		if ( !empty() ) 
			erase(begin(),end()); 
	} 
 
	// clear list 
	void RemoveAll () 
	{ clear(); } 
 
	// get list size 
	long GetSize () 
	{ return size(); } 
 
	// get element 
	UINT GetAt ( long index ) 
	{ return ( (std::vector &) *this)[index]; } 
 
 
	// list manipulation methods 
	void operator -=		( UIntList & list ); 
	void operator +=		( UIntList & list ); 
	void operator  =		( UIntList & list ); 
 
	// add a string 
	void operator << (  const UINT value ) 
	{ 
		push_back( value ); 
	} 
 
 
	void Add ( UINT value ) 
	{ 
		push_back( value ); 
	} 
 
}; 
 
 
	typedef std::vector::iterator itrUInt; 
 
 
#endif // 0 
 
#endif