00001 00094 #ifndef _EXT_STRING_H 00095 #define _EXT_STRING_H 00096 00097 #include <string> 00098 #include <vector> 00099 00100 namespace std 00101 { 00102 00107 class ext_string : public string 00108 { 00109 public: 00115 ext_string() : string() { } 00116 00124 ext_string(const ext_string &s, size_type pos = 0, size_type n = npos) : string(s, pos, npos) { } 00125 00131 ext_string(const value_type *s) : string(s) { } 00132 00139 ext_string(const value_type *s, size_type n) : string(s, n) { } 00140 00147 ext_string(size_type n, value_type c) : string(n, c) { } 00148 00155 template <class InputIterator> 00156 ext_string(InputIterator first, InputIterator last) : string(first, last) { } 00157 00161 ~ext_string() { } 00162 00192 vector<ext_string> split(value_type separator, size_type limit = npos) const 00193 { 00194 vector<ext_string> v; 00195 00196 const_iterator 00197 i = begin(), 00198 last = i; 00199 for (; i != end(); i++) 00200 { 00201 if (*i == separator) 00202 { 00203 v.push_back(ext_string(last, i)); 00204 last = i + 1; 00205 if (v.size() >= limit - 1) 00206 { 00207 v.push_back(ext_string(last, end())); 00208 return v; 00209 } 00210 } 00211 } 00212 00213 if (last != i) 00214 v.push_back(ext_string(last, i)); 00215 00216 return v; 00217 } 00218 00238 vector<ext_string> split(const string &separator, size_type limit = npos) const 00239 { 00240 vector<ext_string> v; 00241 00242 const_iterator 00243 i = begin(), 00244 last = i; 00245 for (; i != end(); i++) 00246 { 00247 if (string(i, i + separator.length()) == separator) 00248 { 00249 v.push_back(ext_string(last, i)); 00250 last = i + separator.length(); 00251 00252 if (v.size() >= limit - 1) 00253 { 00254 v.push_back(ext_string(last, end())); 00255 return v; 00256 } 00257 } 00258 } 00259 00260 if (last != i) 00261 v.push_back(ext_string(last, i)); 00262 00263 return v; 00264 } 00265 00276 static long int integer(const string &s) 00277 { 00278 long int retval = 0; 00279 bool neg = false; 00280 00281 for (const_iterator i = s.begin(); i != s.end(); i++) 00282 { 00283 if (i == s.begin()) 00284 { 00285 if (*i == '-') 00286 { 00287 neg = true; 00288 continue; 00289 } 00290 else if (*i == '+') 00291 continue; 00292 } 00293 if (*i >= '0' && *i <= '9') 00294 { 00295 retval *= 10; 00296 retval += *i - '0'; 00297 } 00298 } 00299 00300 if (neg) 00301 retval *= -1; 00302 00303 return retval; 00304 } 00305 00315 long int integer() const 00316 { 00317 return integer(*this); 00318 } 00319 00338 vector<ext_string> chunk_split(size_type chunklen) const 00339 { 00340 vector<ext_string> retval; 00341 retval.reserve(size() / chunklen + 1); 00342 00343 size_type count = 0; 00344 const_iterator 00345 i = begin(), 00346 last = i; 00347 for (; i != end(); i++, count++) 00348 { 00349 if (count == chunklen) 00350 { 00351 count = 0; 00352 retval.push_back(ext_string(last, i)); 00353 last = i; 00354 } 00355 } 00356 00357 if (last != i) 00358 retval.push_back(ext_string(last, i)); 00359 00360 return retval; 00361 } 00362 00389 template <class InputIterator> 00390 static ext_string join(const string &glue, InputIterator first, InputIterator last) 00391 { 00392 ext_string retval; 00393 00394 for (; first != last; first++) 00395 { 00396 retval.append(*first); 00397 retval.append(glue); 00398 } 00399 retval.erase(retval.length() - glue.length()); 00400 00401 return retval; 00402 } 00403 00410 template <class InputIterator> 00411 static ext_string join(value_type glue, InputIterator first, InputIterator last) 00412 { 00413 ext_string retval; 00414 00415 for (; first != last; first++) 00416 { 00417 retval.append(*first); 00418 retval.append(1, glue); 00419 } 00420 retval.erase(retval.length() - 1); 00421 00422 return retval; 00423 } 00424 00442 ext_string &replace(const string &needle, const string &s) 00443 { 00444 size_type 00445 lastpos = 0, 00446 thispos; 00447 00448 while ((thispos = find(needle, lastpos)) != npos) 00449 { 00450 string::replace(thispos, needle.length(), s); 00451 lastpos = thispos + 1; 00452 } 00453 return *this; 00454 } 00455 00466 ext_string &replace(value_type needle, value_type c) 00467 { 00468 for (iterator i = begin(); i != end(); i++) 00469 if (*i == needle) 00470 *i = c; 00471 00472 return *this; 00473 } 00474 00490 ext_string operator*(size_type n) 00491 { 00492 ext_string retval; 00493 for (size_type i = 0; i < n; i++) 00494 retval.append(*this); 00495 00496 return retval; 00497 } 00498 00505 ext_string &tolower() 00506 { 00507 for (iterator i = begin(); i != end(); i++) 00508 if (*i >= 'A' && *i <= 'Z') 00509 *i = (*i) + ('a' - 'A'); 00510 return *this; 00511 } 00512 00519 ext_string &toupper() 00520 { 00521 for (iterator i = begin(); i != end(); i++) 00522 if (*i >= 'a' && *i <= 'z') 00523 *i = (*i) - ('a' - 'A'); 00524 return *this; 00525 } 00526 00532 size_type count(const string &str) const 00533 { 00534 size_type 00535 count = 0, 00536 last = 0, 00537 cur = 0; 00538 00539 while ((cur = find(str, last + 1)) != npos) 00540 { 00541 count++; 00542 last = cur; 00543 } 00544 00545 return count; 00546 } 00547 00554 bool is_alnum() const 00555 { 00556 if (length() == 0) 00557 return false; 00558 00559 for (const_iterator i = begin(); i != end(); i++) 00560 { 00561 if (*i < 'A' || *i > 'Z') 00562 if (*i < '0' || *i > '9') 00563 if (*i < 'a' || *i > 'z') 00564 return false; 00565 } 00566 00567 return true; 00568 } 00569 00576 bool is_alpha() const 00577 { 00578 if (length() == 0) 00579 return false; 00580 00581 for (const_iterator i = begin(); i != end(); i++) 00582 if (*i < 'A' || (*i > 'Z' && (*i < 'a' || *i > 'z'))) 00583 return false; 00584 00585 return true; 00586 } 00587 00594 bool is_numeric() const 00595 { 00596 if (length() == 0) 00597 return false; 00598 00599 for (const_iterator i = begin(); i != end(); i++) 00600 if (*i < '0' || *i > '9') 00601 return false; 00602 00603 return true; 00604 } 00605 00612 bool is_lower() const 00613 { 00614 if (length() == 0) 00615 return false; 00616 00617 for (const_iterator i = begin(); i != end(); i++) 00618 if (*i < 'a' || *i < 'z') 00619 return false; 00620 00621 return true; 00622 } 00623 00630 bool is_upper() const 00631 { 00632 if (length() == 0) 00633 return false; 00634 00635 for (const_iterator i = begin(); i != end(); i++) 00636 if (*i < 'A' || *i > 'Z') 00637 return false; 00638 00639 return true; 00640 } 00641 00648 ext_string &swapcase() 00649 { 00650 for (iterator i = begin(); i != end(); i++) 00651 if (*i >= 'A' && *i <= 'Z') 00652 *i += ('a' - 'A'); 00653 else if (*i >= 'a' && *i <= 'z') 00654 *i -= ('a' - 'A'); 00655 00656 return *this; 00657 } 00658 }; 00659 } 00660 #endif