1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#ifndef UTILITY_H_
#define UTILITY_H_
#include <string>
#include <stack>
#include <cctype>
namespace meow{
inline std::string stringPrintf(char const * fmt, ...);
inline std::string stringReplace(std::string str,
std::string const& from,
std::string const& to);
inline bool cstringEndWith(char const* str, int n, ...);
#define debugPrintf(...) \
meow::debugPrintf_(\
__FILE__,\
__PRETTY_FUNCTION__,\
__LINE__,\
meow::stringPrintf(__VA_ARGS__).c_str())
inline void debugPrintf_(char const* file,
char const* func,
size_t line,
char const* msg);
inline void messagePrintf(int level_change, char const* fmt, ...);
static const double PI = 3.14159265358979323846264338327950288;
inline double noEPS(double value, double eps = 1e-9);
inline double normalize(double lower, double upper, double value);
inline double denormalize(double lower, double upper, double ratio);
inline double ratioMapping(double l1, double u1, double m1,
double l2, double u2);
template<class T>
inline T inRange(T const& mn, T const& mx, T const& v);
template<class T>
inline T squ(T const& x);
template<class T>
inline double average(T const& beg, T const& end, double sigs);
template<class T>
inline double average(T const& beg, T const& end, T const& p, double sigs);
//#
//# === meow:: *Functios* in utility.h
//#
//# [options="header",width="100%",cols="1>s,5<,1<,10<",grid="rows"]
//# |==============================================================
//# |Name | Parameters | Return_Type | Description
//# |stringPrintf |(char const * `fmt`, ...) | std::string
//# |Format print to C++ string and return it
//# |stringReplace |(std::string `str`,\
//# std::string const& `from`,\
//# std::string const& `to`) | std::string
//# |Return a string like `str`, but all `from` be replaced by `to`
//# |cstringEndWith |(char const* `str`,\int `n`, ...) | bool
//# |Return whether `str` is end with one of the c-string you specify in
//# the parameters or not
//# |debugPrintf |(char const* `fmt`, ...) | void
//# |Print debug message (file name, line number, ...etc) when `DEBUG` is
//# defined
//# |messagePrintf |(int `level_change`,\char const* `fmt`, ...) | void
//# |階層式的訊息輸出
//# |noEPS |(double `value`, double `eps` = 1e-9) | double |
//# 如果abs(輸入的數值) < eps, 則回傳0, 否則回傳輸入的數值
//# |normalize |(double `lower`, double `upper`, \ double value)
//# | double | `(value - lower) / (upper - lower)`
//# |denormalize |(double `lower`, double `upper`,
//# \ double `ratio`) | double | `lower + (upper - lower) * ratio`
//# |ratioMapping |(double `l1`, double `u1`,
//# \double `m1`, double `l2`,\double `u2`)
//# | double | `denormalize(l2, u2, normalize(l1, u1, m1))`
//# |inRange<T> |(T const& `mn`, T const& `mx`, \ T const& `v`) | T |
//# `std::max(mn, std::min(mx, v))`
//# |squ<T> |(T const& `x`) | T| `x * x`
//# |average<T>|(T const& `beg`, T const& `end`, \ double `sigs`)| T|
//# 只將 `sigs` 個標準差以內的數據拿來取平均
//# |average<T>|(T const& `beg`, T const& `end`,
//# \ T const& `p`, double `sigs`)| T| 同上, 不過這次用 `p` 來加權平均
//# |==============================================================
//#
//# [NOTE]
//# ====================================
//# * `stringReplace()` 不是用什麼好方法寫的因此執行效率很低請別虐待它.
//# * 額外附贈一個 `const double PI = 3.141592653589......`
//# ====================================
//#
//# '''
//#
}
#include "utility.hpp"
#endif // UTILITY_H_
|