/* Multimaps */ %include %fragment("StdMultimapTraits","header",fragment="StdSequenceTraits") { namespace swig { template inline void assign(const PySeq& pyseq, std::multimap *multimap) { typedef typename std::map::value_type value_type; typename PySeq::const_iterator it = pyseq.begin(); for (;it != pyseq.end(); ++it) { multimap->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { static int asptr(PyObject *obj, std::multimap **val) { if (PyDict_Check(obj)) { PyObject_var items = PyMapping_Items(obj); return traits_asptr_stdseq, std::pair > ::asptr(items, val); } if (val) { PyErr_SetString(PyExc_TypeError, "a dictionary is expected"); } return 0; } }; template struct traits_from > { typedef std::multimap multimap_type; typedef typename multimap_type::const_iterator const_iterator; typedef typename multimap_type::size_type size_type; static PyObject *from(const multimap_type& multimap) { size_type size = multimap.size(); int pysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "multimap size not valid in python"); return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= multimap.begin(); i!= multimap.end(); ++i) { PyDict_SetItem(obj, swig::from(i->first), swig::from(i->second)); } return obj; } }; } } #define %swig_multimap_methods(Type...) %swig_map_methods(Type) %include