|
78 | 78 | typedef std::unordered_map<K,T> unordered_map_type;
|
79 | 79 | static int asptr(PyObject *obj, unordered_map_type **val) {
|
80 | 80 | int res = SWIG_ERROR;
|
| 81 | + SWIG_PYTHON_THREAD_BEGIN_BLOCK; |
81 | 82 | if (PyDict_Check(obj)) {
|
82 | 83 | SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL);
|
83 | 84 | %#if PY_VERSION_HEX >= 0x03000000
|
84 |
| - /* In Python 3.x the ".items()" method return a dict_items object */ |
85 |
| - items = PySequence_Fast(items, ".items() haven't returned a sequence!"); |
| 85 | + /* In Python 3.x the ".items()" method returns a dict_items object */ |
| 86 | + items = PySequence_Fast(items, ".items() didn't return a sequence!"); |
86 | 87 | %#endif
|
87 | 88 | res = traits_asptr_stdseq<std::unordered_map<K,T>, std::pair<K, T> >::asptr(items, val);
|
88 | 89 | } else {
|
|
91 | 92 | res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
|
92 | 93 | if (SWIG_IsOK(res) && val) *val = p;
|
93 | 94 | }
|
| 95 | + SWIG_PYTHON_THREAD_END_BLOCK; |
94 | 96 | return res;
|
95 | 97 | }
|
96 | 98 | };
|
|
100 | 102 | typedef std::unordered_map<K,T> unordered_map_type;
|
101 | 103 | typedef typename unordered_map_type::const_iterator const_iterator;
|
102 | 104 | typedef typename unordered_map_type::size_type size_type;
|
103 |
| - |
104 |
| - static PyObject *from(const unordered_map_type& unordered_map) { |
| 105 | + |
| 106 | + static PyObject *asdict(const unordered_map_type& map) { |
| 107 | + SWIG_PYTHON_THREAD_BEGIN_BLOCK; |
| 108 | + size_type size = map.size(); |
| 109 | + Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; |
| 110 | + if (pysize < 0) { |
| 111 | + PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); |
| 112 | + SWIG_PYTHON_THREAD_END_BLOCK; |
| 113 | + return NULL; |
| 114 | + } |
| 115 | + PyObject *obj = PyDict_New(); |
| 116 | + for (const_iterator i= map.begin(); i!= map.end(); ++i) { |
| 117 | + swig::SwigVar_PyObject key = swig::from(i->first); |
| 118 | + swig::SwigVar_PyObject val = swig::from(i->second); |
| 119 | + PyDict_SetItem(obj, key, val); |
| 120 | + } |
| 121 | + SWIG_PYTHON_THREAD_END_BLOCK; |
| 122 | + return obj; |
| 123 | + } |
| 124 | + |
| 125 | + static PyObject *from(const unordered_map_type& map) { |
105 | 126 | swig_type_info *desc = swig::type_info<unordered_map_type>();
|
106 | 127 | if (desc && desc->clientdata) {
|
107 |
| - return SWIG_InternalNewPointerObj(new unordered_map_type(unordered_map), desc, SWIG_POINTER_OWN); |
| 128 | + return SWIG_InternalNewPointerObj(new unordered_map_type(map), desc, SWIG_POINTER_OWN); |
108 | 129 | } else {
|
109 |
| - size_type size = unordered_map.size(); |
110 |
| - Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; |
111 |
| - if (pysize < 0) { |
112 |
| - SWIG_PYTHON_THREAD_BEGIN_BLOCK; |
113 |
| - PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python"); |
114 |
| - SWIG_PYTHON_THREAD_END_BLOCK; |
115 |
| - return NULL; |
116 |
| - } |
117 |
| - PyObject *obj = PyDict_New(); |
118 |
| - for (const_iterator i= unordered_map.begin(); i!= unordered_map.end(); ++i) { |
119 |
| - swig::SwigVar_PyObject key = swig::from(i->first); |
120 |
| - swig::SwigVar_PyObject val = swig::from(i->second); |
121 |
| - PyDict_SetItem(obj, key, val); |
122 |
| - } |
123 |
| - return obj; |
| 130 | + return asdict(map); |
124 | 131 | }
|
125 | 132 | }
|
126 | 133 | };
|
|
136 | 143 | #endif
|
137 | 144 |
|
138 | 145 | %extend {
|
139 |
| - mapped_type __getitem__(const key_type& key) const throw (std::out_of_range) { |
| 146 | + mapped_type const & __getitem__(const key_type& key) throw (std::out_of_range) { |
140 | 147 | Map::const_iterator i = self->find(key);
|
141 | 148 | if (i != self->end())
|
142 | 149 | return i->second;
|
143 | 150 | else
|
144 | 151 | throw std::out_of_range("key not found");
|
145 | 152 | }
|
146 |
| - |
| 153 | + |
147 | 154 | void __delitem__(const key_type& key) throw (std::out_of_range) {
|
148 | 155 | Map::iterator i = self->find(key);
|
149 | 156 | if (i != self->end())
|
|
160 | 167 | PyObject* keys() {
|
161 | 168 | Map::size_type size = self->size();
|
162 | 169 | Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
|
| 170 | + SWIG_PYTHON_THREAD_BEGIN_BLOCK; |
163 | 171 | if (pysize < 0) {
|
164 |
| - SWIG_PYTHON_THREAD_BEGIN_BLOCK; |
165 | 172 | PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python");
|
166 | 173 | SWIG_PYTHON_THREAD_END_BLOCK;
|
167 | 174 | return NULL;
|
|
171 | 178 | for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
|
172 | 179 | PyList_SET_ITEM(keyList, j, swig::from(i->first));
|
173 | 180 | }
|
| 181 | + SWIG_PYTHON_THREAD_END_BLOCK; |
174 | 182 | return keyList;
|
175 | 183 | }
|
176 | 184 |
|
177 | 185 | PyObject* values() {
|
178 | 186 | Map::size_type size = self->size();
|
179 | 187 | Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
|
| 188 | + SWIG_PYTHON_THREAD_BEGIN_BLOCK; |
180 | 189 | if (pysize < 0) {
|
181 |
| - SWIG_PYTHON_THREAD_BEGIN_BLOCK; |
182 | 190 | PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python");
|
183 | 191 | SWIG_PYTHON_THREAD_END_BLOCK;
|
184 | 192 | return NULL;
|
|
188 | 196 | for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
|
189 | 197 | PyList_SET_ITEM(valList, j, swig::from(i->second));
|
190 | 198 | }
|
| 199 | + SWIG_PYTHON_THREAD_END_BLOCK; |
191 | 200 | return valList;
|
192 | 201 | }
|
193 | 202 |
|
194 | 203 | PyObject* items() {
|
195 | 204 | Map::size_type size = self->size();
|
196 | 205 | Py_ssize_t pysize = (size <= (Map::size_type) INT_MAX) ? (Py_ssize_t) size : -1;
|
| 206 | + SWIG_PYTHON_THREAD_BEGIN_BLOCK; |
197 | 207 | if (pysize < 0) {
|
198 |
| - SWIG_PYTHON_THREAD_BEGIN_BLOCK; |
199 | 208 | PyErr_SetString(PyExc_OverflowError, "unordered_map size not valid in python");
|
200 | 209 | SWIG_PYTHON_THREAD_END_BLOCK;
|
201 | 210 | return NULL;
|
|
205 | 214 | for (Py_ssize_t j = 0; j < pysize; ++i, ++j) {
|
206 | 215 | PyList_SET_ITEM(itemList, j, swig::from(*i));
|
207 | 216 | }
|
| 217 | + SWIG_PYTHON_THREAD_END_BLOCK; |
208 | 218 | return itemList;
|
209 | 219 | }
|
210 | 220 |
|
|
249 | 259 | void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) {
|
250 | 260 | (*self)[key] = x;
|
251 | 261 | }
|
| 262 | + |
| 263 | + PyObject* asdict() { |
| 264 | + return swig::traits_from< Map >::asdict(*self); |
| 265 | + } |
252 | 266 | }
|
| 267 | + |
| 268 | + |
253 | 269 | %enddef
|
254 | 270 |
|
255 | 271 |
|
|
0 commit comments