diff --git a/src/Python/Vector.hh b/src/Python/Vector.hh index f43cd14b..759a6638 100644 --- a/src/Python/Vector.hh +++ b/src/Python/Vector.hh @@ -38,6 +38,71 @@ Scalar get_item(Vector& _vec, int _index) { return 0.0; } +namespace { +template +struct Factory { + typedef OpenMesh::VectorT Vector2; + typedef OpenMesh::VectorT Vector3; + typedef OpenMesh::VectorT Vector4; + + static Vector2 *vec2_default() { + return new Vector2(Scalar(), Scalar()); + } + static Vector2 *vec2_user_defined(const Scalar& _v0, const Scalar& _v1) { + return new Vector2(_v0, _v1); + } + static Vector3 *vec3_default() { + return new Vector3(Scalar(), Scalar(), Scalar()); + } + static Vector3 *vec3_user_defined(const Scalar& _v0, const Scalar& _v1, const Scalar& _v2) { + return new Vector3(_v0, _v1, _v2); + } + static Vector4 *vec4_default() { + return new Vector4(Scalar(), Scalar(), Scalar(), Scalar()); + } + static Vector4 *vec4_user_defined(const Scalar& _v0, const Scalar& _v1, const Scalar& _v2, const Scalar& _v3) { + return new Vector4(_v0, _v1, _v2, _v3); + } +}; +} + +template +void defInitMod(class_> &classVector); + +template +void defInitMod(class_> &classVector) { + classVector + .def("__init__", make_constructor(&Factory::vec2_default)) + .def("__init__", make_constructor(&Factory::vec2_user_defined)) + ; + + typedef OpenMesh::VectorT Vector; + def("dot", &Vector::operator|); +} +template +void defInitMod(class_> &classVector) { + classVector + .def("__init__", make_constructor(&Factory::vec3_default)) + .def("__init__", make_constructor(&Factory::vec3_user_defined)) + .def("__mod__", &Factory::Vector3::operator%) + ; + + def("cross", &Factory::Vector3::operator%); + + typedef OpenMesh::VectorT Vector; + def("dot", &Vector::operator|); +} +template +void defInitMod(class_> &classVector) { + classVector + .def("__init__", make_constructor(&Factory::vec4_default)) + .def("__init__", make_constructor(&Factory::vec4_user_defined)) + ; + + typedef OpenMesh::VectorT Vector; + def("dot", &Vector::operator|); +} + /** * Expose a vector type to %Python. * @@ -115,56 +180,7 @@ void expose_vec(const char *_name) { .staticmethod("vectorized") ; - typedef OpenMesh::VectorT Vector2; - typedef OpenMesh::VectorT Vector3; - typedef OpenMesh::VectorT Vector4; - - struct Factory { - static Vector2 *vec2_default() { - return new Vector2(Scalar(), Scalar()); - } - static Vector2 *vec2_user_defined(const Scalar& _v0, const Scalar& _v1) { - return new Vector2(_v0, _v1); - } - static Vector3 *vec3_default() { - return new Vector3(Scalar(), Scalar(), Scalar()); - } - static Vector3 *vec3_user_defined(const Scalar& _v0, const Scalar& _v1, const Scalar& _v2) { - return new Vector3(_v0, _v1, _v2); - } - static Vector4 *vec4_default() { - return new Vector4(Scalar(), Scalar(), Scalar(), Scalar()); - } - static Vector4 *vec4_user_defined(const Scalar& _v0, const Scalar& _v1, const Scalar& _v2, const Scalar& _v3) { - return new Vector4(_v0, _v1, _v2, _v3); - } - }; - - if (N == 2) { - classVector - .def("__init__", make_constructor(&Factory::vec2_default)) - .def("__init__", make_constructor(&Factory::vec2_user_defined)) - ; - } - - if (N == 3) { - classVector - .def("__init__", make_constructor(&Factory::vec3_default)) - .def("__init__", make_constructor(&Factory::vec3_user_defined)) - .def("__mod__", &Vector3::operator%) - ; - - def("cross", &Vector3::operator%); - } - - if (N == 4) { - classVector - .def("__init__", make_constructor(&Factory::vec4_default)) - .def("__init__", make_constructor(&Factory::vec4_user_defined)) - ; - } - - def("dot", &Vector::operator|); + defInitMod(classVector); } } // namespace OpenMesh