Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
5.0 KiB

  1. //
  2. // SWIG typemaps for std::map
  3. // Luigi Ballabio
  4. // Jan. 2003
  5. //
  6. // Common implementation
  7. %include <std_common.i>
  8. // ------------------------------------------------------------------------
  9. // std::map
  10. // ------------------------------------------------------------------------
  11. %{
  12. #include <map>
  13. #include <algorithm>
  14. #include <stdexcept>
  15. %}
  16. // exported class
  17. namespace std {
  18. template<class K, class T> class map {
  19. // add typemaps here
  20. public:
  21. map();
  22. map(const map<K,T> &);
  23. unsigned int size() const;
  24. bool empty() const;
  25. void clear();
  26. %extend {
  27. T& get(const K& key) throw (std::out_of_range) {
  28. std::map<K,T >::iterator i = self->find(key);
  29. if (i != self->end())
  30. return i->second;
  31. else
  32. throw std::out_of_range("key not found");
  33. }
  34. void set(const K& key, const T& x) {
  35. (*self)[key] = x;
  36. }
  37. void del(const K& key) throw (std::out_of_range) {
  38. std::map<K,T >::iterator i = self->find(key);
  39. if (i != self->end())
  40. self->erase(i);
  41. else
  42. throw std::out_of_range("key not found");
  43. }
  44. bool has_key(const K& key) {
  45. std::map<K,T >::iterator i = self->find(key);
  46. return i != self->end();
  47. }
  48. }
  49. };
  50. // specializations for built-ins
  51. %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO)
  52. template<class T> class map<K,T> {
  53. // add typemaps here
  54. public:
  55. map();
  56. map(const map<K,T> &);
  57. unsigned int size() const;
  58. bool empty() const;
  59. void clear();
  60. %extend {
  61. T& get(K key) throw (std::out_of_range) {
  62. std::map<K,T >::iterator i = self->find(key);
  63. if (i != self->end())
  64. return i->second;
  65. else
  66. throw std::out_of_range("key not found");
  67. }
  68. void set(K key, const T& x) {
  69. (*self)[key] = x;
  70. }
  71. void del(K key) throw (std::out_of_range) {
  72. std::map<K,T >::iterator i = self->find(key);
  73. if (i != self->end())
  74. self->erase(i);
  75. else
  76. throw std::out_of_range("key not found");
  77. }
  78. bool has_key(K key) {
  79. std::map<K,T >::iterator i = self->find(key);
  80. return i != self->end();
  81. }
  82. }
  83. };
  84. %enddef
  85. %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO)
  86. template<class K> class map<K,T> {
  87. // add typemaps here
  88. public:
  89. map();
  90. map(const map<K,T> &);
  91. unsigned int size() const;
  92. bool empty() const;
  93. void clear();
  94. %extend {
  95. T get(const K& key) throw (std::out_of_range) {
  96. std::map<K,T >::iterator i = self->find(key);
  97. if (i != self->end())
  98. return i->second;
  99. else
  100. throw std::out_of_range("key not found");
  101. }
  102. void set(const K& key, T x) {
  103. (*self)[key] = x;
  104. }
  105. void del(const K& key) throw (std::out_of_range) {
  106. std::map<K,T >::iterator i = self->find(key);
  107. if (i != self->end())
  108. self->erase(i);
  109. else
  110. throw std::out_of_range("key not found");
  111. }
  112. bool has_key(const K& key) {
  113. std::map<K,T >::iterator i = self->find(key);
  114. return i != self->end();
  115. }
  116. }
  117. };
  118. %enddef
  119. %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO,
  120. T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO)
  121. template<> class map<K,T> {
  122. // add typemaps here
  123. public:
  124. map();
  125. map(const map<K,T> &);
  126. unsigned int size() const;
  127. bool empty() const;
  128. void clear();
  129. %extend {
  130. T get(K key) throw (std::out_of_range) {
  131. std::map<K,T >::iterator i = self->find(key);
  132. if (i != self->end())
  133. return i->second;
  134. else
  135. throw std::out_of_range("key not found");
  136. }
  137. void set(K key, T x) {
  138. (*self)[key] = x;
  139. }
  140. void del(K key) throw (std::out_of_range) {
  141. std::map<K,T >::iterator i = self->find(key);
  142. if (i != self->end())
  143. self->erase(i);
  144. else
  145. throw std::out_of_range("key not found");
  146. }
  147. bool has_key(K key) {
  148. std::map<K,T >::iterator i = self->find(key);
  149. return i != self->end();
  150. }
  151. }
  152. };
  153. %enddef
  154. // add specializations here
  155. }