PageRenderTime 43ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/Lib/std/_std_deque.i

#
Swig | 134 lines | 107 code | 10 blank | 17 comment | 0 complexity | c84b17d1fe54628857560067dea6b089 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
  1. /* -----------------------------------------------------------------------------
  2. * _std_deque.i
  3. *
  4. * This file contains a generic definition of std::deque along with
  5. * some helper functions. Specific language modules should include
  6. * this file to generate wrappers.
  7. * ----------------------------------------------------------------------------- */
  8. %include <std_except.i>
  9. %{
  10. #include <deque>
  11. #include <stdexcept>
  12. %}
  13. /* This macro defines all of the standard methods for a deque. This
  14. is defined as a macro to simplify the task of specialization. For
  15. example,
  16. template<> class deque<int> {
  17. public:
  18. %std_deque_methods(int);
  19. };
  20. */
  21. %define %std_deque_methods_noempty(T)
  22. typedef T &reference;
  23. typedef const T& const_reference;
  24. deque();
  25. deque(unsigned int size, const T& value=T());
  26. deque(const deque<T> &);
  27. ~deque();
  28. void assign(unsigned int n, const T& value);
  29. void swap(deque<T> &x);
  30. unsigned int size() const;
  31. unsigned int max_size() const;
  32. void resize(unsigned int n, T c = T());
  33. const_reference front();
  34. const_reference back();
  35. void push_front(const T& x);
  36. void push_back(const T& x);
  37. void pop_front();
  38. void pop_back();
  39. void clear();
  40. /* Some useful extensions */
  41. %extend {
  42. const_reference getitem(int i) throw (std::out_of_range) {
  43. int size = int(self->size());
  44. if (i<0) i += size;
  45. if (i>=0 && i<size)
  46. return (*self)[i];
  47. else
  48. throw std::out_of_range("deque index out of range");
  49. }
  50. void setitem(int i, const T& x) throw (std::out_of_range) {
  51. int size = int(self->size());
  52. if (i<0) i+= size;
  53. if (i>=0 && i<size)
  54. (*self)[i] = x;
  55. else
  56. throw std::out_of_range("deque index out of range");
  57. }
  58. void delitem(int i) throw (std::out_of_range) {
  59. int size = int(self->size());
  60. if (i<0) i+= size;
  61. if (i>=0 && i<size) {
  62. self->erase(self->begin()+i);
  63. } else {
  64. throw std::out_of_range("deque index out of range");
  65. }
  66. }
  67. std::deque<T> getslice(int i, int j) {
  68. int size = int(self->size());
  69. if (i<0) i = size+i;
  70. if (j<0) j = size+j;
  71. if (i<0) i = 0;
  72. if (j>size) j = size;
  73. std::deque<T > tmp(j-i);
  74. std::copy(self->begin()+i,self->begin()+j,tmp.begin());
  75. return tmp;
  76. }
  77. void setslice(int i, int j, const std::deque<T>& v) {
  78. int size = int(self->size());
  79. if (i<0) i = size+i;
  80. if (j<0) j = size+j;
  81. if (i<0) i = 0;
  82. if (j>size) j = size;
  83. if (int(v.size()) == j-i) {
  84. std::copy(v.begin(),v.end(),self->begin()+i);
  85. } else {
  86. self->erase(self->begin()+i,self->begin()+j);
  87. if (i+1 <= size)
  88. self->insert(self->begin()+i+1,v.begin(),v.end());
  89. else
  90. self->insert(self->end(),v.begin(),v.end());
  91. }
  92. }
  93. void delslice(int i, int j) {
  94. int size = int(self->size());
  95. if (i<0) i = size+i;
  96. if (j<0) j = size+j;
  97. if (i<0) i = 0;
  98. if (j>size) j = size;
  99. self->erase(self->begin()+i,self->begin()+j);
  100. }
  101. };
  102. %enddef
  103. #ifdef SWIGPHP
  104. %define %std_deque_methods(T)
  105. %extend {
  106. bool is_empty() const {
  107. return self->empty();
  108. }
  109. };
  110. %std_deque_methods_noempty(T)
  111. %enddef
  112. #else
  113. %define %std_deque_methods(T)
  114. bool empty() const;
  115. %std_deque_methods_noempty(T)
  116. %enddef
  117. #endif
  118. namespace std {
  119. template<class T> class deque {
  120. public:
  121. %std_deque_methods(T);
  122. };
  123. }