Library of Assembled Shared Sources
pymap.cpp
Go to the documentation of this file.
1/** @file
2 * @author Bram de Greve (bram@cocamware.com)
3 * @author Tom De Muer (tom@cocamware.com)
4 *
5 * *** BEGIN LICENSE INFORMATION ***
6 *
7 * The contents of this file are subject to the Common Public Attribution License
8 * Version 1.0 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://lass.sourceforge.net/cpal-license. The License is based on the
11 * Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12 * use of software over a computer network and provide for limited attribution for
13 * the Original Developer. In addition, Exhibit A has been modified to be consistent
14 * with Exhibit B.
15 *
16 * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17 * WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18 * language governing rights and limitations under the License.
19 *
20 * The Original Code is LASS - Library of Assembled Shared Sources.
21 *
22 * The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23 * The Original Developer is the Initial Developer.
24 *
25 * All portions of the code written by the Initial Developer are:
26 * Copyright (C) 2004-2025 the Initial Developer.
27 * All Rights Reserved.
28 *
29 * Contributor(s):
30 *
31 * Alternatively, the contents of this file may be used under the terms of the
32 * GNU General Public License Version 2 or later (the GPL), in which case the
33 * provisions of GPL are applicable instead of those above. If you wish to allow use
34 * of your version of this file only under the terms of the GPL and not to allow
35 * others to use your version of this file under the CPAL, indicate your decision by
36 * deleting the provisions above and replace them with the notice and other
37 * provisions required by the GPL License. If you do not delete the provisions above,
38 * a recipient may use your version of this file under either the CPAL or the GPL.
39 *
40 * *** END LICENSE INFORMATION ***
41 */
42
43
44
45#include "python_common.h"
46#include "pymap.h"
47#include "pyobject_macros.h"
48#include "_lass_module.h"
49
50namespace lass
51{
52namespace python
53{
54namespace impl
55{
57 PY_CLASS_METHOD( Map, keys )
58 PY_CLASS_METHOD( Map, values )
59 PY_CLASS_METHOD( Map, items )
62 PY_CLASS_METHOD( Map, get )
63 PY_CLASS_METHOD_NAME( Map, getOrNone, "get" )
64 PY_CLASS_METHOD( Map, clear )
65 PY_CLASS_METHOD( Map, copy )
66 PY_CLASS_METHOD( Map, asDict )
67 LASS_EXECUTE_BEFORE_MAIN_EX( Map_executeBeforeMain,
68 Map::_lassPyClassDef.setSlot(Py_mp_length, &Map::length);
69 Map::_lassPyClassDef.setSlot(Py_mp_subscript, &Map::subscript);
70 Map::_lassPyClassDef.setSlot(Py_mp_ass_subscript, &Map::assSubscript);
71 )
72
73 Map::~Map()
74 {
75 }
76
77 Map::Map(TPimpl&& pimpl)
78 {
79 init(std::move(pimpl));
80 }
81
82 void Map::init(TPimpl&& pimpl)
83 {
84 LockGIL LASS_UNUSED(lock);
85 impl::initLassModule();
86 impl::fixObjectType(this);
87 pimpl_ = std::move(pimpl);
88 }
89
90 std::string Map::repr() const
91 {
92 LockGIL LASS_UNUSED(lock);
93 return pimpl_->repr();
94 }
95
96 const TPyObjPtr Map::keys() const
97 {
98 LockGIL LASS_UNUSED(lock);
99 return fromNakedToSharedPtrCast<PyObject>(pimpl_->keys());
100 }
101
102 const TPyObjPtr Map::values() const
103 {
104 LockGIL LASS_UNUSED(lock);
105 return fromNakedToSharedPtrCast<PyObject>(pimpl_->values());
106 }
107
108 const TPyObjPtr Map::items() const
109 {
110 LockGIL LASS_UNUSED(lock);
111 return fromNakedToSharedPtrCast<PyObject>(pimpl_->items());
112 }
113
114 const TPyObjPtr Map::get(const TPyObjPtr& key, const TPyObjPtr& defaultValue) const
115 {
116 LockGIL LASS_UNUSED(lock);
117 TPyObjPtr result = fromNakedToSharedPtrCast<PyObject>(pimpl_->subscript(key.get()));
118 if (!result && PyErr_ExceptionMatches(PyExc_KeyError))
119 {
120 PyErr_Clear();
121 result = defaultValue;
122 }
123 return result;
124 }
125
126 const TPyObjPtr Map::getOrNone(const TPyObjPtr& key) const
127 {
128 LockGIL LASS_UNUSED(lock);
129 return get(key, fromNakedToSharedPtrCast<PyObject>(Py_None));
130 }
131
132 const TMapPtr Map::copy() const
133 {
134 LockGIL LASS_UNUSED(lock);
135 TPimpl pimpl = pimpl_->copy();
136 return TMapPtr(new Map(std::move(pimpl)));
137 }
138
139 const TPyObjPtr Map::asDict() const
140 {
141 LockGIL LASS_UNUSED(lock);
142 return pimpl_->asNative();
143 }
144
145 void Map::clear()
146 {
147 LockGIL LASS_UNUSED(lock);
148 if (!pimpl_->clear())
149 {
150 impl::fetchAndThrowPythonException(LASS_PRETTY_FUNCTION);
151 }
152 }
153
154 const std::type_info& Map::type() const
155 {
156 return pimpl_->type();
157 }
158 void* Map::raw(bool writable) const
159 {
160 return pimpl_->raw(writable);
161 }
162
163 Py_ssize_t Map::length( PyObject* self)
164 {
165 return static_cast<Map*>(self)->pimpl_->length();
166 }
167
168 PyObject* Map::subscript( PyObject* self, PyObject* key)
169 {
170 return static_cast<Map*>(self)->pimpl_->subscript(key);
171 }
172
173 int Map::assSubscript( PyObject* self, PyObject* key, PyObject* value)
174 {
175 return static_cast<Map*>(self)->pimpl_->assSubscript(key, value);
176 }
177}
178
179}
180
181}
#define PY_DECLARE_CLASS(i_cppClass)
Declare a Python class with automatic name and no documentation.
#define PY_CLASS_METHOD_NAME(i_cppClass, i_cppMethod, s_methodName)
Export a C++ method to Python with custom name (no documentation).
#define PY_CLASS_METHOD(i_cppClass, i_cppMethod)
Export a C++ method to Python using the C++ method name (no documentation).
void fetchAndThrowPythonException(std::string loc)
Fetch the current Python exception and throw it as a C++ PythonException.
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
lass::util::SharedPtr< T, PyObjectStorage, PyObjectCounter > fromNakedToSharedPtrCast(PyObject *object)
fromNakedToSharedPtrCast.
const lass::python::impl::IterSlot _iter_("__iter__", Py_tp_iter)
__iter__ method (iterator)
const lass::python::impl::UnarySlot _repr_("__repr__", Py_tp_repr)
__repr__ method (must always return a string)
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.
Definition config.h:53