diff --git a/include/eigenpy/register.hpp b/include/eigenpy/register.hpp index 673bf4a7dc457b81e2537ff140ed0d5e143306cb..c6bc39c4eb84fd4aa8a191a930684f452d184a97 100644 --- a/include/eigenpy/register.hpp +++ b/include/eigenpy/register.hpp @@ -21,14 +21,7 @@ namespace eigenpy struct EIGENPY_DLLEXPORT Register { - static PyArray_Descr * getPyArrayDescr(PyTypeObject * py_type_ptr) - { - MapDescr::iterator it = py_array_descr_bindings.find(py_type_ptr); - if(it != py_array_descr_bindings.end()) - return it->second; - else - return NULL; - } + static PyArray_Descr * getPyArrayDescr(PyTypeObject * py_type_ptr); template<typename Scalar> static bool isRegistered() @@ -36,22 +29,9 @@ namespace eigenpy return isRegistered(Register::getPyType<Scalar>()); } - static bool isRegistered(PyTypeObject * py_type_ptr) - { - if(getPyArrayDescr(py_type_ptr) != NULL) - return true; - else - return false; - } + static bool isRegistered(PyTypeObject * py_type_ptr); - static int getTypeCode(PyTypeObject * py_type_ptr) - { - MapCode::iterator it = py_array_code_bindings.find(py_type_ptr); - if(it != py_array_code_bindings.end()) - return it->second; - else - return PyArray_TypeNum(py_type_ptr); - } + static int getTypeCode(PyTypeObject * py_type_ptr); template<typename Scalar> static PyTypeObject * getPyType() @@ -74,7 +54,7 @@ namespace eigenpy return new_descr->typeobj; } } - + template<typename Scalar> static int getTypeCode() { @@ -83,10 +63,10 @@ namespace eigenpy else { const std::type_info & info = typeid(Scalar); - if(type_to_py_type_bindings.find(&info) != type_to_py_type_bindings.end()) + if(instance().type_to_py_type_bindings.find(&info) != instance().type_to_py_type_bindings.end()) { - PyTypeObject * py_type = type_to_py_type_bindings[&info]; - int code = py_array_code_bindings[py_type]; + PyTypeObject * py_type = instance().type_to_py_type_bindings[&info]; + int code = instance().py_array_code_bindings[py_type]; return code; } @@ -103,48 +83,9 @@ namespace eigenpy PyArray_NonzeroFunc * nonzero, PyArray_CopySwapFunc * copyswap, PyArray_CopySwapNFunc * copyswapn, - PyArray_DotFunc * dotfunc) - { - namespace bp = boost::python; - - PyArray_Descr * descr_ptr = new PyArray_Descr(*call_PyArray_DescrFromType(NPY_OBJECT)); - PyArray_Descr & descr = *descr_ptr; - descr.typeobj = py_type_ptr; - descr.kind = 'V'; - descr.byteorder = '='; - descr.elsize = type_size; - descr.flags = NPY_LIST_PICKLE | NPY_USE_GETITEM | NPY_USE_SETITEM | NPY_NEEDS_INIT | NPY_NEEDS_PYAPI; -// descr->names = PyTuple_New(0); -// descr->fields = PyDict_New(); - - PyArray_ArrFuncs * funcs_ptr = new PyArray_ArrFuncs; - PyArray_ArrFuncs & funcs = *funcs_ptr; - descr.f = funcs_ptr; - call_PyArray_InitArrFuncs(funcs_ptr); - funcs.getitem = getitem; - funcs.setitem = setitem; - funcs.nonzero = nonzero; - funcs.copyswap = copyswap; - funcs.copyswapn = copyswapn; - funcs.dotfunc = dotfunc; -// f->cast = cast; - - const int code = call_PyArray_RegisterDataType(descr_ptr); - assert(code >= 0 && "The return code should be positive"); - PyArray_Descr * new_descr = call_PyArray_DescrFromType(code); - - type_to_py_type_bindings.insert(std::make_pair(type_info_ptr,py_type_ptr)); - py_array_descr_bindings[py_type_ptr] = new_descr; - py_array_code_bindings[py_type_ptr] = code; - -// PyArray_RegisterCanCast(descr,NPY_OBJECT,NPY_NOSCALAR); - return code; - } + PyArray_DotFunc * dotfunc); -// static Register & instance() -// { -// return self; -// } + static Register & instance(); private: @@ -167,16 +108,14 @@ namespace eigenpy }; typedef std::map<const std::type_info *,PyTypeObject *,Compare_TypeInfo> MapInfo; - static MapInfo type_to_py_type_bindings; + MapInfo type_to_py_type_bindings; typedef std::map<PyTypeObject *,PyArray_Descr *,Compare_PyTypeObject> MapDescr; - static MapDescr py_array_descr_bindings; + MapDescr py_array_descr_bindings; typedef std::map<PyTypeObject *,int,Compare_PyTypeObject> MapCode; - static MapCode py_array_code_bindings; - -// static Register self; - + MapCode py_array_code_bindings; + }; } // namespace eigenpy diff --git a/src/register.cpp b/src/register.cpp index 8e12ad752c0885ce4ab0a3e5e9ac5f25f8fb828c..3fd2cccd8d8bca7c4f811e0dfb7754f43f346924 100644 --- a/src/register.cpp +++ b/src/register.cpp @@ -7,8 +7,80 @@ namespace eigenpy { - Register::MapDescr Register::py_array_descr_bindings; - Register::MapCode Register::py_array_code_bindings; - Register::MapInfo Register::type_to_py_type_bindings; + PyArray_Descr * Register::getPyArrayDescr(PyTypeObject * py_type_ptr) + { + MapDescr::iterator it = instance().py_array_descr_bindings.find(py_type_ptr); + if(it != instance().py_array_descr_bindings.end()) + return it->second; + else + return NULL; + } + + bool Register::isRegistered(PyTypeObject * py_type_ptr) + { + if(getPyArrayDescr(py_type_ptr) != NULL) + return true; + else + return false; + } + + int Register::getTypeCode(PyTypeObject * py_type_ptr) + { + MapCode::iterator it = instance().py_array_code_bindings.find(py_type_ptr); + if(it != instance().py_array_code_bindings.end()) + return it->second; + else + return PyArray_TypeNum(py_type_ptr); + } + + int Register::registerNewType(PyTypeObject * py_type_ptr, + const std::type_info * type_info_ptr, + const int type_size, + PyArray_GetItemFunc * getitem, + PyArray_SetItemFunc * setitem, + PyArray_NonzeroFunc * nonzero, + PyArray_CopySwapFunc * copyswap, + PyArray_CopySwapNFunc * copyswapn, + PyArray_DotFunc * dotfunc) + { + PyArray_Descr * descr_ptr = new PyArray_Descr(*call_PyArray_DescrFromType(NPY_OBJECT)); + PyArray_Descr & descr = *descr_ptr; + descr.typeobj = py_type_ptr; + descr.kind = 'V'; + descr.byteorder = '='; + descr.elsize = type_size; + descr.flags = NPY_LIST_PICKLE | NPY_USE_GETITEM | NPY_USE_SETITEM | NPY_NEEDS_INIT | NPY_NEEDS_PYAPI; + // descr->names = PyTuple_New(0); + // descr->fields = PyDict_New(); + + PyArray_ArrFuncs * funcs_ptr = new PyArray_ArrFuncs; + PyArray_ArrFuncs & funcs = *funcs_ptr; + descr.f = funcs_ptr; + call_PyArray_InitArrFuncs(funcs_ptr); + funcs.getitem = getitem; + funcs.setitem = setitem; + funcs.nonzero = nonzero; + funcs.copyswap = copyswap; + funcs.copyswapn = copyswapn; + funcs.dotfunc = dotfunc; + // f->cast = cast; + + const int code = call_PyArray_RegisterDataType(descr_ptr); + assert(code >= 0 && "The return code should be positive"); + PyArray_Descr * new_descr = call_PyArray_DescrFromType(code); + + instance().type_to_py_type_bindings.insert(std::make_pair(type_info_ptr,py_type_ptr)); + instance().py_array_descr_bindings[py_type_ptr] = new_descr; + instance().py_array_code_bindings[py_type_ptr] = code; + + // PyArray_RegisterCanCast(descr,NPY_OBJECT,NPY_NOSCALAR); + return code; + } + + Register & Register::instance() + { + static Register self; + return self; + } } // namespace eigenpy