66#include " details/types.hpp"
77#include < variant/variant.hpp>
88
9- // PEP 623 deprecates legacy strings and therefor
10- // deprecates e.g. PyUnicode_READY in Python 3.10
11- #if PY_VERSION_HEX < 0x030A0000
12- #define PY_BELOW_3_10
13- #endif
14-
159bool valid_str (PyObject* str, const char * name)
1610{
1711 if (!PyUnicode_Check (str)) {
1812 PyErr_Format (PyExc_TypeError, " %s must be a String or None" , name);
1913 return false ;
2014 }
2115
22- #ifdef PY_BELOW_3_10
16+ // PEP 623 deprecates legacy strings and therefor
17+ // deprecates e.g. PyUnicode_READY in Python 3.10
18+ #if PY_VERSION_HEX < PYTHON_VERSION(3,10,0)
2319 if (PyUnicode_READY (str)) {
2420 return false ;
2521 }
@@ -36,11 +32,31 @@ bool valid_str(PyObject* str, const char* name)
3632 return PyModule_Create (&moduledef); \
3733 }
3834
35+ using python_string =
36+ mpark::variant<std::basic_string<uint8_t >, std::basic_string<uint16_t >, std::basic_string<uint32_t >,
37+ rapidfuzz::basic_string_view<uint8_t >, rapidfuzz::basic_string_view<uint16_t >,
38+ rapidfuzz::basic_string_view<uint32_t >>;
39+
3940using python_string_view =
4041 mpark::variant<rapidfuzz::basic_string_view<uint8_t >, rapidfuzz::basic_string_view<uint16_t >,
4142 rapidfuzz::basic_string_view<uint32_t >>;
4243
43- python_string_view decode_python_string (PyObject* py_str)
44+ python_string decode_python_string (PyObject* py_str)
45+ {
46+ Py_ssize_t len = PyUnicode_GET_LENGTH (py_str);
47+ void * str = PyUnicode_DATA (py_str);
48+
49+ switch (PyUnicode_KIND (py_str)) {
50+ case PyUnicode_1BYTE_KIND:
51+ return rapidfuzz::basic_string_view<uint8_t >(static_cast <uint8_t *>(str), len);
52+ case PyUnicode_2BYTE_KIND:
53+ return rapidfuzz::basic_string_view<uint16_t >(static_cast <uint16_t *>(str), len);
54+ default :
55+ return rapidfuzz::basic_string_view<uint32_t >(static_cast <uint32_t *>(str), len);
56+ }
57+ }
58+
59+ python_string_view decode_python_string_view (PyObject* py_str)
4460{
4561 Py_ssize_t len = PyUnicode_GET_LENGTH (py_str);
4662 void * str = PyUnicode_DATA (py_str);
@@ -55,17 +71,17 @@ python_string_view decode_python_string(PyObject* py_str)
5571 }
5672}
5773
58- PyObject* encode_python_string (std::basic_string <uint8_t > str)
74+ PyObject* encode_python_string (rapidfuzz::basic_string_view <uint8_t > str)
5975{
6076 return PyUnicode_FromKindAndData (PyUnicode_1BYTE_KIND, str.data (), str.size ());
6177}
6278
63- PyObject* encode_python_string (std::basic_string <uint16_t > str)
79+ PyObject* encode_python_string (rapidfuzz::basic_string_view <uint16_t > str)
6480{
6581 return PyUnicode_FromKindAndData (PyUnicode_2BYTE_KIND, str.data (), str.size ());
6682}
6783
68- PyObject* encode_python_string (std::basic_string <uint32_t > str)
84+ PyObject* encode_python_string (rapidfuzz::basic_string_view <uint32_t > str)
6985{
7086 return PyUnicode_FromKindAndData (PyUnicode_4BYTE_KIND, str.data (), str.size ());
7187}
0 commit comments