-
Notifications
You must be signed in to change notification settings - Fork 0
/
impl.cpp
126 lines (117 loc) · 3.77 KB
/
impl.cpp
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
118
119
120
121
122
123
124
125
126
const fix32 ZERO = fix32(0);
void setmetatable(TValue t, TValue meta) {
std::get<SpecialTable*>(t.data)->metatable = std::get<SpecialTable*>(meta.data);
}
extern uint8_t btn(uint8_t);
void print(const TValue t) {
switch(t.data.index()) {
case TT_STR:
printf("%s\n", std::get<const char*>(t.data));
break;
case TT_NUM:
{
auto n = std::get<fix32>(t.data);
fix32 _dec = fix32::decimals(n);
if(_dec > ZERO) {
char buf[17];
fix32::to_string(_dec, buf);
printf("%d.%s\n", int16_t(n), buf);
} else {
printf("%d\n", int16_t(n));
}
break;
}
case TT_NULL:
printf("NULL\n");
break;
case TT_FN:
printf("F<%p>\n", (void*)&std::get<TT_FN>(t.data));
break;
case TT_TAB:
printf("T<%p>\n", (void*)std::get<SpecialTable*>(t.data));
break;
}
}
#if defined(SDL_BACKEND) || defined(ESP_BACKEND) || defined(PICO_BACKEND)
void print(TValue value, int16_t x, int16_t y, int16_t col) {
static char numbuf[23];
if(value.data.index() == TT_STR) {
auto s = std::get<const char*>(value.data);
_print(s, strlen(s), x, y, col);
}
if(value.data.index() == TT_NUM) {
auto n = std::get<fix32>(value.data);
int16_t decimals = (uint16_t)fix32::decimals(n);
if (decimals) {
char buf[17];
fix32::to_string(decimals, buf);
int len = sprintf(numbuf, "%d.%s", (uint16_t)n, buf);
_print(numbuf, len, x, y, col);
} else {
int len = sprintf(numbuf, "%d", (uint16_t)n);
_print(numbuf, len, x, y, col);
}
}
}
#endif
void foreach(TValue val, TValue fnval) {
auto f = std::get<TT_FN>(fnval.data)->func;
auto t = std::get<SpecialTable*>(val.data);
// standard for instead of magic iterator as items can be deleted from the table
// during iteration
for (auto it = t->fields.cbegin(); it != t->fields.cend(); /* no increment */) {
auto next = it;
++next;
if(it->second->data.index() != TT_NULL) {
f({*it->second});
}
it = next;
}
}
inline fix32 count(TValue val) {
auto t = std::get<SpecialTable*>(val.data);
//assertm(val.tag == TT_TAB, "Can't count a non-table");
// p8 limits integers to uint16_t (SHRT_MAX) .. also there's not enough memory anyway
// to store so many items
return (uint16_t)t->fields.size();
}
inline fix32 rnd(float limit = 1.0f) {
float x = (float)rand()/(float)((float)RAND_MAX/limit);
return x;
}
inline fix32 flr(fix32 n) {
fix32 ret = fix32::floor(n);
return ret;
}
TValue add(TValue table, TValue val) {
auto t = std::get<SpecialTable*>(table.data);
t->last_auto_index++;
*(*t)[fix32(t->last_auto_index)] = val;
return val;
}
void del(TValue table, TValue val) {
auto t = std::get<SpecialTable*>(table.data);
for (auto it = t->fields.cbegin(); it != t->fields.cend(); ++it) {
if (*it->second == val) {
if(it->second->data.index() == TT_TAB) {
free(std::get<SpecialTable*>(it->second->data));
// delete it->second->data;
delete it->second;
}
t->fields.erase(it);
break;
}
}
}
inline TValue sget(TValue x, TValue y) {
#if defined(SDL_BACKEND) || defined(ESP_BACKEND) || defined(PICO_BACKEND)
return get_pixel(x, y);
#else
return TValue(fix32(0));
#endif
}
inline void pset(TValue x, TValue y, TValue color) {
#if defined(SDL_BACKEND) || defined(ESP_BACKEND) || defined(PICO_BACKEND)
_pset(x, y, color);
#endif
}