1# mode: run 2# tag: cpp 3 4""" 5PYTHON setup.py build_ext --inplace 6PYTHON -c "from assignment_overload import test; test()" 7""" 8 9######## setup.py ######## 10 11from distutils.core import setup 12from Cython.Build import cythonize 13setup(ext_modules=cythonize("*.pyx", language='c++')) 14 15 16######## assign.cpp ######## 17 18class wrapped_int { 19public: 20 long long val; 21 wrapped_int() { val = 0; } 22 wrapped_int(long long val) { this->val = val; } 23 wrapped_int &operator=(const wrapped_int &other) { 24 this->val = other.val; 25 return *this; 26 } 27 wrapped_int &operator=(const long long val) { 28 this->val = val; 29 return *this; 30 } 31}; 32 33 34######## assign.pxd ######## 35 36cdef extern from "assign.cpp" nogil: 37 cppclass wrapped_int: 38 long long val 39 wrapped_int() 40 wrapped_int(long long val) 41 wrapped_int& operator=(const wrapped_int &other) 42 wrapped_int& operator=(const long long &other) 43 44 45######## assignment_overload.pyx ######## 46 47from assign cimport wrapped_int 48 49def test(): 50 cdef wrapped_int a = wrapped_int(2) 51 cdef wrapped_int b = wrapped_int(3) 52 cdef long long c = 4 53 54 assert &a != &b 55 assert a.val != b.val 56 57 a = b 58 assert &a != &b 59 assert a.val == b.val 60 a = c 61 assert a.val == c 62 63 a, b, c = 2, 3, 4 64 a = b = c 65 assert &a != &b 66 assert a.val == b.val 67 assert b.val == c 68