PageRenderTime 84ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/rel-1-3-26/SWIG/Lib/python/std_map.i

#
Swig | 167 lines | 148 code | 16 blank | 3 comment | 0 complexity | b4510e8ab5f5732d0d4379a0d0070ecf MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
  1. /*
  2. Maps
  3. */
  4. %fragment("StdMapTraits","header",fragment="StdSequenceTraits")
  5. {
  6. namespace swig {
  7. template <class PySeq, class K, class T >
  8. inline void
  9. assign(const PySeq& pyseq, std::map<K,T > *map) {
  10. typedef typename std::map<K,T>::value_type value_type;
  11. typename PySeq::const_iterator it = pyseq.begin();
  12. for (;it != pyseq.end(); ++it) {
  13. map->insert(value_type(it->first, it->second));
  14. }
  15. }
  16. template <class K, class T>
  17. struct traits_asptr<std::map<K,T> > {
  18. typedef std::map<K,T> map_type;
  19. static int asptr(PyObject *obj, map_type **val) {
  20. if (PyDict_Check(obj)) {
  21. PyObject_var items = PyMapping_Items(obj);
  22. return traits_asptr_stdseq<std::map<K,T>, std::pair<K, T> >
  23. ::asptr(items, val);
  24. }
  25. if (val) {
  26. PyErr_SetString(PyExc_TypeError, "a dictionary is expected");
  27. }
  28. return 0;
  29. }
  30. };
  31. template <class K, class T >
  32. struct traits_from<std::map<K,T> > {
  33. typedef std::map<K,T> map_type;
  34. typedef typename map_type::const_iterator const_iterator;
  35. typedef typename map_type::size_type size_type;
  36. static PyObject *from(const map_type& map) {
  37. size_type size = map.size();
  38. int pysize = (size <= (size_type) INT_MAX) ? (int) size : -1;
  39. if (pysize < 0) {
  40. PyErr_SetString(PyExc_OverflowError,
  41. "map size not valid in python");
  42. return NULL;
  43. }
  44. PyObject *obj = PyDict_New();
  45. for (const_iterator i= map.begin(); i!= map.end(); ++i) {
  46. PyDict_SetItem(obj,
  47. swig::from(i->first),
  48. swig::from(i->second));
  49. }
  50. return obj;
  51. }
  52. };
  53. }
  54. }
  55. %define %swig_map_methods(Map...)
  56. %swig_container_methods(Map)
  57. %extend {
  58. mapped_type __getitem__(const key_type& key) const throw (std::out_of_range) {
  59. Map::const_iterator i = self->find(key);
  60. if (i != self->end())
  61. return i->second;
  62. else
  63. throw std::out_of_range("key not found");
  64. }
  65. void __setitem__(const key_type& key, const mapped_type& x) throw (std::out_of_range) {
  66. self->insert(Map::value_type(key,x));
  67. }
  68. void __delitem__(const key_type& key) throw (std::out_of_range) {
  69. Map::iterator i = self->find(key);
  70. if (i != self->end())
  71. self->erase(i);
  72. else
  73. throw std::out_of_range("key not found");
  74. }
  75. bool has_key(const key_type& key) const {
  76. Map::const_iterator i = self->find(key);
  77. return i != self->end();
  78. }
  79. PyObject* keys() {
  80. Map::size_type size = self->size();
  81. int pysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1;
  82. if (pysize < 0) {
  83. PyErr_SetString(PyExc_OverflowError,
  84. "map size not valid in python");
  85. return NULL;
  86. }
  87. PyObject* keyList = PyList_New(pysize);
  88. Map::const_iterator i = self->begin();
  89. for (int j = 0; j < pysize; ++i, ++j) {
  90. PyList_SetItem(keyList, j, swig::from(i->first));
  91. }
  92. return keyList;
  93. }
  94. PyObject* values() {
  95. Map::size_type size = self->size();
  96. int pysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1;
  97. if (pysize < 0) {
  98. PyErr_SetString(PyExc_OverflowError,
  99. "map size not valid in python");
  100. return NULL;
  101. }
  102. PyObject* valList = PyTuple_New(pysize);
  103. Map::const_iterator i = self->begin();
  104. for (int j = 0; j < pysize; ++i, ++j) {
  105. PyTuple_SetItem(valList, j, swig::from(i->second));
  106. }
  107. return valList;
  108. }
  109. PyObject* items() {
  110. Map::size_type size = self->size();
  111. int pysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1;
  112. if (pysize < 0) {
  113. PyErr_SetString(PyExc_OverflowError,
  114. "map size not valid in python");
  115. return NULL;
  116. }
  117. PyObject* itemList = PyTuple_New(pysize);
  118. Map::const_iterator i = self->begin();
  119. for (int j = 0; j < pysize; ++i, ++j) {
  120. PyTuple_SetItem(itemList, j, swig::from(*i));
  121. }
  122. return itemList;
  123. }
  124. // Python 2.2 methods
  125. bool __contains__(const key_type& key) {
  126. return self->find(key) != self->end();
  127. }
  128. PyObject* __iter__() {
  129. Map::size_type size = self->size();
  130. int pysize = (size <= (Map::size_type) INT_MAX) ? (int) size : -1;
  131. if (pysize < 0) {
  132. PyErr_SetString(PyExc_OverflowError,
  133. "map size not valid in python");
  134. return NULL;
  135. }
  136. PyObject* keyTuple = PyTuple_New(pysize);
  137. Map::const_iterator i = self->begin();
  138. for (int j = 0; j < pysize; ++i, ++j) {
  139. PyTuple_SetItem(keyTuple, j, swig::from(i->first));
  140. }
  141. %#if PY_VERSION_HEX >= 0x02020000
  142. PyObject* iter = PyObject_GetIter(keyTuple);
  143. Py_DECREF(keyTuple);
  144. return iter;
  145. %#else
  146. return keyTuple;
  147. %#endif
  148. }
  149. }
  150. %enddef
  151. %include <std/std_map.i>