/tags/rel-1-3-25/SWIG/Lib/php4/std_vector.i
Swig | 158 lines | 141 code | 17 blank | 0 comment | 0 complexity | ae5c217a0b98f8ba23d2512d11ea7271 MD5 | raw file
Possible License(s): LGPL-2.1, Cube, GPL-3.0, 0BSD, GPL-2.0
- //
- // SWIG typemaps for std::vector types
- // Luigi Ballabio
- // May 7, 2002
- //
- // PHP implementation
- %include exception.i
- // containers
- // methods which can raise are caused to throw an IndexError
- %exception std::vector::get {
- try {
- $action
- } catch (std::out_of_range& e) {
- SWIG_exception(SWIG_IndexError,const_cast<char*>(e.what()));
- }
- }
- %exception std::vector::set {
- try {
- $action
- } catch (std::out_of_range& e) {
- SWIG_exception(SWIG_IndexError,const_cast<char*>(e.what()));
- }
- }
- %exception std::vector::pop {
- try {
- $action
- } catch (std::out_of_range& e) {
- SWIG_exception(SWIG_IndexError,const_cast<char*>(e.what()));
- }
- }
- // ------------------------------------------------------------------------
- // std::vector
- //
- // The aim of all that follows would be to integrate std::vector with
- // PHP as much as possible, namely, to allow the user to pass and
- // be returned PHP lists.
- // const declarations are used to guess the intent of the function being
- // exported; therefore, the following rationale is applied:
- //
- // -- f(std::vector<T>), f(const std::vector<T>&), f(const std::vector<T>*):
- // the parameter being read-only, either a PHP sequence or a
- // previously wrapped std::vector<T> can be passed.
- // -- f(std::vector<T>&), f(std::vector<T>*):
- // the parameter must be modified; therefore, only a wrapped std::vector
- // can be passed.
- // -- std::vector<T> f():
- // the vector is returned by copy; therefore, a PHP sequence of T:s
- // is returned which is most easily used in other PHP functions
- // -- std::vector<T>& f(), std::vector<T>* f(), const std::vector<T>& f(),
- // const std::vector<T>* f():
- // the vector is returned by reference; therefore, a wrapped std::vector
- // is returned
- // ------------------------------------------------------------------------
- %{
- #include <vector>
- #include <algorithm>
- #include <stdexcept>
- %}
- // exported class
- namespace std {
-
- template<class T> class vector {
- // add generic typemaps here
- public:
- vector(unsigned int size = 0);
- unsigned int size() const;
- bool empty() const;
- void clear();
- %rename(push) push_back;
- void push_back(const T& x);
- %extend {
- T pop() {
- if (self->size() == 0)
- throw std::out_of_range("pop from empty vector");
- T x = self->back();
- self->pop_back();
- return x;
- }
- T& get(int i) {
- int size = int(self->size());
- if (i>=0 && i<size)
- return (*self)[i];
- else
- throw std::out_of_range("vector index out of range");
- }
- void set(int i, const T& x) {
- int size = int(self->size());
- if (i>=0 && i<size)
- (*self)[i] = x;
- else
- throw std::out_of_range("vector index out of range");
- }
- }
- };
- // specializations for built-ins
- %define specialize_std_vector(T)
- template<> class vector<T> {
- // add specialized typemaps here
- public:
- vector(unsigned int size = 0);
- unsigned int size() const;
- bool empty() const;
- void clear();
- %rename(push) push_back;
- void push_back(T x);
- %extend {
- T pop() {
- if (self->size() == 0)
- throw std::out_of_range("pop from empty vector");
- T x = self->back();
- self->pop_back();
- return x;
- }
- T get(int i) {
- int size = int(self->size());
- if (i>=0 && i<size)
- return (*self)[i];
- else
- throw std::out_of_range("vector index out of range");
- }
- void set(int i, T x) {
- int size = int(self->size());
- if (i>=0 && i<size)
- (*self)[i] = x;
- else
- throw std::out_of_range("vector index out of range");
- }
- }
- };
- %enddef
- specialize_std_vector(bool);
- specialize_std_vector(char);
- specialize_std_vector(int);
- specialize_std_vector(short);
- specialize_std_vector(long);
- specialize_std_vector(unsigned char);
- specialize_std_vector(unsigned int);
- specialize_std_vector(unsigned short);
- specialize_std_vector(unsigned long);
- specialize_std_vector(float);
- specialize_std_vector(double);
- }