# TODO: Figure out how many of the pass-by-value copies the compiler can eliminate. #################### string.from_py #################### cdef extern from *: cdef cppclass string "std::string": string() string(char* c_str, size_t size) cdef char* __Pyx_PyObject_AsStringAndSize(object, Py_ssize_t*) except NULL @cname("{{cname}}") cdef string {{cname}}(object o) except *: cdef Py_ssize_t length cdef 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 "const std::string": char* data() size_t size() cdef object __Pyx_PyObject_FromStringAndSize(char*, size_t) @cname("{{cname}}") cdef object {{cname}}(string& s): return __Pyx_PyObject_FromStringAndSize(s.data(), s.size()) #################### vector.from_py #################### {{template_type_declarations}} 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_from_py(item)) return v #################### vector.to_py #################### {{template_type_declarations}} 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 [X_to_py(v[i]) for i in range(v.size())] #################### list.from_py #################### {{template_type_declarations}} 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_from_py(item)) return l #################### list.to_py #################### cimport cython {{template_type_declarations}} 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() cdef cppclass const_cpp_list "const std::list" [T] (cpp_list): pass @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(X_to_py(cython.operator.dereference(iter))) cython.operator.preincrement(iter) return o #################### set.from_py #################### {{template_type_declarations}} 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_from_py(item)) return s #################### set.to_py #################### cimport cython {{template_type_declarations}} 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() cdef cppclass const_cpp_set "const std::{{maybe_unordered}}set" [T](cpp_set): pass @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(X_to_py(cython.operator.dereference(iter))) cython.operator.preincrement(iter) return o #################### pair.from_py #################### {{template_type_declarations}} 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_from_py(x), Y_from_py(y)) #################### pair.to_py #################### {{template_type_declarations}} cdef extern from *: cdef cppclass pair "const std::pair" [T, U]: T first U second @cname("{{cname}}") cdef object {{cname}}(pair[X,Y]& p): return X_to_py(p.first), Y_to_py(p.second) #################### map.from_py #################### {{template_type_declarations}} 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 pair "std::pair" [T, U]: pass 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_from_py(key), Y_from_py(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 {{template_type_declarations}} cdef extern from *: cdef cppclass map "std::{{maybe_unordered}}map" [T, U]: cppclass value_type: T first U second cppclass iterator: value_type& operator*() iterator operator++() bint operator!=(iterator) iterator begin() iterator end() @cname("{{cname}}") cdef object {{cname}}(map[X,Y] s): o = {} cdef map[X,Y].value_type *key_value cdef map[X,Y].iterator iter = s.begin() while iter != s.end(): key_value = &cython.operator.dereference(iter) o[X_to_py(key_value.first)] = Y_to_py(key_value.second) cython.operator.preincrement(iter) return o