[prev in list] [next in list] [prev in thread] [next in thread]
List: python-cpp-sig
Subject: Re: [C++-sig] Problem with map_indexing_suite
From: Damien Dupuis <damien.dupuis () lip6 ! fr>
Date: 2010-07-12 13:04:24
Message-ID: 0BDF9E55-4B47-460B-8841-6A13FCD1A3E3 () lip6 ! fr
[Download RAW message or body]
[Attachment #2 (multipart/alternative)]
Since I didn't find any solution when using map_indexing_suite, I wrote a simple \
wrapping that works in my case :
==============
#include <map>
#include <boost/python.hpp>
namespace myProject {
template<class Key, class Val>
struct map_item {
typedef std::map<Key,Val> Map;
static Val get(Map & self, const Key idx) {
if (self.find(idx) == self.end()) {
PyErr_SetString(PyExc_KeyError,"Map key not found");
throw_error_already_set();
}
return self[idx];
}
static void set(Map& self, const Key idx, const Val val) { self[idx]=val; }
static void del(Map& self, const Key n) { self.erase(n); }
static bool in (Map const& self, const Key n) { return self.find(n) != \
self.end(); }
static list keys(Map const& self) {
list t;
for(typename Map::const_iterator it = self.begin() ; it!=self.end() ; ++it)
t.append(it->first);
return t;
}
static list values(Map const& self) {
list t;
for(typename Map::const_iterator it=self.begin(); it!=self.end(); ++it)
t.append(it->second);
return t;
}
static list items(Map const& self) {
list t;
for(typename Map::const_iterator it=self.begin(); it!=self.end(); ++it)
t.append( make_tuple(it->first, it->second) );
return t;
}
};
#define STL_MAP_WRAPPING_PTR(KEY_TYPE, VALUE_TYPE, PYTHON_TYPE_NAME) \
class_<std::pair<const KEY_TYPE, VALUE_TYPE> \
>((std::string(PYTHON_TYPE_NAME)+std::string("DATA")).c_str()) \
.def_readonly ("key" , &std::pair<const KEY_TYPE, VALUE_TYPE>::first ) \
.def_readwrite("value", &std::pair<const KEY_TYPE, VALUE_TYPE>::second) \
; \
class_<std::map<KEY_TYPE, VALUE_TYPE> >(PYTHON_TYPE_NAME) \
.def("__len__" , &std::map<KEY_TYPE, VALUE_TYPE>::size) \
.def("__iter__" , boost::python::iterator<std::map<KEY_TYPE, VALUE_TYPE>, \
return_internal_reference<> >()) \
.def("__getitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().get, \
return_internal_reference<>()) \
.def("__setitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().set ) \
.def("__delitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().del ) \
.def("__contains__", &map_item<KEY_TYPE, VALUE_TYPE>().in ) \
.def("clear" , &std::map<KEY_TYPE, VALUE_TYPE>::clear ) \
.def("has_key" , &map_item<KEY_TYPE, VALUE_TYPE>().in ) \
.def("keys" , &map_item<KEY_TYPE, VALUE_TYPE>().keys ) \
.def("values" , &map_item<KEY_TYPE, VALUE_TYPE>().values) \
.def("items" , &map_item<KEY_TYPE, VALUE_TYPE>().items ) \
;
#define STL_MAP_WRAPPING(KEY_TYPE, VALUE_TYPE, PYTHON_TYPE_NAME) \
class_<std::pair<const KEY_TYPE, VALUE_TYPE> \
>((std::string(PYTHON_TYPE_NAME)+std::string("DATA")).c_str()) \
.def_readonly ("key" , &std::pair<const KEY_TYPE, VALUE_TYPE>::first ) \
.def_readwrite("value", &std::pair<const KEY_TYPE, VALUE_TYPE>::second) \
; \
class_<std::map<KEY_TYPE, VALUE_TYPE> >(PYTHON_TYPE_NAME) \
.def("__len__" , &std::map<KEY_TYPE, VALUE_TYPE>::size) \
.def("__iter__" , boost::python::iterator<std::map<KEY_TYPE, VALUE_TYPE>, \
return_internal_reference<> >()) \
.def("__getitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().get ) \
.def("__setitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().set ) \
.def("__delitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().del ) \
.def("__contains__", &map_item<KEY_TYPE, VALUE_TYPE>().in ) \
.def("clear" , &std::map<KEY_TYPE, VALUE_TYPE>::clear ) \
.def("has_key" , &map_item<KEY_TYPE, VALUE_TYPE>().in ) \
.def("keys" , &map_item<KEY_TYPE, VALUE_TYPE>().keys ) \
.def("values" , &map_item<KEY_TYPE, VALUE_TYPE>().values) \
.def("items" , &map_item<KEY_TYPE, VALUE_TYPE>().items ) \
;
} // namespace
=================
Simply use STL_MAP_WRAPPING_PTR(KeyClass, ClassA*, "ClassAMap") to bind a \
map<KeyClass, ClassA*> or STL_MAP_WRAPPING(KeyClass, ClassB, "ClassBMap") to bind a \
map<KeyClass, ClassB>
This code works in my case, fell free to correct or complete any error / missing.
-------------------------------
Damien Dupuis
Le 12 juil. 2010 à 09:13, Pentix a écrit :
>
> Hi, Damien!
>
> I've got exactly the same problem... Have you got any achievements?
>
>
>
> Damien Dupuis wrote:
> >
> > error: no match for call to ‘(const
> > boost::python::detail::specify_a_return_value_policy_to_wrap_functions_returning<X*>)
> > (X*)‘
> >
>
> --
> View this message in context: \
> http://old.nabble.com/Problem-with-map_indexing_suite-tp28925347p29135982.html Sent \
> from the Python - c++-sig mailing list archive at Nabble.com.
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig@python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig
>
[Attachment #5 (unknown)]
<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; \
-webkit-line-break: after-white-space; ">Since I didn't find any solution when using \
map_indexing_suite, I wrote a simple wrapping that works in my case \
:<div><br></div><div>==============</div><div><div><font class="Apple-style-span" \
face="Courier">#include <map></font></div><div><font class="Apple-style-span" \
face="Courier">#include <boost/python.hpp></font></div><div><font \
class="Apple-style-span" face="Courier"><br></font></div><div><font \
class="Apple-style-span" face="Courier">namespace myProject {</font></div><div><font \
class="Apple-style-span" face="Courier">template<class Key, class \
Val></font></div><div><font class="Apple-style-span" face="Courier">struct \
map_item {</font></div><div><font class="Apple-style-span" \
face="Courier"> typedef std::map<Key,Val> \
Map;</font></div><div><font class="Apple-style-span" \
face="Courier"><br></font></div><div><font class="Apple-style-span" \
face="Courier"> static Val get(Map & self, const Key idx) \
{</font></div><div><font class="Apple-style-span" face="Courier"> \
if (self.find(idx) == self.end()) {</font></div><div><font \
class="Apple-style-span" face="Courier"> \
PyErr_SetString(PyExc_KeyError,"Map key not found");</font></div><div><font \
class="Apple-style-span" face="Courier"> \
throw_error_already_set();</font></div><div><font class="Apple-style-span" \
face="Courier"> }</font></div><div><font \
class="Apple-style-span" face="Courier"> return \
self[idx];</font></div><div><font class="Apple-style-span" \
face="Courier"> }</font></div><div><font class="Apple-style-span" \
face="Courier"><br></font></div><div><font class="Apple-style-span" \
face="Courier"> static void set(Map& self, const Key idx, const \
Val val) { self[idx]=val; }</font></div><div><font class="Apple-style-span" \
face="Courier"> static void del(Map& self, const Key n) \
{ self.erase(n); \
}</font></div><div><font class="Apple-style-span" face="Courier"> \
static bool in (Map const& self, const Key n) \
{ return self.find(n) != self.end(); }</font></div><div><font \
class="Apple-style-span" face="Courier"><br></font></div><div><font \
class="Apple-style-span" face="Courier"> static list keys(Map \
const& self) {</font></div><div><font class="Apple-style-span" \
face="Courier"> list t;</font></div><div><font \
class="Apple-style-span" face="Courier"> for(typename \
Map::const_iterator it = self.begin() ; it!=self.end() ; ++it)</font></div><div><font \
class="Apple-style-span" face="Courier"> \
t.append(it->first);</font></div><div><font class="Apple-style-span" \
face="Courier"> return t;</font></div><div><font \
class="Apple-style-span" face="Courier"> }</font></div><div><font \
class="Apple-style-span" face="Courier"><br></font></div><div><font \
class="Apple-style-span" face="Courier"> static list values(Map \
const& self) {</font></div><div><font class="Apple-style-span" \
face="Courier"> list t;</font></div><div><font \
class="Apple-style-span" face="Courier"> for(typename \
Map::const_iterator it=self.begin(); it!=self.end(); ++it)</font></div><div><font \
class="Apple-style-span" face="Courier"> \
t.append(it->second);</font></div><div><font class="Apple-style-span" \
face="Courier"> return t;</font></div><div><font \
class="Apple-style-span" face="Courier"> }</font></div><div><font \
class="Apple-style-span" face="Courier"><br></font></div><div><font \
class="Apple-style-span" face="Courier"> static list items(Map \
const& self) {</font></div><div><font class="Apple-style-span" \
face="Courier"> list t;</font></div><div><font \
class="Apple-style-span" face="Courier"> for(typename \
Map::const_iterator it=self.begin(); it!=self.end(); ++it)</font></div><div><font \
class="Apple-style-span" face="Courier"> \
t.append( make_tuple(it->first, it->second) );</font></div><div><font \
class="Apple-style-span" face="Courier"> return \
t;</font></div><div><font class="Apple-style-span" face="Courier"> \
}</font></div><div><font class="Apple-style-span" \
face="Courier">};</font></div><div><font class="Apple-style-span" \
face="Courier"><br></font></div><div><font class="Apple-style-span" \
face="Courier">#define STL_MAP_WRAPPING_PTR(KEY_TYPE, VALUE_TYPE, PYTHON_TYPE_NAME) \
\</font></div><div><font \
class="Apple-style-span" face="Courier"> \
class_<std::pair<const KEY_TYPE, VALUE_TYPE> \
>((std::string(PYTHON_TYPE_NAME)+std::string("DATA")).c_str()) \
\</font></div><div><font class="Apple-style-span" face="Courier"> \
.def_readonly ("key" , &std::pair<const KEY_TYPE, \
VALUE_TYPE>::first ) \</font></div><div><font class="Apple-style-span" \
face="Courier"> .def_readwrite("value", \
&std::pair<const KEY_TYPE, VALUE_TYPE>::second) \</font></div><div><font \
class="Apple-style-span" face="Courier"> ; \
\
\
\
\</font></div><div><font class="Apple-style-span" face="Courier"> \
class_<std::map<KEY_TYPE, VALUE_TYPE> >(PYTHON_TYPE_NAME) \
\</font></div><div><font \
class="Apple-style-span" face="Courier"> \
.def("__len__" , &std::map<KEY_TYPE, VALUE_TYPE>::size) \
\</font></div><div><font \
class="Apple-style-span" face="Courier"> \
.def("__iter__" , boost::python::iterator<std::map<KEY_TYPE, \
VALUE_TYPE>, return_internal_reference<> >()) \</font></div><div><font \
class="Apple-style-span" face="Courier"> \
.def("__getitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().get, \
return_internal_reference<>()) \</font></div><div><font \
class="Apple-style-span" face="Courier"> \
.def("__setitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().set ) \
\</font></div><div><font class="Apple-style-span" \
face="Courier"> .def("__delitem__" , \
&map_item<KEY_TYPE, VALUE_TYPE>().del ) \
\</font></div><div><font class="Apple-style-span" face="Courier"> \
.def("__contains__", &map_item<KEY_TYPE, VALUE_TYPE>().in \
) \</font></div><div><font \
class="Apple-style-span" face="Courier"> .def("clear" \
, &std::map<KEY_TYPE, VALUE_TYPE>::clear ) \
\</font></div><div><font class="Apple-style-span" \
face="Courier"> .def("has_key" , \
&map_item<KEY_TYPE, VALUE_TYPE>().in ) \
\</font></div><div><font class="Apple-style-span" face="Courier"> \
.def("keys" , \
&map_item<KEY_TYPE, VALUE_TYPE>().keys ) \
\</font></div><div><font class="Apple-style-span" face="Courier"> \
.def("values" , &map_item<KEY_TYPE, \
VALUE_TYPE>().values) \</font></div><div><font \
class="Apple-style-span" face="Courier"> .def("items" \
, &map_item<KEY_TYPE, VALUE_TYPE>().items ) \
\</font></div><div><font class="Apple-style-span" \
face="Courier"> ;</font></div><div><font class="Apple-style-span" \
face="Courier"><br></font></div><div><font class="Apple-style-span" \
face="Courier">#define STL_MAP_WRAPPING(KEY_TYPE, VALUE_TYPE, PYTHON_TYPE_NAME) \
\</font></div><div><font \
class="Apple-style-span" face="Courier"> \
class_<std::pair<const KEY_TYPE, VALUE_TYPE> \
>((std::string(PYTHON_TYPE_NAME)+std::string("DATA")).c_str()) \
\</font></div><div><font class="Apple-style-span" face="Courier"> \
.def_readonly ("key" , &std::pair<const KEY_TYPE, \
VALUE_TYPE>::first ) \</font></div><div><font class="Apple-style-span" \
face="Courier"> .def_readwrite("value", \
&std::pair<const KEY_TYPE, VALUE_TYPE>::second) \</font></div><div><font \
class="Apple-style-span" face="Courier"> ; \
\
\
\
\</font></div><div><font class="Apple-style-span" face="Courier"> \
class_<std::map<KEY_TYPE, VALUE_TYPE> >(PYTHON_TYPE_NAME) \
\</font></div><div><font \
class="Apple-style-span" face="Courier"> \
.def("__len__" , &std::map<KEY_TYPE, VALUE_TYPE>::size) \
\</font></div><div><font \
class="Apple-style-span" face="Courier"> \
.def("__iter__" , boost::python::iterator<std::map<KEY_TYPE, \
VALUE_TYPE>, return_internal_reference<> >()) \</font></div><div><font \
class="Apple-style-span" face="Courier"> \
.def("__getitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().get ) \
\</font></div><div><font class="Apple-style-span" \
face="Courier"> .def("__setitem__" , \
&map_item<KEY_TYPE, VALUE_TYPE>().set ) \
\</font></div><div><font class="Apple-style-span" face="Courier"> \
.def("__delitem__" , &map_item<KEY_TYPE, VALUE_TYPE>().del \
) \</font></div><div><font \
class="Apple-style-span" face="Courier"> \
.def("__contains__", &map_item<KEY_TYPE, VALUE_TYPE>().in \
) \</font></div><div><font class="Apple-style-span" \
face="Courier"> .def("clear" , \
&std::map<KEY_TYPE, VALUE_TYPE>::clear ) \
\</font></div><div><font class="Apple-style-span" face="Courier"> \
.def("has_key" , &map_item<KEY_TYPE, \
VALUE_TYPE>().in ) \
\</font></div><div><font class="Apple-style-span" face="Courier"> \
.def("keys" , &map_item<KEY_TYPE, \
VALUE_TYPE>().keys ) \</font></div><div><font \
class="Apple-style-span" face="Courier"> \
.def("values" , &map_item<KEY_TYPE, \
VALUE_TYPE>().values) \</font></div><div><font \
class="Apple-style-span" face="Courier"> .def("items" \
, &map_item<KEY_TYPE, VALUE_TYPE>().items ) \
\</font></div><div><font class="Apple-style-span" \
face="Courier"> ;</font></div><div><font class="Apple-style-span" \
face="Courier"><br></font></div><div><font class="Apple-style-span" face="Courier">} \
// namespace</font></div><div>=================</div><div><br></div><div><br></div><div><br></div><div>Simply \
use STL_MAP_WRAPPING_PTR(KeyClass, ClassA*, "ClassAMap") to bind a \
map<KeyClass, ClassA*></div><div>or STL_MAP_WRAPPING(KeyClass, ClassB, \
"ClassBMap") to bind a map<KeyClass, ClassB></div><div><br></div><div>This code \
works in my case, fell free to correct or complete any error / \
missing.</div><div><br></div><div><div>-------------------------------</div><div>Damien \
Dupuis</div></div><div><br></div><div><div><div>Le 12 juil. 2010 à 09:13, Pentix a \
écrit :</div><br class="Apple-interchange-newline"><blockquote \
type="cite"><div><br>Hi, Damien!<br><br>I've got exactly the same problem... Have you \
got any achievements?<br><br><br><br>Damien Dupuis wrote:<br><blockquote \
type="cite"><br></blockquote><blockquote type="cite">error: no match for call to \
‘(const<br></blockquote><blockquote \
type="cite">boost::python::detail::specify_a_return_value_policy_to_wrap_functions_returning<X*>)<br></blockquote><blockquote \
type="cite">(X*)‘<br></blockquote><blockquote type="cite"><br></blockquote><br>-- \
<br>View this message in context: <a \
href="http://old.nabble.com/Problem-with-map_indexing_suite-tp28925347p29135982.html"> \
http://old.nabble.com/Problem-with-map_indexing_suite-tp28925347p29135982.html</a><br>Sent \
from the Python - c++-sig mailing list archive at <a \
href="http://Nabble.com">Nabble.com</a>.<br><br>_______________________________________________<br>Cplusplus-sig \
mailing list<br><a href="mailto:Cplusplus-sig@python.org">Cplusplus-sig@python.org</a> \
<br>http://mail.python.org/mailman/listinfo/cplusplus-sig<br><br></div></blockquote></div><br><div>
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: \
after-white-space; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; \
-webkit-line-break: after-white-space; \
"><div><br></div><div><br></div><div><br></div></div><br \
class="Apple-interchange-newline"></div><br class="Apple-interchange-newline"><br \
class="Apple-interchange-newline"> </div>
<br></div></div></body></html>
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic