/* -----------------------------------------------------------------------------
 * std_vector.i
 *
 * SWIG typemaps for std::vector
 * ----------------------------------------------------------------------------- */

%include <std_common.i>

// ------------------------------------------------------------------------
// std::vector
// 
// The aim of all that follows would be to integrate std::vector with 
// Guile as much as possible, namely, to allow the user to pass and 
// be returned Guile vectors or 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 Guile 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 Guile vector of T:s 
//      is returned which is most easily used in other Guile 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 {
        %typemap(in) vector<T> {
            if (scm_is_vector($input)) {
                unsigned long size = scm_c_vector_length($input);
                $1 = std::vector<T >(size);
                for (unsigned long i=0; i<size; i++) {
                    SCM o = scm_vector_ref($input,scm_from_ulong(i));
                    (($1_type &)$1)[i] =
                        *((T*) SWIG_MustGetPtr(o,$descriptor(T *),$argnum, 0));
                }
            } else if (scm_is_null($input)) {
                $1 = std::vector<T >();
            } else if (scm_is_pair($input)) {
                SCM head, tail;
                $1 = std::vector<T >();
                tail = $input;
                while (!scm_is_null(tail)) {
                    head = SCM_CAR(tail);
                    tail = SCM_CDR(tail);
                    $1.push_back(*((T*)SWIG_MustGetPtr(head,
                                                       $descriptor(T *),
                                                       $argnum, 0)));
                }
            } else {
                $1 = *(($&1_type)
                       SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
            }
        }
        %typemap(in) const vector<T>& (std::vector<T> temp),
                     const vector<T>* (std::vector<T> temp) {
            if (scm_is_vector($input)) {
                unsigned long size = scm_c_vector_length($input);
                temp = std::vector<T >(size);
                $1 = &temp;
                for (unsigned long i=0; i<size; i++) {
                    SCM o = scm_vector_ref($input,scm_from_ulong(i));
                    temp[i] = *((T*) SWIG_MustGetPtr(o,
                                                     $descriptor(T *),
                                                     $argnum, 0));
                }
            } else if (scm_is_null($input)) {
                temp = std::vector<T >();
                $1 = &temp;
            } else if (scm_is_pair($input)) {
                temp = std::vector<T >();
                $1 = &temp;
                SCM head, tail;
                tail = $input;
                while (!scm_is_null(tail)) {
                    head = SCM_CAR(tail);
                    tail = SCM_CDR(tail);
                    temp.push_back(*((T*) SWIG_MustGetPtr(head,
                                                          $descriptor(T *),
                                                          $argnum, 0)));
                }
            } else {
                $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
            }
        }
        %typemap(out) vector<T> {
            $result = scm_make_vector(scm_from_long($1.size()),SCM_UNSPECIFIED);
            for (unsigned int i=0; i<$1.size(); i++) {
                T* x = new T((($1_type &)$1)[i]);
                scm_vector_set_x($result,scm_from_long(i),
                                SWIG_NewPointerObj(x, $descriptor(T *), 1));
            }
        }
        %typecheck(SWIG_TYPECHECK_VECTOR) vector<T> {
            /* native sequence? */
            if (scm_is_vector($input)) {
                unsigned int size = scm_c_vector_length($input);
                if (size == 0) {
                    /* an empty sequence can be of any type */
                    $1 = 1;
                } else {
                    /* check the first element only */
                    SCM o = scm_vector_ref($input,scm_from_ulong(0));
                    T* x;
                    if (SWIG_ConvertPtr(o,(void**) &x,
                                          $descriptor(T *), 0) != -1)
                        $1 = 1;
                    else
                        $1 = 0;
                }
            } else if (scm_is_null($input)) {
                /* again, an empty sequence can be of any type */
                $1 = 1;
            } else if (scm_is_pair($input)) {
                /* check the first element only */
                T* x;
                SCM head = SCM_CAR($input);
                if (SWIG_ConvertPtr(head,(void**) &x,
                                      $descriptor(T *), 0) != -1)
                    $1 = 1;
                else
                    $1 = 0;
            } else {
                /* wrapped vector? */
                std::vector<T >* v;
                if (SWIG_ConvertPtr($input,(void **) &v, 
                                      $&1_descriptor, 0) != -1)
                    $1 = 1;
                else
                    $1 = 0;
            }
        }
        %typecheck(SWIG_TYPECHECK_VECTOR) const vector<T>&,
                                          const vector<T>* {
            /* native sequence? */
            if (scm_is_vector($input)) {
                unsigned int size = scm_c_vector_length($input);
                if (size == 0) {
                    /* an empty sequence can be of any type */
                    $1 = 1;
                } else {
                    /* check the first element only */
                    T* x;
                    SCM o = scm_vector_ref($input,scm_from_ulong(0));
                    if (SWIG_ConvertPtr(o,(void**) &x,
                                          $descriptor(T *), 0) != -1)
                        $1 = 1;
                    else
                        $1 = 0;
                }
            } else if (scm_is_null($input)) {
                /* again, an empty sequence can be of any type */
                $1 = 1;
            } else if (scm_is_pair($input)) {
                /* check the first element only */
                T* x;
                SCM head = SCM_CAR($input);
                if (SWIG_ConvertPtr(head,(void**) &x,
                                      $descriptor(T *), 0) != -1)
                    $1 = 1;
                else
                    $1 = 0;
            } else {
                /* wrapped vector? */
                std::vector<T >* v;
                if (SWIG_ConvertPtr($input,(void **) &v, 
                                      $1_descriptor, 0) != -1)
                    $1 = 1;
                else
                    $1 = 0;
            }
        }
      public:
        vector(unsigned int size = 0);
        vector(unsigned int size, const T& value);
        vector(const vector<T>&);
        %rename(length) size;
        unsigned int size() const;
        %rename("empty?") empty;
        bool empty() const;
        %rename("clear!") clear;
        void clear();
        %rename("set!") set;
        %rename("pop!") pop;
        %rename("push!") push_back;
        void push_back(const T& x);
        %extend {
            T pop() throw (std::out_of_range) {
                if (self->size() == 0)
                    throw std::out_of_range("pop from empty vector");
                T x = self->back();
                self->pop_back();
                return x;
            }
            const T& ref(int i) throw (std::out_of_range) {
                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) throw (std::out_of_range) {
                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_stl_vector(T,CHECK,CONVERT_FROM,CONVERT_TO)
    template<> class vector<T> {
        %typemap(in) vector<T> {
            if (scm_is_vector($input)) {
                unsigned long size = scm_c_vector_length($input);
                $1 = std::vector<T >(size);
                for (unsigned long i=0; i<size; i++) {
                    SCM o = scm_vector_ref($input,scm_from_ulong(i));
                    if (CHECK(o))
                        (($1_type &)$1)[i] = (T)(CONVERT_FROM(o));
                    else
                        scm_wrong_type_arg(FUNC_NAME, $argnum, $input);
                }
            } else if (scm_is_null($input)) {
                $1 = std::vector<T >();
            } else if (scm_is_pair($input)) {
                SCM v = scm_vector($input);
                unsigned long size = scm_c_vector_length(v);
                $1 = std::vector<T >(size);
                for (unsigned long i=0; i<size; i++) {
                    SCM o = scm_vector_ref(v,scm_from_ulong(i));
                    if (CHECK(o))
                        (($1_type &)$1)[i] = (T)(CONVERT_FROM(o));
                    else
                        scm_wrong_type_arg(FUNC_NAME, $argnum, $input);
                }
            } else {
                $1 = *(($&1_type)
                       SWIG_MustGetPtr($input,$&1_descriptor,$argnum, 0));
            }
        }
        %typemap(in) const vector<T>& (std::vector<T> temp),
                     const vector<T>* (std::vector<T> temp) {
            if (scm_is_vector($input)) {
                unsigned long size = scm_c_vector_length($input);
                temp = std::vector<T >(size);
                $1 = &temp;
                for (unsigned long i=0; i<size; i++) {
                    SCM o = scm_vector_ref($input,scm_from_ulong(i));
                    if (CHECK(o))
                        temp[i] = (T)(CONVERT_FROM(o));
                    else
                        scm_wrong_type_arg(FUNC_NAME, $argnum, $input);
                }
            } else if (scm_is_null($input)) {
                temp = std::vector<T >();
                $1 = &temp;
            } else if (scm_is_pair($input)) {
                SCM v = scm_vector($input);
                unsigned long size = scm_c_vector_length(v);
                temp = std::vector<T >(size);
                $1 = &temp;
                for (unsigned long i=0; i<size; i++) {
                    SCM o = scm_vector_ref(v,scm_from_ulong(i));
                    if (CHECK(o))
                        temp[i] = (T)(CONVERT_FROM(o));
                    else
                        scm_wrong_type_arg(FUNC_NAME, $argnum, $input);
                }
            } else {
                $1 = ($1_ltype) SWIG_MustGetPtr($input,$1_descriptor,$argnum, 0);
            }
        }
        %typemap(out) vector<T> {
            $result = scm_make_vector(scm_from_long($1.size()),SCM_UNSPECIFIED);
            for (unsigned int i=0; i<$1.size(); i++) {
                SCM x = CONVERT_TO((($1_type &)$1)[i]);
                scm_vector_set_x($result,scm_from_long(i),x);
            }
        }
        %typecheck(SWIG_TYPECHECK_VECTOR) vector<T> {
            /* native sequence? */
            if (scm_is_vector($input)) {
                unsigned int size = scm_c_vector_length($input);
                if (size == 0) {
                    /* an empty sequence can be of any type */
                    $1 = 1;
                } else {
                    /* check the first element only */
                    T* x;
                    SCM o = scm_vector_ref($input,scm_from_ulong(0));
                    $1 = CHECK(o) ? 1 : 0;
                }
            } else if (scm_is_null($input)) {
                /* again, an empty sequence can be of any type */
                $1 = 1;
            } else if (scm_is_pair($input)) {
                /* check the first element only */
                T* x;
                SCM head = SCM_CAR($input);
                $1 = CHECK(head) ? 1 : 0;
            } else {
                /* wrapped vector? */
                std::vector<T >* v;
                $1 = (SWIG_ConvertPtr($input,(void **) &v, 
                                        $&1_descriptor, 0) != -1) ? 1 : 0;
            }
        }
        %typecheck(SWIG_TYPECHECK_VECTOR) const vector<T>&,
                                          const vector<T>* {
            /* native sequence? */
            if (scm_is_vector($input)) {
                unsigned int size = scm_c_vector_length($input);
                if (size == 0) {
                    /* an empty sequence can be of any type */
                    $1 = 1;
                } else {
                    /* check the first element only */
                    T* x;
                    SCM o = scm_vector_ref($input,scm_from_ulong(0));
                    $1 = CHECK(o) ? 1 : 0;
                }
            } else if (scm_is_null($input)) {
                /* again, an empty sequence can be of any type */
                $1 = 1;
            } else if (scm_is_pair($input)) {
                /* check the first element only */
                T* x;
                SCM head = SCM_CAR($input);
                $1 = CHECK(head) ? 1 : 0;
            } else {
                /* wrapped vector? */
                std::vector<T >* v;
                $1 = (SWIG_ConvertPtr($input,(void **) &v, 
                                        $1_descriptor, 0) != -1) ? 1 : 0;
            }
        }
      public:
        vector(unsigned int size = 0);
        vector(unsigned int size, const T& value);
        vector(const vector<T>&);
        %rename(length) size;
        unsigned int size() const;
        %rename("empty?") empty;
        bool empty() const;
        %rename("clear!") clear;
        void clear();
        %rename("set!") set;
        %rename("pop!") pop;
        %rename("push!") push_back;
        void push_back(T x);
        %extend {
            T pop() throw (std::out_of_range) {
                if (self->size() == 0)
                    throw std::out_of_range("pop from empty vector");
                T x = self->back();
                self->pop_back();
                return x;
            }
            T ref(int i) throw (std::out_of_range) {
                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) throw (std::out_of_range) {
                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_stl_vector(bool,scm_is_bool,scm_is_true,SWIG_bool2scm);
    specialize_stl_vector(char,scm_is_number,scm_to_long,scm_from_long);
    specialize_stl_vector(int,scm_is_number,scm_to_long,scm_from_long);
    specialize_stl_vector(long,scm_is_number,scm_to_long,scm_from_long);
    specialize_stl_vector(short,scm_is_number,scm_to_long,scm_from_long);
    specialize_stl_vector(unsigned char,scm_is_number,scm_to_ulong,scm_from_ulong);
    specialize_stl_vector(unsigned int,scm_is_number,scm_to_ulong,scm_from_ulong);
    specialize_stl_vector(unsigned long,scm_is_number,scm_to_ulong,scm_from_ulong);
    specialize_stl_vector(unsigned short,scm_is_number,scm_to_ulong,scm_from_ulong);
    specialize_stl_vector(float,scm_is_number,scm_to_double,scm_from_double);
    specialize_stl_vector(double,scm_is_number,scm_to_double,scm_from_double);
    specialize_stl_vector(std::string,scm_is_string,SWIG_scm2string,SWIG_string2scm);
}

