Skip to content

Commit eb79fa0

Browse files
authored
Add C and Fortran support for remove/discard (pyccel#2118)
Add C and Fortran support for set methods `remove`/`discard`. Fixes pyccel#1921 Blocked by pyccel#2102
1 parent 286e1fc commit eb79fa0

File tree

5 files changed

+30
-18
lines changed

5 files changed

+30
-18
lines changed

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ All notable changes to this project will be documented in this file.
1313
- #1700 : Add Python support for list method `sort()`.
1414
- #1696 : Add Python support for list method `copy()`.
1515
- #1693 : Add Python support for list method `remove()`.
16-
- #1750 : Add Python support for set method `remove()`.
17-
- #1743 : Add Python support for set method `discard()`.
1816
- #1893 : Add Python support for set initialisation with `set()`.
1917
- #1895 : Add Python support for dict initialisation with `{}`.
2018
- #1895 : Add Python support for dict initialisation with `dict()`.
@@ -44,6 +42,8 @@ All notable changes to this project will be documented in this file.
4442
- #1917 : Add C and Fortran support for set method `add()`.
4543
- #1918 : Add support for set method `clear()`.
4644
- #1918 : Add support for set method `copy()`.
45+
- #1743 : Add support for set method `discard()`.
46+
- #1750 : Add support for set method `remove()`.
4747
- #1753 : Add support for set method `union()`.
4848
- #1754 : Add support for set method `update()`.
4949
- #1744 : Add support for set method `intersection()`.

docs/builtin-functions.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,14 @@ Python contains a limited number of builtin functions defined [here](https://doc
101101
| **`copy`** | **Yes** |
102102
| `difference` | No |
103103
| `difference_update` | No |
104-
| `discard` | Python-only |
105-
| `intersection` | **Yes** |
106-
| `intersection_update` | **Yes** |
104+
| **`discard`** | **Yes** |
105+
| **`intersection`** | **Yes** |
106+
| **`intersection_update`** | **Yes** |
107107
| `isdisjoint` | No |
108108
| `issubset` | No |
109109
| `issuperset` | No |
110110
| **`pop`** | **Yes** |
111-
| `remove` | Python-only |
111+
| **`remove`** | **Yes** |
112112
| `symmetric_difference` | No |
113113
| `symmetric_difference_update` | No |
114114
| **`union`** | **Yes** |

pyccel/codegen/printing/ccode.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2804,6 +2804,12 @@ def _print_SetIntersectionUpdate(self, expr):
28042804
return ''.join(f'{var_type}_intersection_update({set_var}, {self._print(ObjectAddress(a))});\n' \
28052805
for a in expr.args)
28062806

2807+
def _print_SetDiscard(self, expr):
2808+
var_type = self.get_c_type(expr.set_variable.class_type)
2809+
set_var = self._print(ObjectAddress(expr.set_variable))
2810+
arg_val = self._print(expr.args[0])
2811+
return f'{var_type}_erase({set_var}, {arg_val});\n'
2812+
28072813
#=================== MACROS ==================
28082814

28092815
def _print_MacroShape(self, expr):

pyccel/codegen/printing/fcode.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,6 +1431,12 @@ def _print_SetIntersectionUpdate(self, expr):
14311431
return ''.join(f'call {type_name}_intersection_update({var_code}, {self._print(arg)})\n' \
14321432
for arg in expr.args)
14331433

1434+
def _print_SetDiscard(self, expr):
1435+
var = self._print(expr.set_variable)
1436+
val = self._print(expr.args[0])
1437+
success = self.scope.get_temporary_variable(PythonNativeInt())
1438+
return f'{success} = {var} % erase_value({val})\n'
1439+
14341440
#========================== Numpy Elements ===============================#
14351441

14361442
def _print_NumpySum(self, expr):

tests/epyccel/test_epyccel_sets.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -119,62 +119,62 @@ def copy_complex():
119119
assert python_result[0] == pyccel_result[0]
120120
assert set(python_result[1:]) == set(pyccel_result[1:])
121121

122-
def test_remove_complex(python_only_language):
122+
def test_remove_complex(language):
123123
def remove_complex():
124124
se = {1j, 3j, 8j}
125125
se.remove(3j)
126126
return se
127-
epyccel_remove = epyccel(remove_complex, language = python_only_language)
127+
epyccel_remove = epyccel(remove_complex, language = language)
128128
pyccel_result = epyccel_remove()
129129
python_result = remove_complex()
130130
assert python_result == pyccel_result
131131

132-
def test_remove_int(python_only_language):
132+
def test_remove_int(language):
133133
def remove_int():
134134
se = {2, 4, 9}
135135
se.remove(4)
136136
return se
137-
epyccel_remove = epyccel(remove_int, language = python_only_language)
137+
epyccel_remove = epyccel(remove_int, language = language)
138138
pyccel_result = epyccel_remove()
139139
python_result = remove_int()
140140
assert python_result == pyccel_result
141141

142-
def test_remove_float(python_only_language):
142+
def test_remove_float(language):
143143
def remove_float():
144144
se = {5.7, 2.4, 8.1}
145145
se.remove(8.1)
146146
return se
147-
epyccel_remove = epyccel(remove_float, language = python_only_language)
147+
epyccel_remove = epyccel(remove_float, language = language)
148148
pyccel_result = epyccel_remove()
149149
python_result = remove_float()
150150
assert python_result == pyccel_result
151151

152-
def test_Discard_int(python_only_language):
152+
def test_Discard_int(language):
153153
def Discard_int():
154154
se = {2.7, 4.3, 9.2}
155155
se.discard(4.3)
156156
return se
157-
epyccel_remove = epyccel(Discard_int, language = python_only_language)
157+
epyccel_remove = epyccel(Discard_int, language = language)
158158
pyccel_result = epyccel_remove()
159159
python_result = Discard_int()
160160
assert python_result == pyccel_result
161161

162-
def test_Discard_complex(python_only_language):
162+
def test_Discard_complex(language):
163163
def Discard_complex():
164164
se = {2j, 5j, 3j, 7j}
165165
se.discard(5j)
166166
return se
167-
epyccel_remove = epyccel(Discard_complex, language = python_only_language)
167+
epyccel_remove = epyccel(Discard_complex, language = language)
168168
pyccel_result = epyccel_remove()
169169
python_result = Discard_complex()
170170
assert python_result == pyccel_result
171171

172-
def test_Discard_wrong_arg(python_only_language):
172+
def test_Discard_wrong_arg(language):
173173
def Discard_wrong_arg():
174174
se = {4.7, 1.3, 8.2}
175175
se.discard(8.6)
176176
return se
177-
epyccel_remove = epyccel(Discard_wrong_arg, language = python_only_language)
177+
epyccel_remove = epyccel(Discard_wrong_arg, language = language)
178178
pyccel_result = epyccel_remove()
179179
python_result = Discard_wrong_arg()
180180
assert python_result == pyccel_result

0 commit comments

Comments
 (0)