Click
Loading...
Searching...
No Matches
tinyexpr.hh
1#ifndef CLICK_TINYEXPR_HH
2#define CLICK_TINYEXPR_HH
3
4#include <tinyexpr/tinyexpr.h>
5
6CLICK_DECLS
7
8static double square_wave(double x) {
9 if ((int)(x * 2) % 2 < 1)
10 return 1;
11 else
12 return -1;
13}
14
15static double t_min(double a, double b) {
16 if (a < b)
17 return a;
18 else
19 return b;
20}
21
22static double t_max(double a, double b) {
23 if (a > b)
24 return a;
25 else
26 return b;
27}
28
29
30
31class TinyExpr { public:
32
33 static TinyExpr compile(String expr, int n_vars) {
34
35 static constexpr const char* const var_names[] = {"x", "y", "z"};
36 TinyExpr e;
37 assert(n_vars < 4);
38 e._n_vars = n_vars + 3;
39 e._vars = (te_variable*)CLICK_LALLOC(sizeof(te_variable) * e._n_vars);
40 e._vars_values = (double*)CLICK_LALLOC(sizeof(double) * e._n_vars);
41 for (int i = 0; i < n_vars; i++) {
42 e._vars[i] = {var_names[i], &e._vars_values[i], 0};
43 }
44 e._vars[n_vars] = (te_variable){"squarewave", (const void*)square_wave, TE_FUNCTION1};
45 e._vars[n_vars + 1] = (te_variable){"min", (const void*)t_min, TE_FUNCTION2};
46 e._vars[n_vars + 2] = (te_variable){"max", (const void*)t_max, TE_FUNCTION2};
47 int error;
48 e._expr = te_compile(expr.c_str(), e._vars, e._n_vars, &error);
49 assert(error == 0);
50 return e;
51 }
52
53 double eval(double x) {
54 _vars_values[0] = x;
55 return te_eval(_expr);
56 }
57
58 double eval() {
59 return te_eval(_expr);
60 }
61
62 TinyExpr(const TinyExpr& expr) {
63 if (_expr) {
64 if (_expr == expr._expr)
65 return;
66 this->~TinyExpr();
67 }
68 _expr = expr._expr;
69 _n_vars = expr._n_vars;
70 _vars = expr._vars;
71 _vars_values = expr._vars_values;
72 _use_count = expr._use_count;
73 _use_count = _use_count + 1;
74 }
75
76 operator bool() const {
77 return _expr;
78 }
79
80 ~TinyExpr() {
81 if (_expr && --*_use_count == 0) {
82 te_free(_expr);
83 CLICK_LFREE(_vars, _n_vars);
84 CLICK_LFREE(_vars_values, _n_vars);
85 CLICK_LFREE(_use_count, sizeof(unsigned));
86 }
87 }
88
89 TinyExpr() : _expr(0) {
90 _use_count = (unsigned*)CLICK_LALLOC(sizeof(unsigned));
91 }
92private:
93 te_expr *_expr;
94 te_variable *_vars;
95 double* _vars_values;
96 int _n_vars;
97 unsigned *_use_count;
98};
99
100CLICK_ENDDECLS
101
102#endif
A string of characters.
Definition string.hh:22
const char * c_str() const
Null-terminate the string.
Definition string.hh:519