summaryrefslogtreecommitdiff
path: root/dev-python/cython/files/cython-3.0.0_beta3-const-iter.patch
blob: 18822f12904a9c09afddb878f7452cbf764e85a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
From 913b8fadc5fc45306764c0ede472e1bc3b606d10 Mon Sep 17 00:00:00 2001
From: Isuru Fernando <isuruf@gmail.com>
Date: Mon, 12 Jun 2023 13:42:09 -0500
Subject: [PATCH 1/4] Don't remove const for reverse iteration

---
 Cython/Compiler/ExprNodes.py   | 27 ---------------------------
 Cython/Includes/libcpp/map.pxd |  8 ++++++--
 2 files changed, 6 insertions(+), 29 deletions(-)

diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py
index ad4701b7bb6..275a6233da5 100644
--- a/Cython/Compiler/ExprNodes.py
+++ b/Cython/Compiler/ExprNodes.py
@@ -3268,32 +3268,6 @@ def free_temps(self, code):
         ExprNode.free_temps(self, code)
 
 
-def remove_const(item_type):
-    """
-    Removes the constness of a given type and its underlying templates
-    if any.
-
-    This is to solve the compilation error when the temporary variable used to
-    store the result of an iterator cannot be changed due to its constness.
-    For example, the value_type of std::map, which will also be the type of
-    the temporarry variable, is std::pair<const Key, T>. This means the first
-    component of the variable cannot be reused to store the result of each
-    iteration, which leads to a compilation error.
-    """
-    if item_type.is_const:
-        item_type = item_type.cv_base_type
-    if item_type.is_typedef:
-        item_type = remove_const(item_type.typedef_base_type)
-    if item_type.is_cpp_class and item_type.templates:
-        templates = [remove_const(t) if t.is_const else t for t in item_type.templates]
-        template_type = item_type.template_type
-        item_type = PyrexTypes.CppClassType(
-            template_type.name, template_type.scope,
-            template_type.cname, template_type.base_classes,
-            templates, template_type)
-    return item_type
-
-
 class NextNode(AtomicExprNode):
     #  Used as part of for statement implementation.
     #  Implements result = next(iterator)
@@ -3336,7 +3310,6 @@ def infer_type(self, env, iterator_type=None):
 
     def analyse_types(self, env):
         self.type = self.infer_type(env, self.iterator.type)
-        self.type = remove_const(self.type)
         self.is_temp = 1
         return self
 
diff --git a/Cython/Includes/libcpp/map.pxd b/Cython/Includes/libcpp/map.pxd
index d81af66e09a..2c2c5c82adf 100644
--- a/Cython/Includes/libcpp/map.pxd
+++ b/Cython/Includes/libcpp/map.pxd
@@ -50,7 +50,9 @@ cdef extern from "<map>" namespace "std" nogil:
         cppclass reverse_iterator:
             reverse_iterator() except +
             reverse_iterator(reverse_iterator&) except +
-            value_type& operator*()
+            # correct would be value_type& but this does not work
+            # well with cython's code gen
+            pair[T, U]& operator*()
             reverse_iterator operator++()
             reverse_iterator operator--()
             reverse_iterator operator++(int)
@@ -63,7 +65,9 @@ cdef extern from "<map>" namespace "std" nogil:
             const_reverse_iterator() except +
             const_reverse_iterator(reverse_iterator&) except +
             operator=(reverse_iterator&) except +
-            const value_type& operator*()
+            # correct would be const value_type& but this does not work
+            # well with cython's code gen
+            const pair[T, U]& operator*()
             const_reverse_iterator operator++()
             const_reverse_iterator operator--()
             const_reverse_iterator operator++(int)

From cb804f989eaa9938e72d0336d82bb7aa0003455f Mon Sep 17 00:00:00 2001
From: Isuru Fernando <isuruf@gmail.com>
Date: Mon, 12 Jun 2023 13:57:58 -0500
Subject: [PATCH 2/4] Add test from gh5478

---
 tests/run/cpp_iterators.pyx | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/tests/run/cpp_iterators.pyx b/tests/run/cpp_iterators.pyx
index 81048d0b36b..424168fa825 100644
--- a/tests/run/cpp_iterators.pyx
+++ b/tests/run/cpp_iterators.pyx
@@ -7,6 +7,7 @@ from libcpp.map cimport map as stdmap
 from libcpp.set cimport set as stdset
 from libcpp.string cimport string
 from libcpp.vector cimport vector
+from libcpp.memory cimport shared_ptr, make_shared
 from cython.operator cimport dereference as deref
 
 cdef extern from "cpp_iterators_simple.h":
@@ -272,6 +273,27 @@ def test_iteration_over_attribute_of_call():
     for i in get_object_with_iterable_attribute().vec:
         print(i)
 
+cdef extern from *:
+    # TODO: support make_shared[const int]
+    shared_ptr[const int] make_shared_const_int "std::make_shared<const int>"(int)
+
+def test_iteration_over_shared_const_ptr_set(py_v):
+    """
+    >>> test_iteration_over_shared_const_ptr_set[2, 4, 6])
+    6
+    4
+    2
+    """
+    cdef stdset[shared_ptr[const int]] s
+    cdef int i
+    for e in py_v:
+        i = e
+        s.insert(make_shared_const_int(i))
+
+    cdef shared_ptr[const int] a
+    for a in s:
+        print(deref(a))
+
 def test_iteration_over_reversed_list(py_v):
     """
     >>> test_iteration_over_reversed_list([2, 4, 6])

From a9bfacdcf5358e9d5a1d3c8ab0dd2eff6f18018a Mon Sep 17 00:00:00 2001
From: Isuru Fernando <isuruf@gmail.com>
Date: Mon, 12 Jun 2023 14:07:37 -0500
Subject: [PATCH 3/4] Fix multimap too

---
 Cython/Includes/libcpp/map.pxd | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/Cython/Includes/libcpp/map.pxd b/Cython/Includes/libcpp/map.pxd
index 2c2c5c82adf..eb739509ac1 100644
--- a/Cython/Includes/libcpp/map.pxd
+++ b/Cython/Includes/libcpp/map.pxd
@@ -177,7 +177,9 @@ cdef extern from "<map>" namespace "std" nogil:
         cppclass reverse_iterator:
             reverse_iterator() except +
             reverse_iterator(reverse_iterator&) except +
-            value_type& operator*()
+            # correct would be value_type& but this does not work
+            # well with cython's code gen
+            pair[T, U]& operator*()
             reverse_iterator operator++()
             reverse_iterator operator--()
             reverse_iterator operator++(int)
@@ -190,7 +192,9 @@ cdef extern from "<map>" namespace "std" nogil:
             const_reverse_iterator() except +
             const_reverse_iterator(reverse_iterator&) except +
             operator=(reverse_iterator&) except +
-            const value_type& operator*()
+            # correct would be const value_type& but this does not work
+            # well with cython's code gen
+            const pair[T, U]& operator*()
             const_reverse_iterator operator++()
             const_reverse_iterator operator--()
             const_reverse_iterator operator++(int)

From 0528cd937e6d4606eb0902ee8d8db672ee7f88fe Mon Sep 17 00:00:00 2001
From: Isuru Fernando <isuruf@gmail.com>
Date: Mon, 12 Jun 2023 17:50:41 -0500
Subject: [PATCH 4/4] Fix test

---
 tests/run/cpp_iterators.pyx | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/tests/run/cpp_iterators.pyx b/tests/run/cpp_iterators.pyx
index 424168fa825..57d2716bea5 100644
--- a/tests/run/cpp_iterators.pyx
+++ b/tests/run/cpp_iterators.pyx
@@ -277,18 +277,17 @@ cdef extern from *:
     # TODO: support make_shared[const int]
     shared_ptr[const int] make_shared_const_int "std::make_shared<const int>"(int)
 
-def test_iteration_over_shared_const_ptr_set(py_v):
+def test_iteration_over_shared_const_ptr_vector(py_v):
     """
-    >>> test_iteration_over_shared_const_ptr_set[2, 4, 6])
-    6
-    4
+    >>> test_iteration_over_shared_const_ptr_vector([2, 4, 6])
     2
+    4
+    6
     """
-    cdef stdset[shared_ptr[const int]] s
+    cdef vector[shared_ptr[const int]] s
     cdef int i
-    for e in py_v:
-        i = e
-        s.insert(make_shared_const_int(i))
+    for i in py_v:
+        s.push_back(make_shared_const_int(i))
 
     cdef shared_ptr[const int] a
     for a in s: