/
niceSOFT
/
swig
Обзор
Документация
Войти
/
niceSOFT
/
swig
Код
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
Lib/python/std_filesystem.i
127 строк
4 KB
William S Fulton
Add forward class definition for std::filesystem::path class
19 авг 2024, 20:33
19 авг 2024, 20:33
5ac5d90
Код
Авторство
О чём код?
/* ----------------------------------------------------------------------------- * 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); }