/*--------------------------------------------------------------------------* * * 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 // for std::wstring, std::string #include // for IStream #include #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 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 */