22#pragma comment(user,"T-Coverage Disable")
35#define gpStrNull (LPCVOID)(&(g_plNullBase[3]))
120 INDEX index = ite -
begin();
122 return begin() + index;
155 ::InterlockedIncrement(str.m_GetRefP());
156 m_lpBuf = str.m_lpBuf;
170 if ( lpText != NULL && *lpText != 0 )
172 m_lpBuf = ms_NewBuf(TYP(), lpText);
186 if ( lpText != NULL && *lpText != 0 )
188 m_lpBuf = ms_NewBuf(TYP(), lpText);
199 if ( m_lpBuf !=
static_cast<const TYP*
>(gpStrNull) )
201 if ( ::InterlockedDecrement(m_GetRefP()) <= 0 )
225 ::InterlockedIncrement(other.m_GetRefP());
226 m_SetBuf(other.m_lpBuf);
242 if ( lpText != NULL && *lpText != 0 )
244 m_SetBuf(ms_NewBuf(TYP(), lpText));
260 if ( lpText != NULL && *lpText != 0 )
262 m_SetBuf(ms_NewBuf(TYP(), lpText));
284 else if ( iLen <= 0 )
290 TYP* P = ms_NewBuf(TYP(), ms_NullStr(), iLen);
293 ms_CalcInfoPointer(P)->lLength = iLen;
306 return m_AddText(lpText);
316 return m_AddText(lpText);
349 void FormatV(
const TYP* lpszFormat, va_list V)
351 m_SetBuf(ms_Format(lpszFormat, V));
362 va_start(args, lpszFormat);
371 operator const TYP*(void)
const
394 ASSERT1(
false,
"CStrT::SetAt()",
"範囲外のIndex(%d)が指定されました。", index );
406 void Insert(INDEX index,
const TYP* lpText)
415 if ( *(m_GetRefP()) != 1 || m_GetBufSize() <= iAddSize + iNowSize )
417 TYP* P = ms_NewBuf(TYP(), m_lpBuf, iAddSize);
421 for ( INT_PTR i = iNowSize - index; i >= 0; i-- )
423 m_lpBuf[index + i + iAddSize] = m_lpBuf[index + i];
428 m_lpBuf[index + i] = lpText[i];
430 m_GetInfoP()->lLength = iAddSize + iNowSize;
440 TYP buf[2] = { c, 0 };
456 ASSERT1(
false,
"CStrT::Delete()",
"範囲外のIndex(%d)が指定されました。", index );
461 ASSERT1(
false,
"CStrT::Delete()",
"範囲外の長さ(%d)が指定されました。", 0 );
473 for (
size_t i = index; i < iSize; i++ )
475 m_lpBuf[i] = m_lpBuf[i + iDelSize];
478 m_GetInfoP()->lLength -= iDelSize;
493 m_lpBuf[len - 1] = 0;
494 m_GetInfoP()->lLength -= 1;
508 return m_lpBuf[index];
510 ASSERT1(
false,
"CStrT::GetAt()",
"範囲外のIndex(%d)が指定されました。", index );
520 return m_GetInfoP()->lLength;
530 return m_GetInfoP()->lLength == 0;
540 INT_PTR
Find(TYP t, INDEX iFromIndex = 0)
const
552 INT_PTR
Find(
const TYP* lpsz, INDEX iFromIndex = 0)
const
564 INT_PTR
FindOneOf(
const TYP* lpsz, INDEX iFromIndex = 0)
const
766 CStrT Mid(INDEX iOffset,
size_t iSize = INVALID_SIZE)
const
770 if ( l > iOffset && iSize != 0 )
772 if ( iSize == INVALID_SIZE || iOffset + iSize > l )
777 if (
sizeof(TYP) == 1 )
780 while ( iPos < iSize )
786 TYP* P = ms_NewBuf(TYP(), ms_NullStr(), iSize);
787 MemCopy(P, &m_lpBuf[iOffset], iSize);
789 ms_CalcInfoPointer(P)->lLength = iSize;
803 return Mid(0, iSize);
814 if (
static_cast<size_t>(iSize) > l )
818 return Mid(l - iSize);
829 CStrT str = lpszBefore;
842 int ToInt(INDEX iOffset = 0,
int iBase = 10)
const
859 DWORD
ToDword(INDEX iOffset = 0,
int iBase = 10)
const
916 size_t lNowBufSize = m_GetBufSize();
917 if ( lNowBufSize == 0 )
922 m_SetBuf(ms_New(TYP(), iLength + 1));
930 else if ( lNowBufSize < iLength )
933 TYP* P = ms_New(TYP(), iLength);
934 MemCopy(P, m_lpBuf, lNowBufSize);
937 else if ( *(m_GetRefP()) > 1 )
940 TYP* P = ms_New(TYP(), lNowBufSize);
941 MemCopy(P, m_lpBuf, lNowBufSize);
944 m_GetInfoP()->lLength = 0;
956 if ( *(m_GetRefP()) == 1 )
970 return m_TrimLeft(t);
981 return m_TrimLeft(lpsz);
992 return m_TrimRight(t);
1003 return m_TrimRight(lpsz);
1015 return m_TrimRight(t);
1027 return m_TrimRight(lpsz);
1040 return m_Replace(tOld, tNew);
1053 return m_Replace(lpszOld, tNew);
1063 int Replace(
const TYP* lpszOld,
const TYP* lpszNew)
1066 if ( lpszOld != NULL)
1069 size_t iNewLen = (lpszNew == NULL) ? 0 :
STRLIB::GetLen(lpszNew);
1078 index = r + iOldLen;
1080 iLength += (iNewLen - iOldLen) * iCount;
1082 TYP* P = ms_NewBuf(TYP(), ms_NullStr(), iLength);
1084 TYP* pOld = m_lpBuf;
1089 MemCopy(pNew, lpszNew, iNewLen);
1096 m_GetInfoP()->lLength = iLength;
1110 TYP aBuf[2] = {t, 0};
1111 const TYP* P = NULL;
1125 if ( r >= 0 && _pstrRest != NULL )
1127 *_pstrRest =
Mid(r + 1);
1209 va_start(args, lpszFormat);
1211 str.
FormatV(lpszFormat, args);
1224 TYP* P = ms_NewBuf(TYP(), ms_NullStr(), length);
1230 ms_CalcInfoPointer(P)->lLength = length;
1246 TYP* P = ms_NewBuf(TYP(), ms_NullStr(), iSize * l);
1256 ms_CalcInfoPointer(P)->lLength = iSize * l;
1271 template<
typename ITE>
1275 while ( is != ie && *is != 0 && max-- != 0)
1291 int iLen = ::GetWindowTextLength(hWnd);
1295 ::GetWindowText(hWnd, m, iLen + 1);
1296 s.m_SetBuf(ms_NewBuf(TYP(), m));
1326 template<
typename TYP>
1334 CGroupT(TYP c) : m_char(c), m_lpsz(NULL)
1341 CGroupT(
const TYP* lpsz) : m_char(0), m_lpsz(lpsz)
1363 CStrT& m_TrimLeft(CGroupT<TYP> t)
1369 if ( ! t.IsEqual(m_lpBuf[i]) )
1371 m_GetInfoP()->lLength -= i;
1372 for (
size_t j = 0; i < l + 1; i++, j++ )
1374 m_lpBuf[j] = m_lpBuf[i];
1390 CStrT& m_TrimRight(CGroupT<TYP> t)
1394 for ( INT_PTR i = l - 1; i >= 0; i-- )
1396 if ( ! t.IsEqual(m_lpBuf[i]) )
1398 m_GetInfoP()->lLength =
static_cast<size_t>(i + 1);
1416 int m_Replace(CGroupT<TYP> tOld, TYP tNew)
1425 if ( tOld.IsEqual(m_lpBuf[i]) )
1452 static TInfo* ms_CalcInfoPointer(LPVOID lpsz)
1454 BYTE* B =
static_cast<BYTE*
>(lpsz);
1455 return reinterpret_cast<TInfo*
>(B -
sizeof(TInfo));
1464 static char* ms_New(
char d,
size_t iLen)
1466 BYTE* B =
new BYTE[iLen +
sizeof(TInfo)];
1467 TInfo* I =
reinterpret_cast<TInfo*
>(B);
1471 return reinterpret_cast<char*
>(B +
sizeof(TInfo));
1480 static WCHAR* ms_New(WCHAR d,
size_t iLen)
1482 BYTE* B =
new BYTE[iLen *
sizeof(WCHAR) +
sizeof(TInfo)];
1483 TInfo* I =
reinterpret_cast<TInfo*
>(B);
1487 return reinterpret_cast<WCHAR*
>(B +
sizeof(TInfo));
1494 static void ms_Delete(LPVOID pMem)
1496 ASSERTLIB( pMem != gpStrNull );
1497 BYTE* B =
static_cast<BYTE*
>(pMem);
1498 delete[] (B -
sizeof(TInfo));
1507 template<
typename T>
1508 static T* ms_Format(
const T* lpsz, va_list V)
1517 T* X = ms_New(T(), r + 1);
1520 ms_CalcInfoPointer(X)->lLength = r;
1534 static size_t ms_GetSecureSize(
size_t iSize,
size_t iExSize = INVALID_SIZE)
1536 if ( iExSize != INVALID_SIZE )
1539 size_t l = iSize / 8;
1540 l = (l < 4) ? 4 : ((l > 1024) ? 1024 : l);
1554 static LPSTR ms_NewBuf(
char d, LPCSTR lpsz,
size_t iExSize = INVALID_SIZE)
1561 LPSTR P = ms_New(
char(), ms_GetSecureSize(iSize, iExSize));
1563 ms_CalcInfoPointer(P)->lLength = iSize;
1574 static LPSTR ms_NewBuf(
char d, LPCWSTR lpsz,
size_t iExSize = INVALID_SIZE)
1576 int size = ::WideCharToMultiByte(CP_ACP, 0, lpsz, -1, NULL, 0, NULL, NULL);
1577 char* P = ms_New(
char(), ms_GetSecureSize(size, iExSize));
1579 ms_CalcInfoPointer(P)->lLength = size - 1;
1590 static LPWSTR ms_NewBuf(WCHAR d, LPCSTR lpsz,
size_t iExSize = INVALID_SIZE)
1592 int size = ::MultiByteToWideChar(CP_ACP, 0, lpsz, -1, NULL, 0);
1593 WCHAR* P = ms_New(WCHAR(), ms_GetSecureSize(size, iExSize));
1595 ms_CalcInfoPointer(P)->lLength = size - 1;
1607 static LPWSTR ms_NewBuf(WCHAR d, LPCWSTR lpsz,
size_t iExSize = INVALID_SIZE)
1614 LPWSTR P = ms_New(WCHAR(), ms_GetSecureSize(iSize, iExSize));
1616 ms_CalcInfoPointer(P)->lLength = iSize;
1624 static const TYP* ms_NullStr(
void)
1626 return static_cast<const TYP*
>(gpStrNull);
1630 static void ms_strlwr(LPSTR _p)
1636 static void ms_strlwr(LPWSTR _p)
1642 static void ms_strupr(LPSTR _p)
1648 static void ms_strupr(LPWSTR _p)
1658 void m_InitBuf(
void)
1660 const TYP* P =
static_cast<const TYP*
>(gpStrNull);
1661 m_lpBuf =
const_cast<TYP*
>(P);
1668 TInfo* m_GetInfoP(
void)
const
1670 return ms_CalcInfoPointer(m_lpBuf);
1677 LONG* m_GetRefP(
void)
const
1679 return &(m_GetInfoP()->lRef);
1686 size_t m_GetBufSize(
void)
const
1688 return m_GetInfoP()->lBufSize;
1696 void m_SetBuf(TYP* P)
1703 void m_Separate(
void)
1705 if ( *(m_GetRefP()) > 1 )
1708 TYP* P = ms_NewBuf(TYP(), m_lpBuf);
1718 template<
typename T>
1719 CStrT& m_AddText(
const T* lpText)
1721 if ( lpText != NULL && *lpText != 0 )
1723 TYP* pNew = ms_NewBuf(TYP(), lpText);
1724 size_t iAddSize = ms_CalcInfoPointer(pNew)->lLength;
1726 if ( *(m_GetRefP()) == 1 && m_GetBufSize() > iAddSize + iNowSize )
1728 MemCopy(&m_lpBuf[iNowSize], pNew, iAddSize + 1);
1732 TYP* P = ms_NewBuf(TYP(), m_lpBuf, iAddSize);
1733 MemCopy(&P[iNowSize], pNew, iAddSize + 1);
1736 m_GetInfoP()->lLength = iAddSize + iNowSize;
1850 TRACE0(
"Serialize[string(ascii)]\n");
1852 ASSERTLIB( l >= 0 );
1854 size_t iSize = (l + 1) *
sizeof(
char);
1882 TRACE0(
"Deserialize[string(ascii)]\n");
1904 TRACE0(
"Serialize[string(unicode)]\n");
1906 ASSERTLIB( l >= 0 );
1908 size_t iSize = (l + 1) *
sizeof(WCHAR);
1936 TRACE0(
"Deserialize[string(unicode)]\n");
1983#pragma comment(user,"T-Coverage Enable")
#define loop(VAR, CNT)
loop構文.
HWND GetSafeHwnd(void) const
[取得] ウィンドウハンドル取得.
iterator insert(iterator ite, const TYP &t=TYP())
[反復] 挿入
CStrT & TrimLeft(TYP t=' ')
[処理] 先頭から文字をトリム.
INT_PTR ReverseFind(TYP t) const
[確認] 検索(後ろから)
int CompareByOption(const TYP *lpszSubject, DWORD dwCmpFlags) const
[確認] 文字列比較(比較オプション指定)
void FormatV(const TYP *lpszFormat, va_list V)
[代入] 書式付き文字列代入.
const_iterator end(void) const
[反復] 最後const_iterator.
INT_PTR ReverseFindOneOf(const TYP *lpsz) const
[確認] 検索(後ろから)
static CStrT FromWindowText(CWnd *pcWnd)
[代入] WindowText代入.
int Compare(const TYP *lpszSubject) const
[確認] 文字列比較
int Replace(const TYP *lpszOld, TYP tNew)
[処理] 文字置換.
void InsertAt(INDEX index, TYP c)
[挿入] 文字挿入
bool IsEmpty(void) const
[確認] 空チェック
iterator begin(void)
[反復] 先頭iterator.
bool operator>(const TYP *lpszSubject) const
[確認] 文字列比較
DWORD ToDword(INDEX iOffset=0, int iBase=10) const
[取得] 数値(DWORD)へ変換
CStrT Left(size_t iSize) const
[作成] 範囲取得.
static CStrT FromWindowText(HWND hWnd)
[代入] WindowText代入.
int Replace(const TYP *lpszOld, const TYP *lpszNew)
[処理] 文字置換.
const TYP * ReferBuffer(void) const
[取得] バッファ参照.
bool operator!=(const TYP *lpszSubject) const
[確認] 文字列比較
void ReleaseBuffer(void)
[操作] 割り当てたバッファを開放.
void push_back(TYP t)
[反復] 最後に追加
void Insert(INDEX index, const TYP *lpText)
[挿入] 文字列挿入
INT_PTR FindOneOf(const TYP *lpsz, INDEX iFromIndex=0) const
[確認] 検索.
size_t GetLength(void) const
[取得] 文字列長
static CStrT ToHexString(DWORD value, size_t width)
[設定] DWORD型 HEX 文字列化(0パディング付き).
CStrT & TrimLeft(const TYP *lpsz)
[処理] 先頭から文字をトリム.
CStrT & operator=(const char *lpText)
[代入] 代入(ASCII/SJIS用)
CStrT(const WCHAR *lpText)
代入コンストラクタ(UNICODE用)
CStrT & operator+=(const WCHAR *lpText)
[追加] 追加オペレータ(UNICODE用)
int Delete(INDEX index, size_t iLen=1)
[操作] 文字削除.
CStrT Right(INT_PTR iSize) const
[作成] 範囲取得.
CStrT & operator+=(TYP t)
[追加] 追加オペレータ.
static CStrT Fmt(const TYP *lpszFormat,...)
[作成] 書式付き文字列作成
INT_PTR Find(TYP t, INDEX iFromIndex=0) const
[確認] 検索.
CStrT & operator+=(const char *lpText)
[追加] 追加オペレータ(ASCII/SJIS用)
int Remove(TYP t)
[処理] 文字削除.
CStrT & Trim(const TYP *lpsz)
[処理] 両端から文字をトリム.
bool operator<=(const TYP *lpszSubject) const
[確認] 文字列比較
CStrT & operator=(const CStrT &other)
[代入] コピーオペレータ
LONGLONG ToLonglong(INDEX iOffset=0) const
[取得] 数値(LONGLONG)へ変換
void DeleteLast(void)
[操作] 最終文字削除.
bool operator==(const TYP *lpszSubject) const
[確認] 文字列比較
CStrT & TrimRight(TYP t=' ')
[処理] 末尾から文字をトリム.
static CStrT DwordToString(DWORD value)
[設定] DWORD型文字列化.
bool operator<(const TYP *lpszSubject) const
[確認] 文字列比較
bool IsEqual(const TYP *lpszSubject) const
[確認] 文字列比較
TYP GetAt(INDEX index) const
[取得] 一文字取得
void MakeUpper(void)
[変換] 大文字化
bool IsEqualNoCase(const TYP *lpszSubject) const
[確認] 文字列比較(大小区別無く比較)
void SetAt(INDEX index, TYP t)
[操作] 一文字置き換え
CStrT & operator=(const WCHAR *lpText)
[代入] 代入(UNICODE用)
double ToDouble(INDEX iOffset=0) const
[取得] 数値(double)へ変換
CStrT(const char *lpText)
代入コンストラクタ(ASCII/SJIS用)
CStrT & TrimRight(const TYP *lpsz)
[処理] 末尾から文字をトリム.
CStrT & SetFromLeft(const TYP *lpText, size_t iLen)
[代入] 文字数制限代入.
int operator-(const TYP *lpszSubject) const
[確認] 文字列比較.
CStrT & Trim(TYP t=' ')
[処理] 両端から文字をトリム.
CStrT FindCut(TYP c, CStrT *_pstrRest=NULL) const
[作成] 切り分け
INT_PTR Find(const TYP *lpsz, INDEX iFromIndex=0) const
[確認] 検索.
INT_PTR ReverseFind(const TYP *lpsz) const
[確認] 検索(後ろから)
const_iterator begin(void) const
[反復] 先頭const_iterator.
int Replace(TYP tOld, TYP tNew)
[処理] 文字置換.
CStrT Sandwich(const TYP *lpszBefore, const TYP *lpszAfter) const
[作成] 前後連結.
static CStrT Lineup(const TYP *lpsz, int iSize)
[作成] 指定文字を並べた文字列作成
static CStrT IntToString(int value)
[設定] int型文字列化.
void Format(const TYP *lpszFormat,...)
[代入] 書式付き文字列代入.
int CompareNoCase(const TYP *lpszSubject) const
[確認] 文字列比較(大小区別無く比較)
bool operator>=(const TYP *lpszSubject) const
[確認] 文字列比較
static CStrT Lineup(TYP t, size_t length)
[作成] 指定文字を並べた文字列作成
CStrT(const CStrT &str)
コピーコンストラクタ
iterator end(void)
[反復] 最後iterator.
void MakeLower(void)
[変換] 小文字化
void push_front(TYP t)
[反復] 先頭に挿入
CStrT Mid(INDEX iOffset, size_t iSize=INVALID_SIZE) const
[作成] 範囲取得.
static CStrT FromIterator(ITE is, ITE ie=ITE(), size_t max=INVALID_SIZE)
[代入] イテレータ代入.
int ToInt(INDEX iOffset=0, int iBase=10) const
[取得] 数値(int)へ変換
TYP * GetBuffer(size_t iLength=0)
[操作] 書き込みバッファ要求.
int GetCharSize(char c)
[取得] 文字のサイズ(ASCII/SJIS用)
int Compare(LPCSTR P1, LPCSTR P2, INT_PTR len=-1, DWORD dwCmpFlags=0)
[比較] 文字列比較(ASCII/SJIS用)
INT_PTR IndexOf(LPCSTR lpszText, char c, INDEX iFromIndex=0)
[検索] 文字検索(ASCII/SJIS用)
size_t GetLen(LPCSTR lpsz)
[計算] 文字列長計算(ASCII/SJIS用)
TNB::CStrT< char > CAscii
ASCII文字列クラス
LONGLONG ToLonglong(LPCSTR lpsz)
[変換] LONGLONG変換(ASCII/SJIS用)
INT_PTR IndexOneOf(LPCSTR lpszText, LPCSTR lpszMark, INDEX iFromIndex=0)
[検索] 文字セット検索(ASCII/SJIS用)
TNB::CStrT< WCHAR > CUnicode
UNICODE文字列クラス
DWORD ToDword(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
CAscii operator+(LPCSTR lpsz, const CAscii &str)
文字列加算(ASCII/SJIS用).
TNB::CStrT< TCHAR > CStr
文字列クラス
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
double ToDouble(LPCSTR lpsz)
[変換] double変換(ASCII/SJIS用)
bool IsInRange(INDEX value, size_t size)
[確認] 範囲チェック.
ISerializer & operator<<(ISerializer &_sr, const CBitSet &t)
[追加] シリアライズ
const IDeserializer & operator>>(const IDeserializer &ds, CBitSet &_t)
[取得] デシリアライズ
DWORD CalcHash(const IConstCollectionT< TYP > &c)
COLLECT [HASH] ハッシュ値計算.
bool VPrintF(LPSTR _pWork, size_t iLen, LPCSTR lpFmt, va_list V)
[作成] 書式付き文字列作成(ASCII/SJIS用)
void MemCopy(T *_pDst, const void *pSrc, size_t len)
[複製] メモリコピー
virtual void GetRaw(size_t size, LPVOID _P) const =0
[取得] 取得.
virtual void AddRaw(size_t size, LPCVOID P)=0
[追加] 追加.