summaryrefslogtreecommitdiffstats
path: root/contrib/tools/cython/Cython/Utility/CppConvert.pyx
diff options
context:
space:
mode:
authoralexv-smirnov <[email protected]>2023-03-15 19:59:12 +0300
committeralexv-smirnov <[email protected]>2023-03-15 19:59:12 +0300
commit056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11 (patch)
tree4740980126f32e3af7937ba0ca5f83e59baa4ab0 /contrib/tools/cython/Cython/Utility/CppConvert.pyx
parent269126dcced1cc8b53eb4398b4a33e5142f10290 (diff)
add library/cpp/actors, ymake build to ydb oss export
Diffstat (limited to 'contrib/tools/cython/Cython/Utility/CppConvert.pyx')
-rw-r--r--contrib/tools/cython/Cython/Utility/CppConvert.pyx384
1 files changed, 384 insertions, 0 deletions
diff --git a/contrib/tools/cython/Cython/Utility/CppConvert.pyx b/contrib/tools/cython/Cython/Utility/CppConvert.pyx
new file mode 100644
index 00000000000..5f7859dd0ef
--- /dev/null
+++ b/contrib/tools/cython/Cython/Utility/CppConvert.pyx
@@ -0,0 +1,384 @@
+# TODO: Figure out how many of the pass-by-value copies the compiler can eliminate.
+
+
+#################### string.from_py ####################
+
+cdef extern from *:
+ cdef cppclass string "{{type}}":
+ string()
+ string(char* c_str, size_t size)
+ cdef const char* __Pyx_PyObject_AsStringAndSize(object, Py_ssize_t*) except NULL
+
+@cname("{{cname}}")
+cdef string {{cname}}(object o) except *:
+ cdef Py_ssize_t length = 0
+ cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length)
+ return string(data, length)
+
+
+#################### string.to_py ####################
+
+#cimport cython
+#from libcpp.string cimport string
+cdef extern from *:
+ cdef cppclass string "{{type}}":
+ char* data()
+ size_t size()
+
+{{for py_type in ['PyObject', 'PyUnicode', 'PyStr', 'PyBytes', 'PyByteArray']}}
+cdef extern from *:
+ cdef object __Pyx_{{py_type}}_FromStringAndSize(const char*, size_t)
+
+@cname("{{cname.replace("PyObject", py_type, 1)}}")
+cdef inline object {{cname.replace("PyObject", py_type, 1)}}(const string& s):
+ return __Pyx_{{py_type}}_FromStringAndSize(s.data(), s.size())
+{{endfor}}
+
+
+#################### vector.from_py ####################
+
+cdef extern from *:
+ cdef cppclass vector "std::vector" [T]:
+ void push_back(T&)
+
+@cname("{{cname}}")
+cdef vector[X] {{cname}}(object o) except *:
+ cdef vector[X] v
+ for item in o:
+ v.push_back(<X>item)
+ return v
+
+
+#################### vector.to_py ####################
+
+cdef extern from *:
+ cdef cppclass vector "const std::vector" [T]:
+ size_t size()
+ T& operator[](size_t)
+
+@cname("{{cname}}")
+cdef object {{cname}}(vector[X]& v):
+ return [v[i] for i in range(v.size())]
+
+
+#################### list.from_py ####################
+
+cdef extern from *:
+ cdef cppclass cpp_list "std::list" [T]:
+ void push_back(T&)
+
+@cname("{{cname}}")
+cdef cpp_list[X] {{cname}}(object o) except *:
+ cdef cpp_list[X] l
+ for item in o:
+ l.push_back(<X>item)
+ return l
+
+
+#################### list.to_py ####################
+
+cimport cython
+
+cdef extern from *:
+ cdef cppclass cpp_list "std::list" [T]:
+ cppclass const_iterator:
+ T& operator*()
+ const_iterator operator++()
+ bint operator!=(const_iterator)
+ const_iterator begin()
+ const_iterator end()
+
+@cname("{{cname}}")
+cdef object {{cname}}(const cpp_list[X]& v):
+ o = []
+ cdef cpp_list[X].const_iterator iter = v.begin()
+ while iter != v.end():
+ o.append(cython.operator.dereference(iter))
+ cython.operator.preincrement(iter)
+ return o
+
+
+#################### set.from_py ####################
+
+cdef extern from *:
+ cdef cppclass set "std::{{maybe_unordered}}set" [T]:
+ void insert(T&)
+
+@cname("{{cname}}")
+cdef set[X] {{cname}}(object o) except *:
+ cdef set[X] s
+ for item in o:
+ s.insert(<X>item)
+ return s
+
+
+#################### set.to_py ####################
+
+cimport cython
+
+cdef extern from *:
+ cdef cppclass cpp_set "std::{{maybe_unordered}}set" [T]:
+ cppclass const_iterator:
+ T& operator*()
+ const_iterator operator++()
+ bint operator!=(const_iterator)
+ const_iterator begin()
+ const_iterator end()
+
+@cname("{{cname}}")
+cdef object {{cname}}(const cpp_set[X]& s):
+ o = set()
+ cdef cpp_set[X].const_iterator iter = s.begin()
+ while iter != s.end():
+ o.add(cython.operator.dereference(iter))
+ cython.operator.preincrement(iter)
+ return o
+
+#################### pair.from_py ####################
+
+cdef extern from *:
+ cdef cppclass pair "std::pair" [T, U]:
+ pair()
+ pair(T&, U&)
+
+@cname("{{cname}}")
+cdef pair[X,Y] {{cname}}(object o) except *:
+ x, y = o
+ return pair[X,Y](<X>x, <Y>y)
+
+
+#################### pair.to_py ####################
+
+cdef extern from *:
+ cdef cppclass pair "std::pair" [T, U]:
+ T first
+ U second
+
+@cname("{{cname}}")
+cdef object {{cname}}(const pair[X,Y]& p):
+ return p.first, p.second
+
+
+#################### map.from_py ####################
+
+cdef extern from *:
+ cdef cppclass pair "std::pair" [T, U]:
+ pair(T&, U&)
+ cdef cppclass map "std::{{maybe_unordered}}map" [T, U]:
+ void insert(pair[T, U]&)
+ cdef cppclass vector "std::vector" [T]:
+ pass
+
+
+@cname("{{cname}}")
+cdef map[X,Y] {{cname}}(object o) except *:
+ cdef dict d = o
+ cdef map[X,Y] m
+ for key, value in d.iteritems():
+ m.insert(pair[X,Y](<X>key, <Y>value))
+ return m
+
+
+#################### map.to_py ####################
+# TODO: Work out const so that this can take a const
+# reference rather than pass by value.
+
+cimport cython
+
+cdef extern from *:
+ cdef cppclass map "std::{{maybe_unordered}}map" [T, U]:
+ cppclass value_type:
+ T first
+ U second
+ cppclass const_iterator:
+ value_type& operator*()
+ const_iterator operator++()
+ bint operator!=(const_iterator)
+ const_iterator begin()
+ const_iterator end()
+
+@cname("{{cname}}")
+cdef object {{cname}}(const map[X,Y]& s):
+ o = {}
+ cdef const map[X,Y].value_type *key_value
+ cdef map[X,Y].const_iterator iter = s.begin()
+ while iter != s.end():
+ key_value = &cython.operator.dereference(iter)
+ o[key_value.first] = key_value.second
+ cython.operator.preincrement(iter)
+ return o
+
+
+#################### complex.from_py ####################
+
+cdef extern from *:
+ cdef cppclass std_complex "std::complex" [T]:
+ std_complex()
+ std_complex(T, T) except +
+
+@cname("{{cname}}")
+cdef std_complex[X] {{cname}}(object o) except *:
+ cdef double complex z = o
+ return std_complex[X](<X>z.real, <X>z.imag)
+
+
+#################### complex.to_py ####################
+
+cdef extern from *:
+ cdef cppclass std_complex "std::complex" [T]:
+ X real()
+ X imag()
+
+@cname("{{cname}}")
+cdef object {{cname}}(const std_complex[X]& z):
+ cdef double complex tmp
+ tmp.real = <double>z.real()
+ tmp.imag = <double>z.imag()
+ return tmp
+
+
+#################### arcadia_TMaybe.from_py ####################
+
+cdef extern from *:
+ cdef cppclass TMaybe [T]:
+ TMaybe()
+ TMaybe(T&)
+ TMaybe& operator =(T&)
+
+@cname("{{cname}}")
+cdef TMaybe[X] {{cname}}(object o) except *:
+ cdef TMaybe[X] result
+ if o is not None:
+ result = <X>o
+ return result
+
+#################### arcadia_TMaybe.to_py ####################
+
+cdef extern from *:
+ cdef cppclass TMaybe [T]:
+ bint Defined()
+ T& GetRef()
+
+@cname("{{cname}}")
+cdef object {{cname}}(const TMaybe[X]& s):
+ if s.Defined():
+ return s.GetRef()
+ return None
+
+
+#################### arcadia_TVector.from_py ####################
+
+cdef extern from *:
+ cdef cppclass TVector [T]:
+ void push_back(T&)
+
+@cname("{{cname}}")
+cdef TVector[X] {{cname}}(object o) except *:
+ cdef TVector[X] v
+ for item in o:
+ v.push_back(<X>item)
+ return v
+
+
+#################### arcadia_TVector.to_py ####################
+
+cdef extern from *:
+ cdef cppclass TVector [T]:
+ size_t size()
+ T& operator[](size_t)
+
+@cname("{{cname}}")
+cdef object {{cname}}(const TVector[X]& v):
+ return [v[i] for i in range(v.size())]
+
+
+#################### arcadia_THashMap.from_py ####################
+
+cdef extern from *:
+ cdef cppclass pair "std::pair" [T, U]:
+ pair(T&, U&)
+ cdef cppclass THashMap [T, U]:
+ void insert(pair[T, U]&)
+
+
+@cname("{{cname}}")
+cdef THashMap[X,Y] {{cname}}(object o) except *:
+ cdef dict d = o
+ cdef THashMap[X,Y] m
+ for key, value in d.iteritems():
+ m.insert(pair[X,Y](<X>key, <Y>value))
+ return m
+
+
+#################### arcadia_THashMap.to_py ####################
+
+cimport cython
+
+cdef extern from *:
+ cdef cppclass THashMap [T, U]:
+ cppclass value_type:
+ T first
+ U second
+ cppclass const_iterator:
+ value_type& operator*()
+ const_iterator operator++()
+ bint operator!=(const_iterator)
+ const_iterator begin()
+ const_iterator end()
+
+@cname("{{cname}}")
+cdef dict {{cname}}(const THashMap[X,Y]& s):
+ cdef dict result = {}
+ cdef const THashMap[X,Y].value_type *key_value
+ cdef THashMap[X,Y].const_iterator iter = s.begin()
+ while iter != s.end():
+ key_value = &cython.operator.dereference(iter)
+ result[key_value.first] = key_value.second
+ cython.operator.preincrement(iter)
+ return result
+
+
+#################### arcadia_TMap.from_py ####################
+
+cdef extern from *:
+ cdef cppclass pair "std::pair" [T, U]:
+ pair(T&, U&)
+ cdef cppclass TMap [T, U]:
+ void insert(pair[T, U]&)
+
+
+@cname("{{cname}}")
+cdef TMap[X,Y] {{cname}}(object o) except *:
+ cdef dict d = o
+ cdef TMap[X,Y] m
+ for key, value in d.iteritems():
+ m.insert(pair[X,Y](<X>key, <Y>value))
+ return m
+
+
+#################### arcadia_TMap.to_py ####################
+
+cimport cython
+
+cdef extern from *:
+ cdef cppclass TMap [T, U]:
+ cppclass value_type:
+ T first
+ U second
+ cppclass const_iterator:
+ value_type& operator*()
+ const_iterator operator++()
+ bint operator!=(const_iterator)
+ const_iterator begin()
+ const_iterator end()
+
+@cname("{{cname}}")
+cdef dict {{cname}}(const TMap[X,Y]& s):
+ cdef dict result = {}
+ cdef const TMap[X,Y].value_type *key_value
+ cdef TMap[X,Y].const_iterator iter = s.begin()
+ while iter != s.end():
+ key_value = &cython.operator.dereference(iter)
+ result[key_value.first] = key_value.second
+ cython.operator.preincrement(iter)
+ return result