| /* ----------------------------------------------------------------------------- |
| * std_string.i |
| * |
| * SWIG typemaps for std::string |
| * ----------------------------------------------------------------------------- */ |
| |
| // ------------------------------------------------------------------------ |
| // std::string is typemapped by value |
| // This can prevent exporting methods which return a string |
| // in order for the user to modify it. |
| // However, I think I'll wait until someone asks for it... |
| // ------------------------------------------------------------------------ |
| |
| // %include <exception.i> |
| %warnfilter(404) std::string; |
| %warnfilter(404) std::wstring; |
| |
| %{ |
| #include <string> |
| %} |
| |
| // %include <std_vector.i> |
| |
| // %naturalvar std::string; |
| // %naturalvar std::wstring; |
| |
| namespace std { |
| typedef unsigned long size_t; |
| typedef signed long ptrdiff_t; |
| |
| template <class charT> class basic_string { |
| public: |
| typedef charT *pointer; |
| typedef charT &reference; |
| typedef const charT &const_reference; |
| typedef size_t size_type; |
| typedef ptrdiff_t difference_type; |
| basic_string(); |
| basic_string( charT *str ); |
| size_type size(); |
| charT operator []( int pos ) const; |
| charT *c_str() const; |
| basic_string<charT> &operator = ( const basic_string &ws ); |
| basic_string<charT> &operator = ( const charT *str ); |
| basic_string<charT> &append( const basic_string<charT> &other ); |
| basic_string<charT> &append( const charT *str ); |
| void push_back( charT c ); |
| void clear(); |
| void reserve( size_type t ); |
| void resize( size_type n, charT c = charT() ); |
| int compare( const basic_string<charT> &other ) const; |
| int compare( const charT *str ) const; |
| basic_string<charT> &insert( size_type pos, |
| const basic_string<charT> &str ); |
| size_type find( const basic_string<charT> &other, int pos = 0 ) const; |
| size_type find( charT c, int pos = 0 ) const; |
| %extend { |
| bool operator == ( const basic_string<charT> &other ) const { |
| return self->compare( other ) == 0; |
| } |
| bool operator != ( const basic_string<charT> &other ) const { |
| return self->compare( other ) != 0; |
| } |
| bool operator < ( const basic_string<charT> &other ) const { |
| return self->compare( other ) == -1; |
| } |
| bool operator > ( const basic_string<charT> &other ) const { |
| return self->compare( other ) == 1; |
| } |
| bool operator <= ( const basic_string<charT> &other ) const { |
| return self->compare( other ) != 1; |
| } |
| bool operator >= ( const basic_string<charT> &other ) const { |
| return self->compare( other ) != -1; |
| } |
| |
| } |
| }; |
| |
| %template(string) basic_string<char>; |
| %template(wstring) basic_string<wchar_t>; |
| |
| %apply char * { string }; |
| %apply wchar_t * { wstring }; |
| |
| typedef basic_string<char> string; |
| typedef basic_string<wchar_t> wstring; |
| |
| // automatically convert constant std::strings to cl:strings |
| %typemap(ctype) string "char *"; |
| %typemap(in) string "$1.assign($input);"; |
| %typemap(out) string "$result = (char *)(&$1)->c_str();"; |
| %typemap(lisptype) string "cl:string"; |
| %typemap(lout) string "(cl::setq ACL_ffresult $body)"; |
| |
| %typemap(ctype) const string *"char *"; |
| %typemap(in) const string * "$1.assign($input);"; |
| %typemap(out) const string * "$result = (char *)($1)->c_str();"; |
| %typemap(lisptype) const string * "cl:string"; |
| %typemap(lout) const string * "(cl::setq ACL_ffresult $body)"; |
| |
| %typemap(ctype) wstring "wchar_t *"; |
| %typemap(in) wstring "$1.assign($input);"; |
| %typemap(out) wstring "$result = (wchar_t *)(&$1)->c_str();"; |
| %typemap(lisptype) wstring "cl:string"; |
| %typemap(lout) wstring "(cl::setq ACL_ffresult (excl:native-to-string $body |
| :external-format #+little-endian :fat-le #-little-endian :fat))"; |
| |
| %typemap(ctype) const wstring *"char *"; |
| %typemap(in) const wstring * "$1.assign($input);"; |
| %typemap(out) const wstring * "$result = (char *)($1)->c_str();"; |
| %typemap(lisptype) const wstring * "cl:string"; |
| %typemap(lout) const wstring * "(cl::setq ACL_ffresult $body)"; |
| |
| /* Overloading check */ |
| // %typemap(in) string { |
| // if (caml_ptr_check($input)) |
| // $1.assign((char *)caml_ptr_val($input,0), |
| // caml_string_len($input)); |
| // else |
| // SWIG_exception(SWIG_TypeError, "string expected"); |
| // } |
| |
| // %typemap(in) const string & ($*1_ltype temp) { |
| // if (caml_ptr_check($input)) { |
| // temp.assign((char *)caml_ptr_val($input,0), |
| // caml_string_len($input)); |
| // $1 = &temp; |
| // } else { |
| // SWIG_exception(SWIG_TypeError, "string expected"); |
| // } |
| // } |
| |
| // %typemap(in) string & ($*1_ltype temp) { |
| // if (caml_ptr_check($input)) { |
| // temp.assign((char *)caml_ptr_val($input,0), |
| // caml_string_len($input)); |
| // $1 = &temp; |
| // } else { |
| // SWIG_exception(SWIG_TypeError, "string expected"); |
| // } |
| // } |
| |
| // %typemap(in) string * ($*1_ltype *temp) { |
| // if (caml_ptr_check($input)) { |
| // temp = new $*1_ltype((char *)caml_ptr_val($input,0), |
| // caml_string_len($input)); |
| // $1 = temp; |
| // } else { |
| // SWIG_exception(SWIG_TypeError, "string expected"); |
| // } |
| // } |
| |
| // %typemap(free) string * ($*1_ltype *temp) { |
| // delete temp; |
| // } |
| |
| // %typemap(argout) string & { |
| // caml_list_append(swig_result,caml_val_string_len((*$1).c_str(), |
| // (*$1).size())); |
| // } |
| |
| // %typemap(directorout) string { |
| // $result.assign((char *)caml_ptr_val($input,0), |
| // caml_string_len($input)); |
| // } |
| |
| // %typemap(out) string { |
| // $result = caml_val_string_len($1.c_str(),$1.size()); |
| // } |
| |
| // %typemap(out) string * { |
| // $result = caml_val_string_len((*$1).c_str(),(*$1).size()); |
| // } |
| } |
| |
| // #ifdef ENABLE_CHARPTR_ARRAY |
| // char **c_charptr_array( const std::vector <string > &str_v ); |
| |
| // %{ |
| // SWIGEXT char **c_charptr_array( const std::vector <string > &str_v ) { |
| // char **out = new char *[str_v.size() + 1]; |
| // out[str_v.size()] = 0; |
| // for( int i = 0; i < str_v.size(); i++ ) { |
| // out[i] = (char *)str_v[i].c_str(); |
| // } |
| // return out; |
| // } |
| // %} |
| // #endif |
| |
| // #ifdef ENABLE_STRING_VECTOR |
| // %template (StringVector) std::vector<string >; |
| |
| // %insert(ml) %{ |
| // (* Some STL convenience items *) |
| |
| // let string_array_to_vector sa = |
| // let nv = _new_StringVector C_void in |
| // array_to_vector nv (fun x -> C_string x) sa ; nv |
| |
| // let c_string_array ar = |
| // _c_charptr_array (string_array_to_vector ar) |
| // %} |
| |
| // %insert(mli) %{ |
| // val c_string_array: string array -> c_obj |
| // %} |
| // #endif |