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_str;
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; %}
}
|