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
|
/* -----------------------------------------------------------------------------
* std_filesystem.i
*
* SWIG typemaps for std::filesystem::path
* ----------------------------------------------------------------------------- */
%{
#include <filesystem>
%}
namespace std {
namespace filesystem {
class path;
}
}
%fragment("SWIG_std_filesystem", "header") {
SWIGINTERN PyObject *SWIG_std_filesystem_importPathClass() {
PyObject *module = PyImport_ImportModule("pathlib");
PyObject *cls = PyObject_GetAttrString(module, "Path");
SWIG_Py_DECREF(module);
return cls;
}
SWIGINTERN bool SWIG_std_filesystem_isPathInstance(PyObject *obj) {
PyObject *cls = SWIG_std_filesystem_importPathClass();
bool is_instance = PyObject_IsInstance(obj, cls);
SWIG_Py_DECREF(cls);
return is_instance;
}
}
%typemap(in, fragment="SWIG_std_filesystem", fragment="<type_traits>") std::filesystem::path {
if (PyUnicode_Check($input)) {
PyObject *bytes = NULL;
const char *s = SWIG_PyUnicode_AsUTF8AndSize($input, NULL, &bytes);
$1 = std::filesystem::path(s);
SWIG_Py_XDECREF(bytes);
} else if (SWIG_std_filesystem_isPathInstance($input)) {
PyObject *str_obj = PyObject_Str($input);
if constexpr (std::is_same_v<typename std::filesystem::path::value_type, wchar_t>) {
Py_ssize_t size = 0;
wchar_t *ws = PyUnicode_AsWideCharString(str_obj, &size);
if (!ws) SWIG_fail;
$1 = std::filesystem::path(std::wstring(ws, static_cast<size_t>(size)));
PyMem_Free(ws);
} else {
PyObject *bytes = NULL;
const char *s = SWIG_PyUnicode_AsUTF8AndSize(str_obj, NULL, &bytes);
$1 = std::filesystem::path(s);
SWIG_Py_XDECREF(bytes);
}
SWIG_Py_DECREF(str_obj);
} else {
void *argp = 0;
int res = SWIG_ConvertPtr($input, &argp, $descriptor(std::filesystem::path *), $disown | 0);
if (!SWIG_IsOK(res)) {
%argument_fail(res, "$type", $symname, $argnum);
}
std::filesystem::path *temp = %reinterpret_cast(argp, $1_ltype*);
$1 = *temp;
}
}
%typemap(in, fragment="SWIG_std_filesystem", fragment="<type_traits>") const std::filesystem::path &(std::filesystem::path temp_path) {
if (PyUnicode_Check($input)) {
PyObject *bytes = NULL;
const char *s = SWIG_PyUnicode_AsUTF8AndSize($input, NULL, &bytes);
temp_path = std::filesystem::path(s);
$1 = &temp_path;
SWIG_Py_XDECREF(bytes);
} else if (SWIG_std_filesystem_isPathInstance($input)) {
PyObject *str_obj = PyObject_Str($input);
if constexpr (std::is_same_v<typename std::filesystem::path::value_type, wchar_t>) {
Py_ssize_t size = 0;
wchar_t *ws = PyUnicode_AsWideCharString(str_obj, &size);
if (!ws) SWIG_fail;
temp_path = std::filesystem::path(std::wstring(ws, static_cast<size_t>(size)));
$1 = &temp_path;
PyMem_Free(ws);
} else {
PyObject *bytes = NULL;
const char *s = SWIG_PyUnicode_AsUTF8AndSize(str_obj, NULL, &bytes);
temp_path = std::filesystem::path(s);
$1 = &temp_path;
SWIG_Py_XDECREF(bytes);
}
SWIG_Py_DECREF(str_obj);
} else {
void *argp = 0;
int res = SWIG_ConvertPtr($input, &argp, $descriptor, $disown | 0);
if (!SWIG_IsOK(res)) {
%argument_fail(res, "$type", $symname, $argnum);
}
$1 = %reinterpret_cast(argp, $1_ltype);
}
}
%typemap(out, fragment="SWIG_std_filesystem", fragment="<type_traits>") std::filesystem::path {
PyObject *args;
if constexpr (std::is_same_v<typename std::filesystem::path::value_type, wchar_t>) {
std::wstring s = $1.generic_wstring();
args = Py_BuildValue("(u)", s.data());
} else {
std::string s = $1.generic_string();
args = Py_BuildValue("(s)", s.data());
}
PyObject *cls = SWIG_std_filesystem_importPathClass();
$result = PyObject_CallObject(cls, args);
SWIG_Py_DECREF(cls);
SWIG_Py_DECREF(args);
}
%typemap(out, fragment="SWIG_std_filesystem", fragment="<type_traits>") const std::filesystem::path & {
PyObject *args;
if constexpr (std::is_same_v<typename std::filesystem::path::value_type, wchar_t>) {
std::wstring s = $1->generic_wstring();
args = Py_BuildValue("(u)", s.data());
} else {
std::string s = $1->generic_string();
args = Py_BuildValue("(s)", s.data());
}
PyObject *cls = SWIG_std_filesystem_importPathClass();
$result = PyObject_CallObject(cls, args);
SWIG_Py_DECREF(cls);
SWIG_Py_DECREF(args);
}
|