hxstring.h
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:15k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #ifndef HXSTRING_H
  36. #define HXSTRING_H
  37. #include "hxtypes.h"
  38. #include "hxassert.h"
  39. #include "hlxclib/limits.h"
  40. #include "hlxclib/string.h"
  41. #if defined(HELIX_CONFIG_NOSTATICS)
  42. # include "globals/hxglobalchxstring.h"
  43. #endif
  44. typedef INT32 (*StringGrowthFunc)(INT32 currentSize, INT32 sizeNeeded);
  45. class CHXStringRep
  46. {
  47. public:
  48.     CHXStringRep(INT32 bufSize = 1, bool bSetLength = false);
  49.     CHXStringRep(const char* pStr);
  50.     CHXStringRep(const char* pStr, INT32 bufSize);
  51.     CHXStringRep(char ch, INT32 bufSize);
  52.     ~CHXStringRep();
  53.     
  54.     void AddRef();
  55.     void Release();
  56.     char* GetBuffer();
  57.     INT32 GetStringSize() const;
  58.     INT32 GetBufferSize() const;
  59.     
  60.     void SetStringSize(INT32 strSize);
  61.     void Resize(INT32 newSize);
  62.     void ResizeAndCopy(INT32 newSize, bool bSetLength = false);
  63.     
  64.     void Copy(const char* pStr, INT32 size);
  65.     bool IsShared() const;
  66. private:
  67.     CHXStringRep(const CHXStringRep&);
  68.     CHXStringRep& operator=(const CHXStringRep&);
  69.     INT32 m_refCount;
  70.     INT32 m_strSize;
  71.     INT32 m_bufSize;
  72.     char* m_pData;
  73. };
  74. class HXEXPORT_CLASS CHXString
  75. {
  76. public:
  77.     CHXString(StringGrowthFunc pGrowthFunc = 0);
  78.     CHXString(const CHXString& rhs);
  79.     CHXString(char ch, int length = 1, StringGrowthFunc pGrowthFunc = 0);
  80.     CHXString(const char* pStr, StringGrowthFunc pGrowthFunc = 0);
  81.     CHXString(const char* pStr, int length, StringGrowthFunc pGrowthFunc = 0);
  82.     CHXString(const unsigned char* pStr, StringGrowthFunc pGrowthFunc = 0);
  83.     ~CHXString();
  84.     // Attributes & Operations
  85.     // as an array of characters
  86.     UINT32 GetLength() const;
  87.     BOOL IsEmpty() const;
  88.     void Empty();
  89.     char GetAt(INT32 i) const;
  90.     char operator[](short i) const;
  91.     char operator[](unsigned short i) const;
  92.     char operator[](int i) const;
  93.     char operator[](unsigned int i) const;
  94.     char operator[](long i) const;
  95.     char operator[](unsigned long i) const;
  96.     void SetAt(INT32 i, char ch);
  97.     operator const char*() const;
  98.     bool operator>(const CHXString& rhs) const;
  99.     bool operator>(const char* pStr) const;
  100.     bool operator>(const unsigned char* pStr) const;
  101.     bool operator>=(const CHXString& rhs) const;
  102.     bool operator>=(const char* pStr) const;
  103.     bool operator>=(const unsigned char* pStr) const;
  104.     bool operator==(const CHXString& rhs) const;
  105.     bool operator==(const char* pStr) const;
  106.     bool operator==(const unsigned char* pStr) const;
  107.     bool operator!=(const CHXString& rhs) const;
  108.     bool operator!=(const char* pStr) const;
  109.     bool operator!=(const unsigned char* pStr) const;
  110.     bool operator<=(const CHXString& rhs) const;
  111.     bool operator<=(const char* pStr) const;
  112.     bool operator<=(const unsigned char* pStr) const;
  113.     bool operator<(const CHXString& rhs) const;
  114.     bool operator<(const char* pStr) const;
  115.     bool operator<(const unsigned char* pStr) const;
  116.     const CHXString& operator=(const CHXString& rhs);
  117.     const CHXString& operator=(char ch);
  118.     const CHXString& operator=(const char* pStr);
  119.     const CHXString& operator=(const unsigned char* pStr);
  120.     const CHXString& operator+=(const CHXString& rhs);
  121.     const CHXString& operator+=(char ch);
  122.     const CHXString& operator+=(const char* pStr);
  123.     friend CHXString  operator+(const CHXString& strA, 
  124.  const CHXString& strB);
  125.     friend CHXString  operator+(const CHXString& str, char ch);
  126.     friend CHXString  operator+(char ch , const CHXString& str);
  127.     friend CHXString  operator+(const CHXString& strA, const char* pStrB);
  128.     friend CHXString  operator+(const char* pStrA, const CHXString& strB);
  129.     INT32 Compare(const char* pStr) const;
  130.     INT32 CompareNoCase(const char* pStr) const;
  131.     void Center(short length);
  132.     CHXString Mid(INT32 i, INT32 length) const;
  133.     CHXString Mid(INT32 i) const;
  134.     CHXString Left(INT32 length) const;
  135.     CHXString Right(INT32 length) const;
  136.     
  137.     ULONG32 CountFields(char delim) const;
  138.     CHXString GetNthField(char delim, ULONG32 i, UINT64& state) const;
  139.     CHXString NthField(char delim, ULONG32 i) const;
  140.     CHXString SpanIncluding(const char* pCharSet) const;
  141.     CHXString SpanExcluding(const char* pCharSet) const;
  142.     void MakeUpper();
  143.     void MakeLower();
  144.     void TrimRight();
  145.     void TrimLeft();
  146.     INT32 Find(char ch) const;
  147.     INT32 ReverseFind(char ch) const;
  148.     BOOL FindAndReplace(const char* pSearch , const char* pReplace,
  149. BOOL bReplaceAll = FALSE);
  150.     INT32 Find(const char* pStr) const;
  151.     void Format(const char* pFmt, ...);
  152.     void AppendULONG(ULONG32 value);
  153.     void AppendEndOfLine();
  154.     char* GetBuffer(INT32 minSize);
  155.     void ReleaseBuffer(INT32 newSize = -1);
  156.     char* GetBufferSetLength(INT32 newSize);
  157.     void FreeExtra();
  158.     INT32 GetAllocLength() const;
  159.     INT32 SetMinBufSize(INT32 minSize);
  160. #if defined(_MACINTOSH) || defined(_MAC_UNIX)
  161.     const CHXString& SetFromStr255(const Str255 );
  162.     
  163.     const CHXString& AppendFromStr255(const Str255 );
  164.     const CHXString& InsertFromStr255(const Str255 );
  165.     
  166.     const CHXString& SetFromIndString(short , short );
  167.     
  168.     const CHXString& operator =(FSSpec );
  169.     operator const FSSpec(void);
  170.     
  171.     HX_RESULT MakeStr255(Str255& ) const;
  172. #if !defined(_CARBON) && !defined(_MAC_UNIX)
  173.     operator Str255* (void);
  174.     operator const Str255* (void) const;
  175.     operator ConstStr255Param (void) const;
  176. #else
  177.     const CHXString& operator =(const FSRef& );
  178.     // ConstStr255Param operator disallowed since
  179.     // it's not implemented in Carbon
  180.     //operator ConstStr255Param (void) const;
  181.     operator const FSRef(void);
  182.     const CHXString& operator =(CFStringRef );
  183.     
  184.     HX_RESULT SetFromCFString(CFStringRef , CFStringEncoding );
  185.     
  186.     HX_RESULT SetFromHFSUniStr255(const HFSUniStr255& , CFStringEncoding );
  187.     HX_RESULT MakeHFSUniStr255(HFSUniStr255& , CFStringEncoding ) const;
  188. #endif /* !defined(_CARBON) */
  189. #endif /* _MACINTOSH */
  190. protected:
  191.     void Init(const char* pStr, UINT32 size = UINT_MAX );
  192.     void Nuke();
  193.     void ConcatInPlace(const char* pStr, const UINT32 size);
  194.     void EnsureUnique(); // Make sure that m_pRep is not shared
  195.     void Release();
  196.     static UINT32 SafeStrlen(const char* );
  197. //#define CHXSMEMCHK
  198. #ifdef CHXSMEMCHK
  199.     INT32 m_memchkCopied;
  200.     INT32 m_memchkChanged;
  201.     INT32 m_memchkDataLength;
  202.     static INT32 g_memchkCopiedNotChanged;
  203.     static INT32 g_memchkCopiedChanged;
  204.     static INT32 g_memchkCounter;
  205.     static INT32 g_memchkHighCount;
  206.     static INT32 g_memchkTotalBytesNotChanged;
  207.     char*        m_memchkData;
  208.     static memchkWhatever Dummy;
  209.     static void memchkLogStats(void);
  210. #endif /* CHXSMEMCHK */
  211. private:
  212.     static INT32 MinimalGrowth(INT32 currentSize, INT32 sizeNeeded);
  213.     static INT32 DoublingGrowth(INT32 currentSize, INT32 sizeNeeded);
  214.     void Append(const char* pStr, INT32 size);
  215.     void Grow(INT32 newSize);
  216.     CHXStringRep* m_pRep;
  217.     StringGrowthFunc m_pGrowthFunc;
  218. };
  219. #if !defined(HELIX_CONFIG_NOSTATICS)
  220. extern const CHXString HXEmptyString;
  221. #else
  222. extern const char* const _g_emptyString;
  223. #define HXEmptyString HXGlobalCHXString::Get(&_g_emptyString)
  224. #endif
  225. inline
  226. char* CHXStringRep::GetBuffer()
  227. {
  228.     return m_pData;
  229. }
  230. inline
  231. INT32 CHXStringRep::GetStringSize() const
  232. {
  233.     return m_strSize;
  234. }
  235. inline
  236. INT32 CHXStringRep::GetBufferSize() const
  237. {
  238.     return m_bufSize;
  239. }
  240. inline
  241. void CHXStringRep::SetStringSize(INT32 strSize)
  242. {
  243.     HX_ASSERT(strSize >= 0);
  244.     HX_ASSERT(strSize < m_bufSize);
  245.     HX_ASSERT((size_t)strSize == strlen(m_pData));
  246.     m_strSize = strSize;
  247. }
  248. inline
  249. bool CHXStringRep::IsShared() const
  250. {
  251.     return (m_refCount > 1);
  252. }
  253. inline
  254. UINT32 CHXString::GetLength() const
  255. {
  256.     return (m_pRep) ? m_pRep->GetStringSize() : 0;
  257. }
  258. inline
  259. BOOL CHXString::IsEmpty() const
  260. {
  261.     return (GetLength() == 0);
  262. }
  263. inline
  264. char CHXString::GetAt(INT32 i) const
  265. {
  266.     HX_ASSERT(m_pRep);
  267.     HX_ASSERT(i >= 0);
  268.     HX_ASSERT(i < m_pRep->GetBufferSize());
  269.     return m_pRep->GetBuffer()[i];
  270. }
  271. inline
  272. char CHXString::operator[](short i) const
  273. {
  274.     HX_ASSERT(m_pRep);
  275.     HX_ASSERT(i >= 0);
  276.     HX_ASSERT(i < m_pRep->GetBufferSize());
  277.     return m_pRep->GetBuffer()[i];
  278. }
  279. inline
  280. char CHXString::operator[](unsigned short i) const
  281. {
  282.     HX_ASSERT(m_pRep);
  283.     HX_ASSERT((INT32)i < m_pRep->GetBufferSize());
  284.     return m_pRep->GetBuffer()[i];
  285. }
  286. inline
  287. char CHXString::operator[](int i) const
  288. {
  289.     HX_ASSERT(m_pRep);
  290.     HX_ASSERT(i >= 0);
  291.     HX_ASSERT(i < m_pRep->GetBufferSize());
  292.     return m_pRep->GetBuffer()[i];
  293. }
  294. inline
  295. char CHXString::operator[](unsigned int i) const
  296. {
  297.     HX_ASSERT(m_pRep);
  298.     HX_ASSERT(i < (unsigned int)m_pRep->GetBufferSize());
  299.     return m_pRep->GetBuffer()[i];
  300. }
  301. inline
  302. char CHXString::operator[](long i) const
  303. {
  304.     HX_ASSERT(m_pRep);
  305.     HX_ASSERT(i >= 0);
  306.     HX_ASSERT(i < m_pRep->GetBufferSize());
  307.     return m_pRep->GetBuffer()[i];
  308. }
  309. inline
  310. char CHXString::operator[](unsigned long i) const
  311. {
  312.     HX_ASSERT(m_pRep);
  313.     HX_ASSERT(i < (unsigned long)m_pRep->GetBufferSize());
  314.     return m_pRep->GetBuffer()[i];
  315. }
  316. inline
  317. CHXString::operator const char*() const
  318. {
  319.     return (m_pRep) ? m_pRep->GetBuffer() : (const char*)(&m_pRep);
  320. }
  321. inline
  322. INT32 CHXString::Compare(const char* pStr) const
  323. {
  324.     return strcmp((const char*)(*this), pStr);
  325. }
  326. inline
  327. INT32 CHXString::CompareNoCase(const char* pStr) const
  328. {
  329.     return strcasecmp((const char*)(*this), pStr);
  330. }
  331. inline
  332. bool CHXString::operator>(const char* pStr) const
  333. {
  334.     return (Compare(pStr) > 0);
  335. }
  336. inline
  337. bool CHXString::operator>(const CHXString& rhs) const
  338. {
  339.     return (*this > ((const char*)rhs));
  340. }
  341. inline
  342. bool CHXString::operator>(const unsigned char* pStr) const
  343. {
  344.     return (*this > ((const char*)pStr));
  345. }
  346. inline
  347. bool operator>(const char* pA, const CHXString& b)
  348. {
  349.     return (b < pA);
  350. }
  351. inline
  352. bool operator>(const unsigned char* pA, const CHXString& b)
  353. {
  354.     return (b < pA);
  355. }
  356. inline
  357. bool CHXString::operator>=(const char* pStr) const
  358. {
  359.     return (Compare(pStr) >= 0);
  360. }
  361. inline
  362. bool CHXString::operator>=(const CHXString& rhs) const
  363. {
  364.     return (*this >= ((const char*)rhs));
  365. }
  366. inline
  367. bool CHXString::operator>=(const unsigned char* pStr) const
  368. {
  369.     return (*this >= ((const char*)pStr));
  370. }    
  371. inline
  372. bool operator>=(const char* pA, const CHXString& b)
  373. {
  374.     return (b <= pA);
  375. }
  376. inline
  377. bool operator>=(const unsigned char* pA, const CHXString& b)
  378. {
  379.     return (b <= pA);
  380. }
  381. inline
  382. bool CHXString::operator==(const char* pStr) const
  383. {
  384.     return (strcmp(((const char*)*this), pStr) == 0);
  385. }
  386. inline
  387. bool CHXString::operator==(const CHXString& rhs) const
  388. {
  389.     return ((m_pRep == rhs.m_pRep) ||
  390.     ((GetLength() == rhs.GetLength()) &&
  391.      (*this == ((const char*)rhs))));
  392. }
  393. inline
  394. bool CHXString::operator==(const unsigned char* pStr) const
  395. {
  396.     return (*this == ((const char*)pStr));
  397. }
  398. inline
  399. bool operator==(const char* pA, const CHXString& b)
  400. {
  401.     return (b == pA);
  402. }
  403. inline
  404. bool operator==(const unsigned char* pA, const CHXString& b)
  405. {
  406.     return (b == pA);
  407. }
  408. inline
  409. bool CHXString::operator!=(const char* pStr) const
  410. {
  411.     return (strcmp(((const char*)*this), pStr) != 0);
  412. }
  413. inline
  414. bool CHXString::operator!=(const CHXString& rhs) const
  415. {
  416.     return ((m_pRep != rhs.m_pRep) &&
  417.     ((GetLength() != rhs.GetLength()) ||
  418.      (*this != ((const char*)rhs))));
  419. }
  420. inline
  421. bool CHXString::operator!=(const unsigned char* pStr) const
  422. {
  423.     return (*this != ((const char*)pStr));
  424. }
  425. inline
  426. bool operator!=(const char* pA, const CHXString& b)
  427. {
  428.     return (b != pA);
  429. }
  430. inline
  431. bool operator!=(const unsigned char* pA, const CHXString& b)
  432. {
  433.     return (b != pA);
  434. }
  435. inline
  436. bool CHXString::operator<=(const char* pStr) const
  437. {
  438.     return (Compare(pStr) <= 0);
  439. }
  440. inline
  441. bool CHXString::operator<=(const CHXString& rhs) const
  442. {
  443.     return (*this <= ((const char*)rhs));
  444. }
  445. inline
  446. bool CHXString::operator<=(const unsigned char* pStr) const
  447. {
  448.     return (*this <= ((const char*)pStr));
  449. }    
  450. inline
  451. bool operator<=(const char* pA, const CHXString& b)
  452. {
  453.     return (b >= pA);
  454. }
  455. inline
  456. bool operator<=(const unsigned char* pA, const CHXString& b)
  457. {
  458.     return (b >= pA);
  459. }
  460. inline
  461. bool CHXString::operator<(const char* pStr) const
  462. {
  463.     return (Compare(pStr) < 0);
  464. }
  465. inline
  466. bool CHXString::operator<(const CHXString& rhs) const
  467. {
  468.     return (*this < ((const char*)rhs));
  469. }
  470. inline
  471. bool CHXString::operator<(const unsigned char* pStr) const
  472. {
  473.     return (*this < ((const char*)pStr));
  474. }
  475. inline
  476. bool operator<(const char* pA, const CHXString& b)
  477. {
  478.     return (b > pA);
  479. }
  480. inline
  481. bool operator<(const unsigned char* pA, const CHXString& b)
  482. {
  483.     return (b > pA);
  484. }
  485. inline
  486. UINT32 CHXString::SafeStrlen(const char* pStr)
  487. {
  488.     return (pStr) ? strlen(pStr) : 0;
  489. }
  490. #endif /* HXSTRING_H */