BrewString.h
上传用户:smh666999
上传日期:2007-01-14
资源大小:553k
文件大小:10k
源码类别:

BREW编程

开发平台:

Visual C++

  1. #ifndef __BrewString #define __BrewString
  2. #include "platformSpecific.h"
  3. #define length_ pData_->length
  4. #define capacity_ pData_->capacity
  5. #define buffer_ pData_->buffer
  6. /*
  7. template <typename T>
  8. bool isspace(T c){ return (c == ' '); }
  9. template <typename T>
  10. bool isSpaceOrNewLine(T c){ return (c == ' ') || (c == 'n') || (c == 'r') || (c == 't'); }
  11. */
  12. template <typename T>
  13. struct StringPolicyImpl
  14. {
  15. static isSpace(T c)
  16. {
  17. return (c == ' ') || (c == 'n') || (c == 'r') || (c == 't'); 
  18. }
  19. };
  20. template <typename T = char , class StringPolicy = StringPolicyImpl<T> > class BrewString  
  21. { public:
  22. template <class U>
  23. BrewString( const U& rhs , UINT sz = 0): pData_(0)
  24. {
  25. CopyCtorImpl(rhs, sz);
  26. }
  27. BrewString( const BrewString<T> &rhs ): pData_(0)
  28. {
  29. CopyCtorImpl(rhs, 0);
  30. }
  31. BrewString( long rhs ): pData_(0)
  32. {
  33. char s[16];
  34. SPRINTF(s, "%d", rhs);
  35. CopyCtorImpl(s, 0);
  36. }
  37. template < class U, class V>
  38. BrewString (const U& lhs, UINT lnl, const V& rhs, UINT lnr): pData_(0)
  39. {
  40. ensureCapacity(lnr + lnl );
  41. MEMCPY( buffer_, getBuf(lhs) , lnl );
  42. MEMCPY( buffer_+lnl, getBuf(rhs) , lnr );
  43. buffer_[length_=capacity_] = 0;
  44. }
  45. BrewString( ) : pData_(0)
  46. {
  47. }
  48.    ~BrewString()  
  49. FREE(pData_);
  50. }
  51. const BrewString<T> &
  52. operator=( const BrewString &rhs )
  53. {
  54. if ( this == &rhs )
  55. return *this;
  56. return opEqImpl(rhs);
  57. }
  58. const BrewString<T> &
  59. operator=( const T* rhs )
  60. {
  61. return opEqImpl(rhs);
  62. }
  63. template <class U>
  64. const BrewString<T> &
  65. operator+=( const U& rhs )
  66. {
  67. UINT ln = getLen(rhs);
  68. UINT newLen = increaseBuffer(ln);
  69. cat(getBuf(rhs), ln);
  70. length_ = newLen;
  71. return *this;
  72. }
  73. template <class U>
  74. bool operator==( const U& rhs ) const
  75. {
  76. return ( bufferImpl() && lengthImpl() == getLen(rhs) && STRCMP( buffer_, getBuf(rhs) ) == 0 );
  77. }
  78. template <class U>
  79. bool operator!=( const U& rhs ) const
  80. {
  81. return ( bufferImpl() && lengthImpl() != getLen(rhs) && STRCMP( buffer_, getBuf(rhs) ) != 0 );
  82. }
  83. template <class U>
  84. bool startsWith( const U &rhs, UINT offset = 0 ) const
  85. {
  86. UINT ln = getLen(rhs);
  87. if ( lengthImpl()< ln + offset  || ln == 0)
  88. return false;
  89. return STRNCMP( &buffer_[offset], getBuf(rhs), ln ) == 0;
  90. }
  91. template <class U>
  92. bool endsWith( const U& rhs ) const
  93. {
  94. UINT ln = getLen(rhs);
  95. if ( lengthImpl() < ln || ln == 0)
  96. return false;
  97. return STRCMP( &buffer_[ length_ - ln], getBuf(rhs) ) == 0;
  98. }
  99. template <class U>
  100. int indexOf( const U &rhs, UINT fromIndex = 0 ) const
  101. {
  102. if (lengthImpl()< getLen(rhs) + fromIndex)
  103. return -1;
  104. const T *temp = STRSTR( &buffer_[ fromIndex ], getBuf(rhs) );
  105. return ( temp ) ? temp - buffer_ : -1;
  106. }
  107. int indexOf( const T rhs, UINT fromIndex = 0 ) const
  108. {
  109. if (lengthImpl()< fromIndex)
  110. return -1;
  111. const T *temp = STRCHR( &buffer_[ fromIndex ], rhs );
  112. return ( temp ) ? temp - buffer_ : -1;
  113. }
  114. template <class U>
  115. int lastIndexOf( const U &rhs ) const
  116. {
  117. return lastIndexOf( rhs, lengthImpl() - getLen(rhs) );
  118. }
  119. template <class U>
  120. int lastIndexOf( const U &rhs, UINT fromIndex ) const
  121. {
  122. UINT ln = getLen(rhs);
  123. if ( ln == 0 || fromIndex + ln> lengthImpl() )
  124. return -1;
  125. T temp = getBuf(rhs)[ 0 ];
  126. for ( int i = fromIndex; i >= 0; i-- )
  127. {
  128. if ( buffer_[ i ] == temp && (!STRNCMP(getBuf(rhs), &buffer_[i], ln)) )
  129. return i;
  130. }
  131. return -1;
  132. }
  133. int lastIndexOf( const T rhs, UINT fromIndex  ) const
  134. {
  135. if (lengthImpl()< fromIndex)
  136. return -1;
  137. while( (buffer_[ --fromIndex ] != rhs) && fromIndex != -1);
  138. return fromIndex ;
  139. }
  140. int lastIndexOf( const T rhs ) const
  141. {
  142. UINT fromIndex = lengthImpl();
  143. while( (buffer_[ --fromIndex ] != rhs) && fromIndex != -1);
  144. return fromIndex ;
  145. }
  146. template <class U, class V>
  147. const BrewString<T>&
  148. replace( const U& match, const V& replacement )
  149. {
  150. UINT ln = getLen(match);
  151. if (ln == 0 || ln > lengthImpl())
  152. return *this;
  153. BrewString newString;
  154. int loc , oldLoc = 0;
  155. bool isReplaceable = false;
  156. while ( (loc = indexOf( match, oldLoc )) != -1 )
  157. {
  158. if (!isReplaceable ) 
  159. {
  160. isReplaceable = true;
  161. newString.ensureCapacity(length_);
  162. }
  163. newString += substring( oldLoc, loc  );
  164. newString += replacement;
  165. oldLoc = loc + ln;
  166. }     
  167. if (isReplaceable) 
  168. {
  169. newString += substring( oldLoc );
  170. return opEqImpl(newString);
  171. }
  172. return *this;
  173. }
  174. const BrewString<T>&
  175. replace( T findChar, T replaceChar )
  176. {
  177. if (pData_ && buffer_)
  178. {
  179. T* temp = buffer_;
  180. while( temp  = STRCHR( temp, findChar ) )
  181. *temp = replaceChar;
  182. }
  183. return *this;
  184. }
  185.    
  186. BrewString<T>
  187. substring( UINT left ) const
  188. {
  189. return substring( left, lengthImpl() );
  190. }
  191. BrewString<T>
  192. substring( UINT left, UINT right ) const
  193. {
  194. if ( ( left >= right ) || ( right > lengthImpl()) )
  195. {
  196. return BrewString();
  197. }  
  198. return BrewString ( buffer_ + left, right - left );
  199. }
  200. const BrewString<T>& partialString( UINT right ) 
  201. {
  202. if (  right >= lengthImpl() )
  203. {
  204. return *this;
  205. }  
  206. length_ = right;
  207. buffer_[length_] = 0;
  208. return *this;
  209. }
  210. const BrewString<T>& partialString( UINT left, UINT right ) 
  211. {
  212. if ( ( left > right ) || ( right > lengthImpl() ) )
  213. {
  214. return *this;
  215. }  
  216. length_ = right - left;
  217. T* strt = buffer_;
  218. T* sstr = buffer_ + left;
  219. while( (strt - buffer_) < length_ )
  220. {
  221. *(strt++) = *(sstr++);
  222. }
  223. buffer_[length_] = 0;
  224. return *this;
  225. }
  226. const BrewString<T>& trim()
  227. {
  228. if (lengthImpl() <1 )
  229. return *this;
  230. UINT i = 0;
  231. for ( UINT ln = length_; i < ln; i++ )
  232. {
  233. if ( !StringPolicy::isSpace(buffer_[i]) )
  234. break;
  235. }
  236. UINT j = length_ - 1;
  237. for ( ; j > i; j-- )
  238. {
  239. if ( !StringPolicy::isSpace(buffer_[j]) )
  240. break;
  241. }
  242. return partialString( i, j + 1);
  243. }
  244. const BrewString<T>& toLowerCase( ) const
  245. {
  246. if (pData_ && buffer_)
  247. STRLOWER(buffer_);
  248. return *this;
  249. }
  250. const BrewString<T>& toUpperCase( ) const
  251. {
  252. if (pData_ && buffer_)
  253. STRUPPER(buffer_);
  254. return *this;
  255. }
  256.  
  257. const T* toCharArray() const { return bufferImpl();}
  258. const UINT length( ) const { return lengthImpl(); }
  259. const UINT capacity( ) const { return capacityImpl(); }
  260. bool isEmpty() const
  261. {
  262. return !(pData_ && length_);
  263. }
  264. const T charAt( int index ) const
  265. {
  266. return (!isIndexOutOfBounds( index )) ? buffer_[ index ] : 0;
  267. }
  268. T& operator[]( UINT idx )
  269. {
  270. return *(buffer_+idx);
  271. }
  272. const T& operator[]( UINT idx ) const
  273. {
  274. return *(buffer_+idx);
  275. }
  276. void ensureCapacity(UINT sz)
  277. {
  278. if (!pData_)
  279. {
  280. increaseBuffer(sz);
  281. buffer_[length_] = 0;
  282. return;
  283. }
  284. int l = sz - length_;
  285. UINT newLen = l>0 ? l : length_;
  286. increaseBuffer(newLen);
  287. }
  288. void setLength(UINT sz)
  289. {
  290. if (sz < lengthImpl()) 
  291. {
  292. length_ = sz;
  293. capacity_ = sz;
  294. buffer_[sz] = 0;
  295. return;
  296. }
  297. if (sz > lengthImpl()) 
  298. {
  299. increaseBuffer(sz - lengthImpl());
  300. buffer_[length_] = 0;
  301. }
  302. }
  303. private: 
  304. void setBuffer(UINT sz)
  305. {
  306. pData_ = static_cast<DATA*>(MALLOC(sizeof(DATA) + sz*sizeof(T)));
  307. if (pData_)
  308. capacity_ = sz;
  309. }
  310. UINT increaseBuffer(UINT sz)
  311. {
  312. if (!pData_)
  313. {
  314. setBuffer( sz );
  315. length_ = 0;
  316. return sz;
  317. }
  318. UINT newLen = length_ + sz;
  319. if (newLen > capacity_)
  320. {
  321. DATA *temp = pData_;
  322. setBuffer( newLen );
  323. length_ = newLen - sz;
  324. cpy( temp->buffer);
  325. FREE (temp);
  326. if (!buffer_) return 0;
  327. }
  328. return newLen;
  329. }
  330. bool isIndexOutOfBounds( UINT index ) const 
  331. {
  332. return (( index >= lengthImpl() ) || ( index <0 ) );
  333. }
  334. UINT getLen(const BrewString& s) const
  335. { return s.pData_?s.length_:0;}
  336. UINT getLen(const T* ch) const
  337. { return ch?STRLEN(ch):0;}
  338. UINT getLen(const T ch) const
  339. { return 1;}
  340. const T* getBuf(const BrewString& s) const
  341. { return s.buffer_;}
  342. const T* getBuf(const T* ch) const
  343. { return ch;}
  344. const T* getBuf(const T& ch) const
  345. { return &ch;}
  346. template <class U>
  347. const BrewString<T> &
  348. opEqImpl( const U &rhs )
  349. {
  350. UINT ln = getLen(rhs);
  351. if (!pData_ || ln > capacityImpl() )
  352. {
  353. FREE( pData_);
  354. setBuffer( ln );
  355. }
  356. length_ = ln;
  357. cpy(getBuf(rhs));
  358. return *this;
  359. }
  360. template <class U>
  361. void CopyCtorImpl( const U &rhs, UINT sz)
  362. {
  363. UINT ln = getLen(rhs);
  364. //if (ln == 0) return;
  365. sz = (sz == 0) || (sz > ln)? ln : sz;
  366. setBuffer( sz );
  367. length_ = sz;
  368. cpy( getBuf(rhs) );
  369. }
  370. void cpy(const T* rhs)
  371. {
  372. if (pData_ && buffer_ && rhs)
  373. {
  374. MEMCPY( buffer_, rhs , length_ );
  375. buffer_[length_] = 0;
  376. }
  377. }
  378. void cat(const T* rhs,  UINT sz )
  379. {
  380. if (pData_ && buffer_ && rhs)
  381. {
  382. MEMCPY( buffer_+ length_, rhs , sz );
  383. buffer_[sz + length_] = 0;
  384. }
  385. }
  386. const T* bufferImpl() const
  387. {
  388. return pData_?buffer_:0;
  389. }
  390. UINT lengthImpl() const 
  391. {
  392. return pData_?length_:0;
  393. }
  394. UINT capacityImpl() const
  395. {
  396. return pData_?capacity_:0;
  397. }
  398. friend BrewString<T> operator+ ( const BrewString<T>& lhs,  const T* rhs )
  399. {
  400. return opPlusImpl(lhs, rhs);
  401. }
  402. friend BrewString<T> operator+ ( const BrewString<T>& lhs,  const BrewString<T>& rhs )
  403. {
  404. return opPlusImpl(lhs, rhs);
  405. }
  406. friend BrewString<T> operator+ ( const T* lhs,  const  BrewString<T>& rhs )
  407. {
  408. return opPlusImpl(lhs, rhs);
  409. }
  410. template < class U, class V>
  411. static BrewString<T> opPlusImpl(const U& lhs, const V& rhs)
  412. {
  413. BrewString<T> t;
  414. UINT lnl = t.getLen(lhs);
  415. UINT lnr = t.getLen(rhs);
  416. return BrewString<T>(lhs, lnl,  rhs, lnr);
  417. }
  418. private:
  419. struct DATA
  420. {
  421. UINT length;
  422. UINT capacity;
  423. T buffer[1];
  424. };
  425. DATA* pData_; };
  426. typedef BrewString<char> String;
  427. #endif