You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
246 lines
8.5 KiB
246 lines
8.5 KiB
/*--------------------------------------------------------------------------*
|
|
*
|
|
* Microsoft Windows
|
|
* Copyright (C) Microsoft Corporation, 1992 - 1999
|
|
*
|
|
* File: tstring.h
|
|
*
|
|
* Contents: Interface file for tstring
|
|
*
|
|
* History: 28-Oct-98 jeffro Created
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#ifndef TSTRING_H
|
|
#define TSTRING_H
|
|
#pragma once
|
|
|
|
#include <string> // for std::wstring, std::string
|
|
#include <objidl.h> // for IStream
|
|
#include <commctrl.h>
|
|
#include "mmc.h"
|
|
#include "ndmgr.h" // for MMC_STRING_ID
|
|
#include "ndmgrpriv.h"
|
|
#include "stddbg.h" // for ASSERT
|
|
#include "mmcptrs.h" // for IStringTablePrivatePtr
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* tstring
|
|
*
|
|
* A tstring is a native-format (ANSI/Unicode) Standard C++ string that:
|
|
*
|
|
* 1. always persists itself in Unicode format, and
|
|
* 2. supports LoadString, like MFC CStrings
|
|
*
|
|
* For ANSI, we provide IStream insertion and extraction operators that
|
|
* will automatically convert to Unicode on stream insertion and from
|
|
* Unicode on stream extraction.
|
|
*
|
|
* All base class member functions that return a base class instance (and
|
|
* overloads), like substr:
|
|
*
|
|
* std::string std::string::substr (size_type pos, size_type n) const;
|
|
*
|
|
* must have forwarder functions here, so tstring supports such constructs
|
|
* as:
|
|
*
|
|
* tstring strStuff;
|
|
* *pStream << strStuff.substr(4, 6);
|
|
*
|
|
* If we didn't have forwarder functions in tstring, then an instance of
|
|
* the base class type would be inserted in the stream instead of a tstring.
|
|
* For Unicode, that wouldn't be a problem; but for ANSI, we'd end up
|
|
* inserting a std::string into the stream in non-Unicode format. That
|
|
* would defeat the purpose of having this class.
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#ifdef UNICODE
|
|
typedef std::wstring tstring_BaseClass;
|
|
#else
|
|
typedef std::string tstring_BaseClass;
|
|
#endif
|
|
|
|
class tstring : public tstring_BaseClass
|
|
{
|
|
typedef tstring_BaseClass BaseClass;
|
|
|
|
public:
|
|
explicit tstring (const allocator_type& al = allocator_type());
|
|
|
|
tstring (const tstring& other);
|
|
tstring (const BaseClass& other);
|
|
tstring (const tstring& other, size_type pos, size_type n);
|
|
tstring (const BaseClass& other, size_type pos, size_type n);
|
|
tstring (const TCHAR* psz);
|
|
tstring (const TCHAR* psz, size_type n);
|
|
tstring (size_type n, TCHAR ch);
|
|
tstring (const_iterator first, const_iterator last);
|
|
|
|
tstring& operator= (const tstring& other);
|
|
tstring& operator= (const BaseClass& other);
|
|
tstring& operator= (TCHAR ch);
|
|
tstring& operator= (const TCHAR* psz);
|
|
|
|
tstring& operator+= (const tstring& strToAppend);
|
|
tstring& operator+= (const BaseClass& strToAppend);
|
|
tstring& operator+= (TCHAR chToAppend);
|
|
tstring& operator+= (const TCHAR* pszToAppend);
|
|
|
|
tstring& append (const tstring& str);
|
|
tstring& append (const BaseClass& str);
|
|
tstring& append (const tstring& str, size_type pos, size_type n);
|
|
tstring& append (const BaseClass& str, size_type pos, size_type n);
|
|
tstring& append (const TCHAR* psz);
|
|
tstring& append (const TCHAR* psz, size_type n);
|
|
tstring& append (size_type n, TCHAR ch);
|
|
tstring& append (const_iterator first, const_iterator last);
|
|
|
|
tstring& assign (const tstring& str);
|
|
tstring& assign (const BaseClass& str);
|
|
tstring& assign (const tstring& str, size_type pos, size_type n);
|
|
tstring& assign (const BaseClass& str, size_type pos, size_type n);
|
|
tstring& assign (const TCHAR* psz);
|
|
tstring& assign (const TCHAR* psz, size_type n);
|
|
tstring& assign (size_type n, TCHAR ch);
|
|
tstring& assign (const_iterator first, const_iterator last);
|
|
|
|
tstring& insert (size_type p0, const tstring& str);
|
|
tstring& insert (size_type p0, const BaseClass& str);
|
|
tstring& insert (size_type p0, const tstring& str, size_type pos, size_type n);
|
|
tstring& insert (size_type p0, const BaseClass& str, size_type pos, size_type n);
|
|
tstring& insert (size_type p0, const TCHAR* psz, size_type n);
|
|
tstring& insert (size_type p0, const TCHAR* psz);
|
|
tstring& insert (size_type p0, size_type n, TCHAR ch);
|
|
iterator insert (iterator it, TCHAR ch);
|
|
void insert (iterator it, size_type n, TCHAR ch);
|
|
void insert (iterator it, const_iterator first, const_iterator last);
|
|
|
|
tstring& erase (size_type p0 = 0, size_type n = npos);
|
|
iterator erase (iterator it);
|
|
iterator erase (iterator first, iterator last);
|
|
|
|
tstring& replace (size_type p0, size_type n0, const tstring& str);
|
|
tstring& replace (size_type p0, size_type n0, const BaseClass& str);
|
|
tstring& replace (size_type p0, size_type n0, const tstring& str, size_type pos, size_type n);
|
|
tstring& replace (size_type p0, size_type n0, const BaseClass& str, size_type pos, size_type n);
|
|
tstring& replace (size_type p0, size_type n0, const TCHAR* psz, size_type n);
|
|
tstring& replace (size_type p0, size_type n0, const TCHAR* psz);
|
|
tstring& replace (size_type p0, size_type n0, size_type n, TCHAR ch);
|
|
tstring& replace (iterator first0, iterator last0, const tstring& str);
|
|
tstring& replace (iterator first0, iterator last0, const BaseClass& str);
|
|
tstring& replace (iterator first0, iterator last0, const TCHAR* psz, size_type n);
|
|
tstring& replace (iterator first0, iterator last0, const TCHAR* psz);
|
|
tstring& replace (iterator first0, iterator last0, size_type n, TCHAR ch);
|
|
tstring& replace (iterator first0, iterator last0, const_iterator first, const_iterator last);
|
|
|
|
tstring substr (size_type pos = 0, size_type n = npos) const;
|
|
|
|
bool LoadString (HINSTANCE hInst, UINT nID);
|
|
};
|
|
|
|
#ifndef UNICODE
|
|
IStream& operator>> (IStream& stm, tstring& task);
|
|
IStream& operator<< (IStream& stm, const tstring& task);
|
|
#endif // UNICODE
|
|
|
|
|
|
|
|
/*+-------------------------------------------------------------------------*
|
|
* CStringTableStringBase
|
|
*
|
|
*
|
|
*--------------------------------------------------------------------------*/
|
|
class CPersistor;
|
|
|
|
class CStringTableStringBase
|
|
{
|
|
public:
|
|
enum
|
|
{
|
|
eNoValue = -1,
|
|
};
|
|
|
|
CStringTableStringBase (IStringTablePrivate* pstp);
|
|
CStringTableStringBase (const CStringTableStringBase& other);
|
|
CStringTableStringBase (IStringTablePrivate* pstp, const tstring& str);
|
|
CStringTableStringBase& operator= (const CStringTableStringBase& other);
|
|
CStringTableStringBase& operator= (const tstring& str);
|
|
CStringTableStringBase& operator= (LPCTSTR psz);
|
|
|
|
virtual ~CStringTableStringBase ();
|
|
|
|
MMC_STRING_ID CommitToStringTable () const;
|
|
void RemoveFromStringTable () const;
|
|
|
|
/* Call Detach if your string is deleted before the string table is.
|
|
* Failing to do so will *remove* your string from the string table.*/
|
|
void Detach()
|
|
{
|
|
m_id = eNoValue;
|
|
}
|
|
|
|
bool operator== (const CStringTableStringBase& other) const
|
|
{
|
|
ASSERT ((m_str == other.m_str) == (m_id == other.m_id));
|
|
return (m_id == other.m_id);
|
|
}
|
|
|
|
bool operator!= (const CStringTableStringBase& other) const
|
|
{
|
|
return (!(*this == other));
|
|
}
|
|
|
|
bool operator== (const tstring& str) const
|
|
{
|
|
return (m_str == str);
|
|
}
|
|
|
|
bool operator!= (const tstring& str) const
|
|
{
|
|
return (m_str != str);
|
|
}
|
|
|
|
bool operator== (LPCTSTR psz) const
|
|
{
|
|
return (m_str == psz);
|
|
}
|
|
|
|
bool operator!= (LPCTSTR psz) const
|
|
{
|
|
return (m_str != psz);
|
|
}
|
|
|
|
LPCTSTR data() const
|
|
{ return (m_str.data()); }
|
|
|
|
tstring str() const
|
|
{ return (m_str); }
|
|
|
|
MMC_STRING_ID id() const
|
|
{ return (m_id); }
|
|
|
|
private:
|
|
void Assign (const CStringTableStringBase& other);
|
|
|
|
mutable IStringTablePrivatePtr m_spStringTable;
|
|
mutable MMC_STRING_ID m_id;
|
|
tstring m_str;
|
|
|
|
friend IStream& operator>> (IStream& stm, CStringTableStringBase& task);
|
|
friend IStream& operator<< (IStream& stm, const CStringTableStringBase& task);
|
|
friend class CPersistor;
|
|
};
|
|
|
|
|
|
template<class _E, class _Tr, class _Al>
|
|
bool IsPartOfString (const std::basic_string<_E, _Tr, _Al>& str, const _E* psz)
|
|
{
|
|
return ((psz >= str.begin()) && (psz <= str.end()));
|
|
}
|
|
|
|
|
|
#include "tstring.inl"
|
|
|
|
|
|
#endif /* TSTRING_H */
|