| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include <unordered_map> |
|
|
| #include "BindingManager.h" |
|
|
| using namespace Base; |
|
|
| struct BindingManager::BindingManagerPrivate |
| { |
| std::unordered_map<const void*, PyObject*> wrapperMapper; |
|
|
| bool hasWrapper(const void* cptr) |
| { |
| auto it = wrapperMapper.find(cptr); |
| return it != wrapperMapper.end(); |
| } |
|
|
| void registerWrapper(const void* cptr, PyObject* pyObj) |
| { |
| wrapperMapper[cptr] = pyObj; |
| } |
|
|
| void releaseWrapper(const void* cptr, PyObject* pyObj) |
| { |
| auto it = wrapperMapper.find(cptr); |
| if (it != wrapperMapper.end() && (!pyObj || it->second == pyObj)) { |
| wrapperMapper.erase(it); |
| } |
| } |
|
|
| PyObject* retrieveWrapper(const void* cptr) |
| { |
| auto it = wrapperMapper.find(cptr); |
| if (it != wrapperMapper.end()) { |
| return it->second; |
| } |
|
|
| return nullptr; |
| } |
| }; |
|
|
| BindingManager& BindingManager::instance() |
| { |
| static BindingManager singleton; |
| return singleton; |
| } |
|
|
| BindingManager::BindingManager() |
| : p(new BindingManagerPrivate) |
| {} |
|
|
| BindingManager::~BindingManager() = default; |
|
|
| bool BindingManager::hasWrapper(const void* cptr) |
| { |
| return p->hasWrapper(cptr); |
| } |
|
|
| void BindingManager::registerWrapper(const void* cptr, PyObject* pyObj) |
| { |
| p->registerWrapper(cptr, pyObj); |
| } |
|
|
| void BindingManager::releaseWrapper(const void* cptr, PyObject* pyObj) |
| { |
| p->releaseWrapper(cptr, pyObj); |
| } |
|
|
| PyObject* BindingManager::retrieveWrapper(const void* cptr) |
| { |
| return p->retrieveWrapper(cptr); |
| } |
|
|