17 vsnprintf(str, 8192, fmt, args);
19 return std::string(str);
23 std::string
const& from,
24 std::string
const& to){
25 std::string out = str;
26 int len = from.length();
27 for(
size_t pos; (pos = out.find(from)) != std::string::npos; ){
28 out.replace(pos, len, to);
34 int len = strlen(str);
37 for(
int i = 0; i < n; i++){
38 char const* arg = va_arg(args,
char const*);
39 int arglen = strlen(arg);
40 if(arglen <= len && strcmp(str + len - arglen, arg) == 0){
53 fprintf(stderr,
"%s[%d] %s >> %s", file, line, func, msg);
63 vsnprintf(str, 8192, fmt, args);
65 if(last_level == 1 && level_change == -1){
66 printf(
" ...%s\n", str);
68 if(last_level == 1) printf(
"\n");
69 int32_t level2 = level + (level_change == -1 ? -1 : 0);
70 for(
int i = 0; i < level2; i++) printf(
"| ");
71 printf(
"%s%s", (level_change == -1 ?
"..." :
""), str);
72 if(level_change != 1) printf(
"\n");
74 level += level_change;
75 last_level = level_change;
79 inline double noEPS(
double value,
double eps){
80 return (fabs(value) <= fabs(eps) ? 0 : value);
83 inline double normalize(
double lower,
double upper,
double value){
84 return (value - lower) / (upper - lower);
87 inline double denormalize(
double lower,
double upper,
double ratio){
88 return lower + ratio * (upper - lower);
92 double l2,
double u2){
96 inline bool filenameCompare(std::string
const& f1, std::string
const& f2){
97 char const* s1 = f1.c_str();
98 char const* s2 = f2.c_str();
100 int l2 = f2.length();
102 for(i1 = i2 = 0; i1 < l1 || i2 < l2; i1++, i2++){
103 if(isdigit(s1[i1]) && isdigit(s2[i2])){
104 int n1 = atoi(s1 + i1);
105 int n2 = atoi(s2 + i2);
109 while(i1 + 1 < l1 && isdigit(s1[i1 + 1])) i1++;
110 while(i2 + 1 < l2 && isdigit(s2[i2 + 1])) i2++;
112 if(s1[i1] != s2[i2]){
113 return s1[i1] < s2[i2];
119 template<
class T>
inline T
inRange(T
const& mn, T
const& mx, T
const& v){
120 return std::min(mx, std::max(mn, v));
122 template<
class T>
inline double average(
123 T
const& beg, T
const& end,
127 for(T it = beg; it != end; it++, N++){
132 for(T it = beg; it != end; it++){
133 sig += (*it - av) * (*it - av);
136 double lower = av - sig * sigs, upper = av + sig * sigs;
137 double ret = 0, retn = 0;
138 for(T it = beg; it != end; it++){
139 if(lower <= *it && *it <= upper){
146 template<
class T>
inline double average(
147 T
const& beg, T
const& end,
152 for(T it = beg, ip = p; it != end; it++, N++, ip++){
156 for(T it = beg, ip = p; it != end; it++, ip++){
157 av += *it * *ip / ps;
160 for(T it = beg, ip = p; it != end; it++, ip++){
161 sig += *ip / ps * (*it - av) * (*it - av);
164 double lower = av - sig * sigs, upper = av + sig * sigs;
165 double ret = 0, retn = 0;
166 for(T it = beg, ip = p; it != end; it++, ip++){
167 if(lower <= *it && *it <= upper){
172 if(retn <= 1e-10)
return av;
T normalize(T lower, T upper, T value)
(value-lower)/(upper-lower)
bool filenameCompare(std::string const &f1, std::string const &f2)
將兩個字串用人類習慣的檔名排序方式排序
bool cstringEndWith(char const *str, int n,...)
檢查給定字串的結尾是否符合給定的數個patterns中的一個
T ratioMapping(T l1, T u1, T m1, T l2, T u2)
denormalize(l2,u2,normalize(l1,u1,m1))
T denormalize(T lower, T upper, T _ratio)
(lower+_ratio*(upper-lower))
void debugPrintf_(char const *file, char const *func, size_t line, char const *msg)
T noEPS(T value, T eps=1e-9)
如果abs(輸入的數值) < eps, 則回傳0, 否則回傳輸入的數值
double average(T const &beg, T const &end, double sigs)
只將 sigs 個標準差以內的數據拿來取平均
std::string stringReplace(std::string str, std::string const &from, std::string const &to)
將輸入字串中的某個pattern取代成另一個pattern
T inRange(T const &mn, T const &mx, T const &v)
std::min(mx,std::max(mn,v))
std::string stringPrintf(char const *fmt,...)
類似C的printf, 不過是將格式化的字串丟到 std::string 裡回傳
void messagePrintf(int level_change, char const *fmt,...)
階層式輸出