cipher/base/stringutils.h

167 lines
5.9 KiB
C++

/*
** Copyright (C) 2014 Wang Yaofu
** All rights reserved.
**
**Author:Wang Yaofu voipman@qq.com
**Description: The header file of class CStringUitls.
*/
#pragma once
#include <string>
#include <sstream>
#include <vector>
#include <map>
#include <set>
#include <list>
#include <cctype>
namespace common {
enum TrimOption {
kTrimNone = 0,
kTrimLeading = 1 << 0,
kTrimTrailing = 1 << 1,
kTrimAll = kTrimLeading | kTrimTrailing,
};
class StrUtils {
public:
static void TrimWhitespace(const std::string& input,
TrimOption option, std::string* output);
static void ReplaceString(const std::string& input,
const std::string& old_val,
const std::string& new_val,
std::string* output);
static std::string ReplaceString(const std::string& input,
const std::string& old_val,
const std::string& new_val) {
std::string output;
ReplaceString(input, old_val, new_val, &output);
return output;
}
static void Trim(std::string& aStr, const std::string& aSep,
TrimOption aOption = kTrimTrailing) {
size_t pos = 0;
if (aOption & kTrimLeading) {
pos = aStr.find(aSep);
if (pos != aStr.npos) {
aStr.erase(0, pos + 1);
}
}
if (aOption & kTrimTrailing) {
pos = aStr.rfind(aSep);
if (pos != aStr.npos) {
aStr.erase(pos);
}
}
}
// ABC => abc
static std::string ToLowerCase(const std::string& input);
// str => STR
static std::string ToUpperCase(const std::string& input);
// 11&22&33 +& =>11 22 33 + &
static void SplitString(const std::string& str,
const std::string& s,
std::vector<std::string>* r);
// string to split string
static bool Split(const std::string& s,
char sep,
std::string& first,
std::string& second);
// any to string.
template <typename INT_TYPE>
static std::string to_string(const INT_TYPE& aValue) {
std::stringstream ss;
ss << aValue;
return ss.str();
}
template <typename K, typename V>
static std::string to_string(const typename std::pair<K, V>& v) {
std::ostringstream o;
o << to_string(v.first) << ": " << to_string(v.second);
return o.str();
}
template <typename T>
static std::string to_string(const T& beg, const T& end) {
std::ostringstream o;
for (T it = beg; it != end; ++it) {
if (it != beg)
o << ", ";
o << to_string(*it);
}
return o.str();
}
template <typename T>
static std::string to_string(const std::vector<T>& t) {
std::ostringstream o;
o << "[" << to_string(t.begin(), t.end()) << "]";
return o.str();
}
template <typename T>
static std::string to_string(const std::list<T>& t) {
std::ostringstream o;
o << "[" << to_string(t.begin(), t.end()) << "]";
return o.str();
}
template <typename K, typename V>
static std::string to_string(const std::map<K, V>& m) {
std::ostringstream o;
o << "{" << to_string(m.begin(), m.end()) << "}";
return o.str();
}
template <typename T>
static std::string to_string(const std::set<T>& s) {
std::ostringstream o;
o << "{" << to_string(s.begin(), s.end()) << "}";
return o.str();
}
template <class Type>
static Type stringToNum(const std::string& str) {
std::istringstream iss(str);
Type num;
iss >> num;
return num;
}
static int stoi(const std::string &str);
static long stol(const std::string &str, const int base = 10);
static long long stoll(const std::string &str, const int base = 10);
static unsigned long stoul(const std::string &str, const int base = 10);
static unsigned long long stoull(const std::string &str, const int base = 10);
static float stof(const std::string& str);
static double stod(const std::string& str);
static long double stold(const std::string& str);
// 11 22 33 + & => 11&22&33
static std::string JoinStr(std::vector<std::string>& parts, char delimiter);
// 11 22 33 + %% => 11%%22%%33
static std::string JoinStr(std::vector<std::string>& parts, const std::string& delimiter);
// 19AaZz\n => 31 39 41 61 5a 7a 0a
static std::string Hex(const char* cpSrcStr, int len, bool isUpper = false);
static std::string Hex(const std::string& srcStr, bool isUpper = false);
static std::string Hex(const char ch, bool isUpper = false);
static std::string fromHex(const char* from, size_t len);
static int fromHex(const char* from, char* to);
static std::string fromHex(const std::string& from);
static int HexStr2Int(const char* aStr, int len);
static int HexStr2Int(const std::string& srcStr);
static int Int2HexInt(int src);
static bool IsNumber(char ch);
static bool IsLetter(char ch);
static bool IsUnderLine(char ch);
static bool Format(std::string &outStr, const char *format, ...);
static unsigned int HfIp(const char* aStr, unsigned int aHashMod);
static unsigned int hf(const char* aStr, unsigned int aHashMod);
// System - v hash method, it is nice.
static unsigned int ELFhash(const char* aStr, unsigned int aHashMod = 0x7FFFFFFF);
};
} // namespace common