Fix memory leak, improve code
This commit is contained in:
parent
ce7be396d2
commit
816a8af654
1 changed files with 25 additions and 20 deletions
|
@ -55,26 +55,27 @@ vec3.z = vec1.x + vec2.y / 4.0
|
||||||
System.print("vec3 modified by scripting: <%(vec3.x), %(vec3.y), %(vec3.z)>")
|
System.print("vec3 modified by scripting: <%(vec3.x), %(vec3.y), %(vec3.z)>")
|
||||||
)script";
|
)script";
|
||||||
|
|
||||||
class MathVector {
|
template <typename T>
|
||||||
|
class Vector {
|
||||||
public:
|
public:
|
||||||
MathVector() = default;
|
Vector() = default;
|
||||||
explicit MathVector (double value) :
|
explicit Vector (T value) :
|
||||||
m_x(value), m_y(value), m_z(value)
|
m_x(value), m_y(value), m_z(value)
|
||||||
{}
|
{}
|
||||||
MathVector (double x, double y, double z) :
|
Vector (T x, T y, T z) :
|
||||||
m_x(x), m_y(y), m_z(z)
|
m_x(x), m_y(y), m_z(z)
|
||||||
{}
|
{}
|
||||||
~MathVector() noexcept = default;
|
~Vector() noexcept = default;
|
||||||
|
|
||||||
double x() const { return m_x; }
|
T x() const { return m_x; }
|
||||||
double y() const { return m_y; }
|
T y() const { return m_y; }
|
||||||
double z() const { return m_z; }
|
T z() const { return m_z; }
|
||||||
void set_x(double x) { m_x = x; }
|
void set_x(T x) { m_x = x; }
|
||||||
void set_y(double y) { m_y = y; }
|
void set_y(T y) { m_y = y; }
|
||||||
void set_z(double z) { m_z = z; }
|
void set_z(T z) { m_z = z; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double m_x{}, m_y{}, m_z{};
|
T m_x{}, m_y{}, m_z{};
|
||||||
};
|
};
|
||||||
|
|
||||||
class MyConf : public wren::DefConfiguration {
|
class MyConf : public wren::DefConfiguration {
|
||||||
|
@ -82,13 +83,17 @@ System.print("vec3 modified by scripting: <%(vec3.x), %(vec3.y), %(vec3.z)>")
|
||||||
char* load_module_fn(wren::VM* vm, std::string_view module_name) {
|
char* load_module_fn(wren::VM* vm, std::string_view module_name) {
|
||||||
if (module_name == "math_vector") {
|
if (module_name == "math_vector") {
|
||||||
constexpr const std::size_t buff_sz = g_math_vector_src.size() + 1;
|
constexpr const std::size_t buff_sz = g_math_vector_src.size() + 1;
|
||||||
char* const buff = static_cast<char*>(MyConf::reallocate_fn(nullptr, buff_sz));
|
char* const buff = new char[buff_sz];
|
||||||
std::copy(g_math_vector_src.cbegin(), g_math_vector_src.cend(), buff);
|
std::copy(g_math_vector_src.cbegin(), g_math_vector_src.cend(), buff);
|
||||||
buff[buff_sz - 1] = '\0';
|
buff[buff_sz - 1] = '\0';
|
||||||
return buff;
|
return buff;
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void load_module_complete_fn(wren::VM*, std::string_view, char* buffer) {
|
||||||
|
delete[] buffer;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
} //unnamed namespace
|
} //unnamed namespace
|
||||||
|
|
||||||
|
@ -99,15 +104,15 @@ int main() {
|
||||||
MyConf conf;
|
MyConf conf;
|
||||||
wren::VM vm(&conf, nullptr);
|
wren::VM vm(&conf, nullptr);
|
||||||
vm.callback_manager()
|
vm.callback_manager()
|
||||||
.add_callback(false, "math_vector", "MathVector", "x=(_)", make_method_bindable<&MathVector::set_x>())
|
.add_callback(false, "math_vector", "MathVector", "x=(_)", make_method_bindable<&Vector<double>::set_x>())
|
||||||
.add_callback(false, "math_vector", "MathVector", "y=(_)", make_method_bindable<&MathVector::set_y>())
|
.add_callback(false, "math_vector", "MathVector", "y=(_)", make_method_bindable<&Vector<double>::set_y>())
|
||||||
.add_callback(false, "math_vector", "MathVector", "z=(_)", make_method_bindable<&MathVector::set_z>())
|
.add_callback(false, "math_vector", "MathVector", "z=(_)", make_method_bindable<&Vector<double>::set_z>())
|
||||||
.add_callback(false, "math_vector", "MathVector", "x", make_method_bindable<&MathVector::x>())
|
.add_callback(false, "math_vector", "MathVector", "x", make_method_bindable<&Vector<double>::x>())
|
||||||
.add_callback(false, "math_vector", "MathVector", "y", make_method_bindable<&MathVector::y>())
|
.add_callback(false, "math_vector", "MathVector", "y", make_method_bindable<&Vector<double>::y>())
|
||||||
.add_callback(false, "math_vector", "MathVector", "z", make_method_bindable<&MathVector::z>());
|
.add_callback(false, "math_vector", "MathVector", "z", make_method_bindable<&Vector<double>::z>());
|
||||||
|
|
||||||
vm.class_manager()
|
vm.class_manager()
|
||||||
.add_class_maker("math_vector", "MathVector", &make_foreign_class<MathVector,
|
.add_class_maker("math_vector", "MathVector", &make_foreign_class<Vector<double>,
|
||||||
double, //single value constructor
|
double, //single value constructor
|
||||||
std::tuple<double, double, double>, //x,y,z constructor
|
std::tuple<double, double, double>, //x,y,z constructor
|
||||||
std::tuple<> //default constructor
|
std::tuple<> //default constructor
|
||||||
|
|
Loading…
Reference in a new issue