trim_string.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //
  2. // $Id$
  3. //
  4. #include<__vic/string_utils.h>
  5. #include<__vic/algorithm.h>
  6. #include<__vic/char_predicates.h>
  7. namespace __vic {
  8. namespace {
  9. //----------------------------------------------------------------------------
  10. template<class charT, class Traits, class Alloc, class Pred>
  11. inline void trim_if_back(std::basic_string<charT,Traits,Alloc> &st, Pred pred)
  12. {
  13. charT *end = &*st.end();
  14. charT *p = skip_if_back(&*st.begin(), end, pred);
  15. if(p != end) st.resize(p - st.data());
  16. }
  17. //----------------------------------------------------------------------------
  18. template<class charT, class Traits, class Alloc, class Pred>
  19. inline void trim_if_front(std::basic_string<charT,Traits,Alloc> &st, Pred pred)
  20. {
  21. charT *begin = &*st.begin();
  22. charT *p = skip_if_front(begin, &*st.end(), pred);
  23. if(p != begin) st.erase(0, p - begin);
  24. }
  25. //----------------------------------------------------------------------------
  26. template<class charT, class Traits, class Alloc, class Pred>
  27. inline void trim_if(std::basic_string<charT,Traits,Alloc> &st, Pred pred)
  28. {
  29. trim_if_back(st, pred);
  30. trim_if_front(st, pred);
  31. }
  32. //----------------------------------------------------------------------------
  33. } // namespace
  34. //----------------------------------------------------------------------------
  35. std::string &trim(std::string &st)
  36. {
  37. trim_if(st, is_ascii_ws());
  38. return st;
  39. }
  40. //----------------------------------------------------------------------------
  41. std::string &trim_back(std::string &st)
  42. {
  43. trim_if_back(st, is_ascii_ws());
  44. return st;
  45. }
  46. //----------------------------------------------------------------------------
  47. std::string &trim_front(std::string &st)
  48. {
  49. trim_if_front(st, is_ascii_ws());
  50. return st;
  51. }
  52. //----------------------------------------------------------------------------
  53. std::string &trim(std::string &st, char ch)
  54. {
  55. trim_if(st, is_eq_char(ch));
  56. return st;
  57. }
  58. //----------------------------------------------------------------------------
  59. std::string &trim_back(std::string &st, char ch)
  60. {
  61. trim_if_back(st, is_eq_char(ch));
  62. return st;
  63. }
  64. //----------------------------------------------------------------------------
  65. std::string &trim_front(std::string &st, char ch)
  66. {
  67. trim_if_front(st, is_eq_char(ch));
  68. return st;
  69. }
  70. //----------------------------------------------------------------------------
  71. std::string &trim(std::string &st, const char *set)
  72. {
  73. if(set) trim_if(st, is_one_of_chars(set));
  74. return st;
  75. }
  76. //----------------------------------------------------------------------------
  77. std::string &trim_back(std::string &st, const char *set)
  78. {
  79. if(set) trim_if_back(st, is_one_of_chars(set));
  80. return st;
  81. }
  82. //----------------------------------------------------------------------------
  83. std::string &trim_front(std::string &st, const char *set)
  84. {
  85. if(set) trim_if_front(st, is_one_of_chars(set));
  86. return st;
  87. }
  88. //----------------------------------------------------------------------------
  89. } // namespace