string_utils.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // String utilities
  2. //
  3. // Platform: ISO C++ 98/11
  4. // $Id$
  5. //
  6. // (c) __vic 2007
  7. #ifndef __VIC_STRING_UTILS_H
  8. #define __VIC_STRING_UTILS_H
  9. #include<__vic/defs.h>
  10. #include<algorithm>
  11. #include<cstring>
  12. #include<string>
  13. namespace __vic {
  14. //----------------------------------------------------------------------------
  15. char *trim(char * ) noexcept;
  16. char *trim_left(char * ) noexcept;
  17. char *trim_right(char * ) noexcept;
  18. char *trim(char * , char ) noexcept;
  19. char *trim_left(char * , char ) noexcept;
  20. char *trim_right(char * , char ) noexcept;
  21. char *trim(char * , const char * ) noexcept;
  22. char *trim_left(char * , const char * ) noexcept;
  23. char *trim_right(char * , const char * ) noexcept;
  24. //----------------------------------------------------------------------------
  25. std::string &trim(std::string & );
  26. std::string &trim_left(std::string & );
  27. std::string &trim_right(std::string & );
  28. std::string &trim(std::string & , char );
  29. std::string &trim_left(std::string & , char );
  30. std::string &trim_right(std::string & , char );
  31. std::string &trim(std::string & , const char * );
  32. std::string &trim_left(std::string & , const char * );
  33. std::string &trim_right(std::string & , const char * );
  34. //----------------------------------------------------------------------------
  35. std::string trimmed(const std::string & );
  36. std::string trimmed_left(const std::string & );
  37. std::string trimmed_right(const std::string & );
  38. std::string trimmed(const std::string & , char );
  39. std::string trimmed_left(const std::string & , char );
  40. std::string trimmed_right(const std::string & , char );
  41. std::string trimmed(const std::string & , const char * );
  42. std::string trimmed_left(const std::string & , const char * );
  43. std::string trimmed_right(const std::string & , const char * );
  44. //----------------------------------------------------------------------------
  45. namespace impl {
  46. //----------------------------------------------------------------------------
  47. template<class Pred>
  48. inline char *sift_if(char *st, Pred pred)
  49. {
  50. if(!st) return st;
  51. char *in = st;
  52. while(*in && !pred(*in)) in++;
  53. if(!*in) return st; // no trash chars
  54. char *out = in;
  55. while(char ch = *++in)
  56. if(!pred(ch)) *out++ = ch;
  57. *out = '\0';
  58. return st;
  59. }
  60. //----------------------------------------------------------------------------
  61. template<class Pred>
  62. std::string &sift_if(std::string &st, Pred pred)
  63. {
  64. std::string::iterator in = st.begin();
  65. while(in != st.end() && !pred(*in)) ++in;
  66. if(in == st.end()) return st; // no trash chars
  67. std::string::iterator out = in;
  68. while(++in != st.end())
  69. if(!pred(*in)) *out++ = *in;
  70. st.erase(out, st.end());
  71. return st;
  72. }
  73. //----------------------------------------------------------------------------
  74. } // namespace
  75. //----------------------------------------------------------------------------
  76. char *sift(char * , const char * );
  77. std::string &sift(std::string & , const char * );
  78. template<class Pred>
  79. char *sift_if(char *s, Pred pred) { return impl::sift_if(s, pred); }
  80. template<class Pred>
  81. std::string &sift_if(std::string &s, Pred pred) { return impl::sift_if(s, pred);}
  82. //----------------------------------------------------------------------------
  83. //----------------------------------------------------------------------------
  84. std::string &pad_left(std::string & , size_t , char = ' ');
  85. std::string &pad_right(std::string & , size_t , char = ' ');
  86. char *pad_left(char * , size_t , char = ' ');
  87. char *pad_right(char * , size_t , char = ' ');
  88. //----------------------------------------------------------------------------
  89. //----------------------------------------------------------------------------
  90. inline bool starts_with(const char *s, size_t s_len, char pref)
  91. {
  92. return s_len && *s == pref;
  93. }
  94. bool starts_with(const char * , size_t , const char * );
  95. bool starts_with(const char * , size_t , const char * , size_t );
  96. //----------------------------------------------------------------------------
  97. inline bool starts_with(const char *s, char pref)
  98. {
  99. return *s == pref;
  100. }
  101. bool starts_with(const char * , const char * );
  102. bool starts_with(const char * , const char * , size_t );
  103. //----------------------------------------------------------------------------
  104. inline bool starts_with(const std::string &s, char pref)
  105. {
  106. return !s.empty() && *s.begin() == pref;
  107. }
  108. inline bool starts_with(const std::string &s, const char *pref)
  109. {
  110. return starts_with(s.data(), s.length(), pref);
  111. }
  112. inline bool starts_with(const std::string &s, const char *pref, size_t pref_len)
  113. {
  114. return starts_with(s.data(), s.length(), pref, pref_len);
  115. }
  116. inline bool starts_with(const std::string &s, const std::string &pref)
  117. {
  118. return starts_with(s, pref.data(), pref.length());
  119. }
  120. //----------------------------------------------------------------------------
  121. //----------------------------------------------------------------------------
  122. inline bool ends_with(const char *s, size_t s_len, char suff)
  123. {
  124. return s_len && s[s_len - 1] == suff;
  125. }
  126. bool ends_with(const char * , size_t , const char * , size_t );
  127. inline bool ends_with(const char *s, size_t s_len, const char *suff)
  128. {
  129. return ends_with(s, s_len, suff, std::strlen(suff));
  130. }
  131. //----------------------------------------------------------------------------
  132. inline bool ends_with(const char *s, char suff)
  133. {
  134. return ends_with(s, std::strlen(s), suff);
  135. }
  136. inline bool ends_with(const char *s, const char *suff, size_t suff_len)
  137. {
  138. return ends_with(s, std::strlen(s), suff, suff_len);
  139. }
  140. inline bool ends_with(const char *s, const char *suff)
  141. {
  142. return ends_with(s, suff, std::strlen(suff));
  143. }
  144. //----------------------------------------------------------------------------
  145. inline bool ends_with(const std::string &s, char suff)
  146. {
  147. return !s.empty() && *s.rbegin() == suff;
  148. }
  149. inline bool ends_with(const std::string &s, const char *suff)
  150. {
  151. return ends_with(s.data(), s.length(), suff);
  152. }
  153. inline bool ends_with(const std::string &s, const char *suff, size_t suff_len)
  154. {
  155. return ends_with(s.data(), s.length(), suff, suff_len);
  156. }
  157. inline bool ends_with(const std::string &s, const std::string &suff)
  158. {
  159. return ends_with(s, suff.data(), suff.length());
  160. }
  161. //----------------------------------------------------------------------------
  162. } // namespace
  163. #endif // header guard