00001 00096 #ifndef _EXT_STRING_H 00097 #define _EXT_STRING_H 00098 00099 #include <string> 00100 #include <vector> 00101 00102 namespace std 00103 { 00104 00109 class ext_string : public string 00110 { 00111 public: 00117 ext_string() : string() { } 00118 00126 ext_string(const string &s, size_type pos = 0, size_type n = npos) : string(s, pos, npos) { } 00127 00133 ext_string(const value_type *s) : string(s) { } 00134 00141 ext_string(const value_type *s, size_type n) : string(s, n) { } 00142 00149 ext_string(size_type n, value_type c) : string(n, c) { } 00150 00157 template <class InputIterator> 00158 ext_string(InputIterator first, InputIterator last) : string(first, last) { } 00159 00163 ~ext_string() { } 00164 00170 vector<ext_string> split(size_type limit = npos) const 00171 { 00172 vector<ext_string> v; 00173 00174 const_iterator 00175 i = begin(), 00176 last = i; 00177 for (; i != end(); i++) 00178 { 00179 if (*i == ' ' || *i == '\n' || *i == '\t' || *i == '\r') 00180 { 00181 if (i + 1 != end() && (i[1] == ' ' || i[1] == '\n' || i[1] == '\t' || i[1] == '\r')) 00182 continue; 00183 v.push_back(ext_string(last, i)); 00184 last = i + 1; 00185 if (v.size() >= limit - 1) 00186 { 00187 v.push_back(ext_string(last, end())); 00188 return v; 00189 } 00190 } 00191 } 00192 00193 if (last != i) 00194 v.push_back(ext_string(last, i)); 00195 00196 return v; 00197 } 00198 00228 vector<ext_string> split(value_type separator, size_type limit = npos) const 00229 { 00230 vector<ext_string> v; 00231 00232 const_iterator 00233 i = begin(), 00234 last = i; 00235 for (; i != end(); i++) 00236 { 00237 if (*i == separator) 00238 { 00239 v.push_back(ext_string(last, i)); 00240 last = i + 1; 00241 if (v.size() >= limit - 1) 00242 { 00243 v.push_back(ext_string(last, end())); 00244 return v; 00245 } 00246 } 00247 } 00248 00249 if (last != i) 00250 v.push_back(ext_string(last, i)); 00251 00252 return v; 00253 } 00254 00274 vector<ext_string> split(const string &separator, size_type limit = npos) const 00275 { 00276 vector<ext_string> v; 00277 00278 const_iterator 00279 i = begin(), 00280 last = i; 00281 for (; i != end(); i++) 00282 { 00283 if (string(i, i + separator.length()) == separator) 00284 { 00285 v.push_back(ext_string(last, i)); 00286 last = i + separator.length(); 00287 00288 if (v.size() >= limit - 1) 00289 { 00290 v.push_back(ext_string(last, end())); 00291 return v; 00292 } 00293 } 00294 } 00295 00296 if (last != i) 00297 v.push_back(ext_string(last, i)); 00298 00299 return v; 00300 } 00301 00312 static long int integer(const string &s) 00313 { 00314 long int retval = 0; 00315 bool neg = false; 00316 00317 for (const_iterator i = s.begin(); i != s.end(); i++) 00318 { 00319 if (i == s.begin()) 00320 { 00321 if (*i == '-') 00322 { 00323 neg = true; 00324 continue; 00325 } 00326 else if (*i == '+') 00327 continue; 00328 } 00329 if (*i >= '0' && *i <= '9') 00330 { 00331 retval *= 10; 00332 retval += *i - '0'; 00333 } 00334 else 00335 break; 00336 } 00337 00338 if (neg) 00339 retval *= -1; 00340 00341 return retval; 00342 } 00343 00353 long int integer() const 00354 { 00355 return integer(*this); 00356 } 00357 00376 vector<ext_string> chunk_split(size_type chunklen) const 00377 { 00378 vector<ext_string> retval; 00379 retval.reserve(size() / chunklen + 1); 00380 00381 size_type count = 0; 00382 const_iterator 00383 i = begin(), 00384 last = i; 00385 for (; i != end(); i++, count++) 00386 { 00387 if (count == chunklen) 00388 { 00389 count = 0; 00390 retval.push_back(ext_string(last, i)); 00391 last = i; 00392 } 00393 } 00394 00395 if (last != i) 00396 retval.push_back(ext_string(last, i)); 00397 00398 return retval; 00399 } 00400 00427 template <class InputIterator> 00428 static ext_string join(const string &glue, InputIterator first, InputIterator last) 00429 { 00430 ext_string retval; 00431 00432 for (; first != last; first++) 00433 { 00434 retval.append(*first); 00435 retval.append(glue); 00436 } 00437 retval.erase(retval.length() - glue.length()); 00438 00439 return retval; 00440 } 00441 00448 template <class InputIterator> 00449 static ext_string join(value_type glue, InputIterator first, InputIterator last) 00450 { 00451 ext_string retval; 00452 00453 for (; first != last; first++) 00454 { 00455 retval.append(*first); 00456 retval.append(1, glue); 00457 } 00458 retval.erase(retval.length() - 1); 00459 00460 return retval; 00461 } 00462 00480 ext_string &replace(const string &needle, const string &s) 00481 { 00482 size_type 00483 lastpos = 0, 00484 thispos; 00485 00486 while ((thispos = find(needle, lastpos)) != npos) 00487 { 00488 string::replace(thispos, needle.length(), s); 00489 lastpos = thispos + 1; 00490 } 00491 return *this; 00492 } 00493 00504 ext_string &replace(value_type needle, value_type c) 00505 { 00506 for (iterator i = begin(); i != end(); i++) 00507 if (*i == needle) 00508 *i = c; 00509 00510 return *this; 00511 } 00512 00528 ext_string operator*(size_type n) 00529 { 00530 ext_string retval; 00531 for (size_type i = 0; i < n; i++) 00532 retval.append(*this); 00533 00534 return retval; 00535 } 00536 00543 ext_string &tolower() 00544 { 00545 for (iterator i = begin(); i != end(); i++) 00546 if (*i >= 'A' && *i <= 'Z') 00547 *i = (*i) + ('a' - 'A'); 00548 return *this; 00549 } 00550 00557 ext_string &toupper() 00558 { 00559 for (iterator i = begin(); i != end(); i++) 00560 if (*i >= 'a' && *i <= 'z') 00561 *i = (*i) - ('a' - 'A'); 00562 return *this; 00563 } 00564 00570 size_type count(const string &str) const 00571 { 00572 size_type 00573 count = 0, 00574 last = 0, 00575 cur = 0; 00576 00577 while ((cur = find(str, last + 1)) != npos) 00578 { 00579 count++; 00580 last = cur; 00581 } 00582 00583 return count; 00584 } 00585 00592 bool is_alnum() const 00593 { 00594 if (length() == 0) 00595 return false; 00596 00597 for (const_iterator i = begin(); i != end(); i++) 00598 { 00599 if (*i < 'A' || *i > 'Z') 00600 if (*i < '0' || *i > '9') 00601 if (*i < 'a' || *i > 'z') 00602 return false; 00603 } 00604 00605 return true; 00606 } 00607 00614 bool is_alpha() const 00615 { 00616 if (length() == 0) 00617 return false; 00618 00619 for (const_iterator i = begin(); i != end(); i++) 00620 if (*i < 'A' || (*i > 'Z' && (*i < 'a' || *i > 'z'))) 00621 return false; 00622 00623 return true; 00624 } 00625 00632 bool is_numeric() const 00633 { 00634 if (length() == 0) 00635 return false; 00636 00637 for (const_iterator i = begin(); i != end(); i++) 00638 if (*i < '0' || *i > '9') 00639 return false; 00640 00641 return true; 00642 } 00643 00650 bool is_lower() const 00651 { 00652 if (length() == 0) 00653 return false; 00654 00655 for (const_iterator i = begin(); i != end(); i++) 00656 if (*i < 'a' || *i < 'z') 00657 return false; 00658 00659 return true; 00660 } 00661 00668 bool is_upper() const 00669 { 00670 if (length() == 0) 00671 return false; 00672 00673 for (const_iterator i = begin(); i != end(); i++) 00674 if (*i < 'A' || *i > 'Z') 00675 return false; 00676 00677 return true; 00678 } 00679 00686 ext_string &swapcase() 00687 { 00688 for (iterator i = begin(); i != end(); i++) 00689 if (*i >= 'A' && *i <= 'Z') 00690 *i += ('a' - 'A'); 00691 else if (*i >= 'a' && *i <= 'z') 00692 *i -= ('a' - 'A'); 00693 00694 return *this; 00695 } 00696 }; 00697 } 00698 #endif