/* -----------------------------------------------------------------------------
 * std_string.i
 *
 * SWIG typemaps for std::string
 * ----------------------------------------------------------------------------- */

%{
#include <string>
%}

namespace std {

    %naturalvar string;

    class string;

    /* Overloading check */

    %typemap(typecheck) string = char *;
    %typemap(typecheck) const string & = char *;

    %typemap(in, pikedesc="tStr") string {
      if ($input.type != T_STRING)
        Pike_error("Bad argument: Expected a string.\n");
      $1.assign(STR0($input.u.string));
    }

    %typemap(in, pikedesc="tStr") const string & ($*1_ltype temp) {
      if ($input.type != T_STRING)
        Pike_error("Bad argument: Expected a string.\n");
      temp.assign(STR0($input.u.string));
      $1 = &temp;
    }

    %typemap(out, pikedesc="tStr") string "push_text($1.c_str());";

    %typemap(out, pikedesc="tStr") const string & "push_text($1->c_str());";
    
    %typemap(directorin) string, const string &, string & "$1.c_str()";

    %typemap(directorin) string *, const string * "$1->c_str()";
    
    %typemap(directorout) string {
      if ($input.type == T_STRING)
        $result.assign(STR0($input.u.string));
      else
        throw Swig::DirectorTypeMismatchException("string expected");
    }
    
    %typemap(directorout) const string & ($*1_ltype temp) {
      if ($input.type == T_STRING) {
        temp.assign(STR0($input.u.string));
        $result = &temp;
      } else {
        throw Swig::DirectorTypeMismatchException("string expected");
      }
    }

}

