1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
/* -----------------------------------------------------------------------------
* std_string_view.i
*
* Typemaps for std::string_view and const std::string_view&
* These are mapped to a Java String and are passed around by value.
*
* To use non-const std::string_view references use the following %apply. Note
* that they are passed by value.
* %apply const std::string_view & {std::string_view &};
* ----------------------------------------------------------------------------- */
%{
#include <string_view>
#include <string>
%}
namespace std {
%naturalvar string_view;
class string_view;
// string_view
%typemap(jni) string_view "jstring"
%typemap(jtype) string_view "String"
%typemap(jstype) string_view "String"
%typemap(javadirectorin) string_view "$jniinput"
%typemap(javadirectorout) string_view "$javacall"
%typemap(in) string_view
%{ if(!$input) {
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string");
return $null;
}
const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0);
if (!$1_pstr) return $null;
$1 = std::string_view($1_pstr); %}
/* std::string_view requires the string data to remain valid while the
* string_view is in use. */
%typemap(freearg) string_view
%{ jenv->ReleaseStringUTFChars($input, $1_pstr); %}
%typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) string_view
%{ if(!$input) {
if (!jenv->ExceptionCheck()) {
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string");
}
return $null;
}
const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0);
if (!$1_pstr) return $null;
/* possible thread/reentrant code problem */
static std::string $1_str;
$1_str = $1_pstr;
$result = std::string_view($1_str);
jenv->ReleaseStringUTFChars($input, $1_pstr); %}
/* std::string_view::data() isn't zero-byte terminated, but NewStringUTF()
* requires a zero byte so it seems we have to make a copy (ick). The
* cleanest way to do that seems to be via a temporary std::string.
*/
%typemap(directorin,descriptor="Ljava/lang/String;") string_view
%{ $input = jenv->NewStringUTF(std::string($1).c_str());
Swig::LocalRefGuard $1_refguard(jenv, $input); %}
%typemap(out) string_view
%{ $result = jenv->NewStringUTF(std::string($1).c_str()); %}
%typemap(javain) string_view "$javainput"
%typemap(javaout) string_view {
return $jnicall;
}
%typemap(typecheck) string_view = char *;
%typemap(throws) string_view
%{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, std::string($1).c_str());
return $null; %}
// const string_view &
%typemap(jni) const string_view & "jstring"
%typemap(jtype) const string_view & "String"
%typemap(jstype) const string_view & "String"
%typemap(javadirectorin) const string_view & "$jniinput"
%typemap(javadirectorout) const string_view & "$javacall"
%typemap(in) const string_view &
%{ if(!$input) {
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string");
return $null;
}
const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0);
if (!$1_pstr) return $null;
$*1_ltype $1_str($1_pstr);
$1 = &$1_str; %}
/* std::string_view requires the string data to remain valid while the
* string_view is in use. */
%typemap(freearg) const string_view &
%{ jenv->ReleaseStringUTFChars($input, $1_pstr); %}
%typemap(directorout,warning=SWIGWARN_TYPEMAP_THREAD_UNSAFE_MSG) const string_view &
%{ if(!$input) {
SWIG_JavaThrowException(jenv, SWIG_JavaNullPointerException, "null string");
return $null;
}
const char *$1_pstr = (const char *)jenv->GetStringUTFChars($input, 0);
if (!$1_pstr) return $null;
/* possible thread/reentrant code problem */
static std::string $1_str;
$1_str = $1_pstr;
static $*1_ltype $1_strview;
$1_strview = $1_str;
$result = &$1_strview;
jenv->ReleaseStringUTFChars($input, $1_pstr); %}
%typemap(directorin,descriptor="Ljava/lang/String;") const string_view &
%{ $input = jenv->NewStringUTF(std::string($1).c_str());
Swig::LocalRefGuard $1_refguard(jenv, $input); %}
%typemap(out) const string_view &
%{ $result = jenv->NewStringUTF(std::string(*$1).c_str()); %}
%typemap(javain) const string_view & "$javainput"
%typemap(javaout) const string_view & {
return $jnicall;
}
%typemap(typecheck) const string_view & = char *;
%typemap(throws) const string_view &
%{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, std::string($1).c_str());
return $null; %}
}
|