46#if LASS_HAVE_STD_FILESYSTEM
48#if LASS_PLATFORM_TYPE != LASS_PLATFORM_TYPE_WIN32
53int getBytes(PyObject* obj, std::string& v)
55 const char* data = PyBytes_AsString(obj);
60 const Py_ssize_t size = PyBytes_GET_SIZE(obj);
61 v = std::string{ data,
static_cast<size_t>(size) };
75PyObject* PyExportTraits<std::filesystem::path>::build(
const std::filesystem::path& v)
77#if LASS_PLATFORM_TYPE == LASS_PLATFORM_TYPE_WIN32
79 static_assert(std::is_same_v<std::filesystem::path::value_type, wchar_t>);
80 TPyObjPtr path{ PyExportTraits<std::wstring>::build(v.native()) };
83 static_assert(std::is_same_v<std::filesystem::path::value_type, char>);
84 const std::string& s = v.native();
85 if (s.size() > PY_SSIZE_T_MAX)
87 PyErr_SetString(PyExc_OverflowError,
"input too long");
90 TPyObjPtr path{ PyUnicode_DecodeFSDefaultAndSize(s.data(),
static_cast<Py_ssize_t
>(s.size())) };
96 TPyObjPtr pathlib(PyImport_ImportModule(
"pathlib"));
97 pathType.reset(PyObject_GetAttrString(pathlib.get(),
"Path"));
100 return PyObject_CallFunctionObjArgs(pathType.get(), path.get(),
nullptr);
104int PyExportTraits<std::filesystem::path>::get(PyObject* obj, std::filesystem::path& v)
111#if LASS_PLATFORM_TYPE == LASS_PLATFORM_TYPE_WIN32
113 static_assert(std::is_same_v<std::filesystem::path::value_type, wchar_t>);
114 PyObject* strObj =
nullptr;
115 if (!PyUnicode_FSDecoder(obj, &strObj))
120 const int ret = PyExportTraits<std::wstring>::get(strObj, str);
129 static_assert(std::is_same_v<std::filesystem::path::value_type, char>);
130 PyObject* bytesObj =
nullptr;
131 if (!PyUnicode_FSConverter(obj, &bytesObj))
136 const int ret = getBytes(bytesObj, bytes);
140 v = std::move(bytes);
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.