# mode: run # tag: cpp, werror PYTHON setup.py build_ext --inplace PYTHON -c "import a; a.test_convert()" ######## setup.py ######## from Cython.Build.Dependencies import cythonize from Cython.Compiler import PyrexTypes PyrexTypes.cpp_string_conversions += ("MyString", "MyString2") from distutils.core import setup setup( ext_modules = cythonize("*.pyx"), ) ######## my_string.cpp ######## #include class MyString { public: MyString() { } MyString(const char* data, size_t size) : value_(data, size) { } const char* data() const { return value_.data(); } const size_t size() const { return value_.size(); } private: std::string value_; }; class MyString2 : public MyString { public: MyString2() : MyString() { } MyString2(const char* data, size_t size) : MyString(data, size) { } }; typedef MyString MyTypedefString; ######## a.pyx ######## # distutils: language = c++ cdef extern from "my_string.cpp": cdef cppclass MyString: pass cdef cppclass MyString2: pass ctypedef MyString2 MyTypedefString # really a MyString def do_convert(MyString value): return value def do_convert2(MyString2 value): return value def do_convert_typedef(MyTypedefString value): return value def test_convert(): assert do_convert(b"abc") == b"abc" assert do_convert(b"ab\0c") == b"ab\0c" assert do_convert2(b"abc") == b"abc" assert do_convert2(b"ab\0c") == b"ab\0c" assert do_convert_typedef(b"abc") == b"abc" assert do_convert_typedef(b"ab\0c") == b"ab\0c"