# mode: run # tag: cpp, werror # cython: experimental_cpp_class_def=True from libcpp.vector cimport vector cdef cppclass Wrapper[T]: T value __init__(T &value): this.value = value void set(T &value): this.value = value T get() const: return this.value def test_const_get(int x): """ >>> test_const_get(10) 10 """ cdef const Wrapper[int] *wrapper = new Wrapper[int](x) try: return const_get(wrapper[0]) finally: del wrapper cdef int const_get(const Wrapper[int] wrapper): return wrapper.get() def test_const_ref_get(int x): """ >>> test_const_ref_get(100) 100 """ cdef const Wrapper[int] *wrapper = new Wrapper[int](x) try: return const_ref_get(wrapper[0]) finally: del wrapper cdef int const_ref_get(const Wrapper[int] &wrapper): return wrapper.get() def test_const_pointer_get(int x): """ >>> test_const_pointer_get(1000) 1000 """ cdef Wrapper[int] *wrapper = new Wrapper[int](x) cdef const Wrapper[int] *const_wrapper = wrapper try: return const_wrapper.get() finally: del wrapper # TODO: parse vector[Wrapper[int]*] ctypedef Wrapper[int] wrapInt def test_vector_members(py_a, py_b): """ >>> test_vector_members([1, 2, 3], [4,5, 6]) ([1, 2, 3], 4) """ cdef Wrapper[int] *value cdef const Wrapper[int] *const_value cdef vector[const Wrapper[int]*] a cdef vector[wrapInt*] b for x in py_a: a.push_back(new Wrapper[int](x)) for x in py_b: b.push_back(new Wrapper[int](x)) try: return vector_members(a, b) finally: for const_value in a: del const_value for value in b: del value cdef vector_members(vector[const Wrapper[int]*] a, const vector[wrapInt*] b): # TODO: Cython-level error. # b[0].set(100) # TODO: const_iterator return [x.get() for x in a], b[0].get()