Skip to content

Commit d5a087e

Browse files
authored
Merge pull request #244 from vizzuhq/chart_filter_add_deleter
Add deleter function to chartfilter
2 parents 98efd39 + b3ec890 commit d5a087e

File tree

6 files changed

+25
-26
lines changed

6 files changed

+25
-26
lines changed

src/apps/weblib/cinterface.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,13 @@ void chart_setValue(const char *path, const char *value)
175175
Interface::instance.setChartValue(path, value);
176176
}
177177

178-
void chart_setFilter(
179-
managable_js_function_ptr<bool, const void *> filter)
178+
void chart_setFilter(bool (*filter)(const void *),
179+
void (*deleter)(bool (*)(const void *)))
180180
{
181-
Interface::instance.setChartFilter(filter);
181+
if (filter)
182+
Interface::instance.setChartFilter({{filter, deleter}});
183+
else
184+
Interface::instance.setChartFilter({});
182185
}
183186

184187
const void *

src/apps/weblib/cinterface.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
#include <cstdint>
55
#include <typeinfo>
66

7-
template <class Return, class... Args>
8-
using managable_js_function_ptr = Return (*)(Args...);
9-
107
extern "C" {
118

129
extern void vizzu_init();
@@ -45,8 +42,8 @@ extern const char *style_getValue(const char *path, bool computed);
4542
const char *chart_getList();
4643
const char *chart_getValue(const char *path);
4744
extern void chart_setValue(const char *path, const char *value);
48-
extern void chart_setFilter(
49-
managable_js_function_ptr<bool, const void *> filter);
45+
extern void chart_setFilter(bool (*)(const void *),
46+
void (*)(bool (*)(const void *)));
5047
extern void chart_animate(void (*callback)(bool));
5148
extern void
5249
chart_relToCanvasCoords(double rx, double ry, double *x, double *y);

src/apps/weblib/interface.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
mergeInto(LibraryManager.library, {
2-
removeJsFunction: function(ptr) {
3-
Module.removeFunction(ptr);
4-
},
52
jsconsolelog: function(str) {
63
console.log(new Date().toISOString() + ': ' + UTF8ToString(str));
74
},

src/apps/weblib/interfacejs.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ extern void jsconsolelog(const char *);
66
extern void openUrl(const char *);
77
extern void setCursor(const char *cursor);
88
extern void event_invoked(int, const char *);
9-
extern void removeJsFunction(void (*)());
109
}
1110

1211
#endif

src/apps/weblib/js-api/data.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,17 @@ export default class Data {
261261
setFilter(filter) {
262262
if (typeof filter === "function") {
263263
let callback = (ptr) => filter(new DataRecord(this.chart, ptr));
264-
let callbackPtr = this.chart.module.addFunction(callback, "ii");
265-
this.chart._call(this.chart.module._chart_setFilter)(callbackPtr);
264+
let callbackPtrs = [this.chart.module.addFunction(callback, "ii")];
265+
let deleter = (ptr) => {
266+
if (ptr !== callbackPtrs[0])
267+
console.warn("Wrong pointer passed to destructor");
268+
this.chart.module.removeFunction(callbackPtrs[0]);
269+
this.chart.module.removeFunction(callbackPtrs[1]);
270+
};
271+
callbackPtrs.push(this.chart.module.addFunction(deleter, "vi"));
272+
this.chart._call(this.chart.module._chart_setFilter)(...callbackPtrs);
266273
} else if (filter === null) {
267-
this.chart._call(this.chart.module._chart_setFilter)(0);
274+
this.chart._call(this.chart.module._chart_setFilter)(0, 0);
268275
} else {
269276
throw new Error("data filter is not a function or null");
270277
}

src/apps/weblib/jsfunctionwrapper.h

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,15 @@ namespace Vizzu
1111
template <class R, class... Ts> class JsFunctionWrapper
1212
{
1313
private:
14-
using JsFun = R (*)(std::conditional_t<
14+
using JsFun = R(std::conditional_t<
1515
std::is_const_v<std::remove_reference_t<Ts>>,
1616
const void *,
1717
void *>...);
1818

1919
public:
20-
constexpr JsFunctionWrapper(JsFun fun) : wrapper{fun, {}}
21-
{
22-
if (fun)
23-
wrapper.releaser = {reinterpret_cast<void (*)()>(fun),
24-
removeJsFunction};
25-
}
20+
constexpr JsFunctionWrapper(std::shared_ptr<JsFun> &&fun = {}) :
21+
wrapper{std::move(fun)}
22+
{}
2623

2724
operator std::function<R(Ts...)>() &&
2825
{
@@ -34,15 +31,14 @@ template <class R, class... Ts> class JsFunctionWrapper
3431

3532
std::size_t hash() const noexcept
3633
{
37-
return std::hash<JsFun>{}(wrapper.fun);
34+
return std::hash<std::shared_ptr<JsFun>>{}(wrapper.fun);
3835
}
3936

4037
private:
4138
struct
4239
{
43-
JsFun fun;
44-
std::shared_ptr<void()> releaser;
45-
R operator()(Ts &&...ts) const { return fun(&ts...); }
40+
std::shared_ptr<JsFun> fun;
41+
R operator()(Ts &&...ts) const { return (*fun)(&ts...); }
4642
} wrapper;
4743
};
4844

0 commit comments

Comments
 (0)