aboutsummaryrefslogtreecommitdiffstats
path: root/meowpp/utility.h
blob: 4f3b36ae78f40e9dc839ffed4fec5f2b4bf8d466 (plain) (blame)
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
#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);

  /*******************************************************************
    @asciidoc
    === 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......`

'''
@asciidoc-
   ******************************************************************/
}

#include "utility.hpp"

#endif // UTILITY_H_