128 lines
4.3 KiB
OpenEdge ABL
128 lines
4.3 KiB
OpenEdge ABL
/* -----------------------------------------------------------------------------
|
|
* 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);
|
|
}
|