FreeCAD
1/***************************************************************************
2* Copyright (c) 2021 Werner Mayer <wmayer[at]users.sourceforge.net> *
3* *
4* This file is part of the FreeCAD CAx development system. *
5* *
6* This library is free software; you can redistribute it and/or *
7* modify it under the terms of the GNU Library General Public *
8* License as published by the Free Software Foundation; either *
9* version 2 of the License, or (at your option) any later version. *
10* *
11* This library is distributed in the hope that it will be useful, *
12* but WITHOUT ANY WARRANTY; without even the implied warranty of *
13* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14* GNU Library General Public License for more details. *
15* *
16* You should have received a copy of the GNU Library General Public *
17* License along with this library; see the file COPYING.LIB. If not, *
18* write to the Free Software Foundation, Inc., 59 Temple Place, *
19* Suite 330, Boston, MA 02111-1307, USA *
20* *
21***************************************************************************/
22
23
24#include "PreCompiled.h"25#ifndef _PreComp_26#include <unordered_map>27#endif28
29#include "BindingManager.h"30
31using namespace Base;32
33struct BindingManager::BindingManagerPrivate34{
35std::unordered_map<const void*, PyObject*> wrapperMapper;36
37bool hasWrapper(const void* cptr)38{39auto it = wrapperMapper.find(cptr);40return it != wrapperMapper.end();41}42
43void registerWrapper(const void* cptr, PyObject* pyObj)44{45wrapperMapper[cptr] = pyObj;46}47
48void releaseWrapper(const void* cptr, PyObject* pyObj)49{50auto it = wrapperMapper.find(cptr);51if (it != wrapperMapper.end() && (!pyObj || it->second == pyObj)) {52wrapperMapper.erase(it);53}54}55
56PyObject* retrieveWrapper(const void* cptr)57{58auto it = wrapperMapper.find(cptr);59if (it != wrapperMapper.end()) {60return it->second;61}62
63return nullptr;64}65};66
67BindingManager& BindingManager::instance()68{
69static BindingManager singleton;70return singleton;71}
72
73BindingManager::BindingManager()74: p(new BindingManagerPrivate)75{}76
77BindingManager::~BindingManager() = default;78
79bool BindingManager::hasWrapper(const void* cptr)80{
81return p->hasWrapper(cptr);82}
83
84void BindingManager::registerWrapper(const void* cptr, PyObject* pyObj)85{
86p->registerWrapper(cptr, pyObj);87}
88
89void BindingManager::releaseWrapper(const void* cptr, PyObject* pyObj)90{
91p->releaseWrapper(cptr, pyObj);92}
93
94PyObject* BindingManager::retrieveWrapper(const void* cptr)95{
96return p->retrieveWrapper(cptr);97}
98