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