hstring.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #ifndef HV_STRING_H_
  2. #define HV_STRING_H_
  3. #include <string>
  4. #include <vector>
  5. #include <map>
  6. #include <sstream>
  7. #include "hbase.h"
  8. using std::string;
  9. typedef std::vector<string> StringList;
  10. // MultiMap
  11. namespace std {
  12. /*
  13. int main() {
  14. std::MultiMap<std::string, std::string> kvs;
  15. kvs["name"] = "hw";
  16. kvs["filename"] = "1.jpg";
  17. kvs["filename"] = "2.jpg";
  18. //kvs.insert(std::pair<std::string,std::string>("name", "hw"));
  19. //kvs.insert(std::pair<std::string,std::string>("filename", "1.jpg"));
  20. //kvs.insert(std::pair<std::string,std::string>("filename", "2.jpg"));
  21. for (auto& pair : kvs) {
  22. printf("%s:%s\n", pair.first.c_str(), pair.second.c_str());
  23. }
  24. auto iter = kvs.find("filename");
  25. if (iter != kvs.end()) {
  26. for (int i = 0; i < kvs.count("filename"); ++i, ++iter) {
  27. printf("%s:%s\n", iter->first.c_str(), iter->second.c_str());
  28. }
  29. }
  30. return 0;
  31. }
  32. */
  33. template<typename Key,typename Value>
  34. class MultiMap : public multimap<Key, Value> {
  35. public:
  36. Value& operator[](Key key) {
  37. auto iter = this->insert(std::pair<Key,Value>(key,Value()));
  38. return (*iter).second;
  39. }
  40. };
  41. }
  42. #ifdef USE_MULTIMAP
  43. #define HV_MAP std::MultiMap
  44. #else
  45. #define HV_MAP std::map
  46. #endif
  47. // KeyValue
  48. typedef HV_MAP<std::string, std::string> KeyValue;
  49. // std::map<std::string, std::string, StringCaseLess>
  50. class StringCaseLess : public std::less<std::string> {
  51. public:
  52. bool operator()(const std::string& lhs, const std::string& rhs) const {
  53. return stricmp(lhs.c_str(), rhs.c_str()) < 0;
  54. }
  55. };
  56. namespace hv {
  57. // NOTE: low-version NDK not provide std::to_string
  58. template<typename T>
  59. static inline std::string to_string(const T& t) {
  60. std::ostringstream oss;
  61. oss << t;
  62. return oss.str();
  63. }
  64. template<typename T>
  65. static inline T from_string(const std::string& str) {
  66. T t;
  67. std::istringstream iss(str);
  68. iss >> t;
  69. return t;
  70. }
  71. }
  72. #define SPACE_CHARS " \t\r\n"
  73. #define PAIR_CHARS "{}[]()<>\"\"\'\'``"
  74. string asprintf(const char* fmt, ...);
  75. // x,y,z
  76. StringList split(const string& str, char delim = ',');
  77. // user=amdin&pswd=123456
  78. KeyValue splitKV(const string& str, char kv_kv = '&', char k_v = '=');
  79. string trim(const string& str, const char* chars = SPACE_CHARS);
  80. string trimL(const string& str, const char* chars = SPACE_CHARS);
  81. string trimR(const string& str, const char* chars = SPACE_CHARS);
  82. string trim_pairs(const string& str, const char* pairs = PAIR_CHARS);
  83. string replace(const string& str, const string& find, const string& rep);
  84. // str=/mnt/share/image/test.jpg
  85. // basename=test.jpg
  86. // dirname=/mnt/share/image
  87. // filename=test
  88. // suffixname=jpg
  89. string basename(const string& str);
  90. string dirname(const string& str);
  91. string filename(const string& str);
  92. string suffixname(const string& str);
  93. #endif // HV_STRING_H_