l0n0lc 0.8.4__py3-none-any.whl → 1.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. l0n0lc/Py/350/275/254Cpp/350/275/254/350/257/221/345/231/250.py +579 -0
  2. l0n0lc/__init__.py +75 -6
  3. l0n0lc/aot/347/274/226/350/257/221.py +679 -0
  4. l0n0lc/ast/350/256/277/351/227/256/350/200/205.py +599 -0
  5. l0n0lc/cpp/347/261/273/345/236/213.py +330 -0
  6. l0n0lc/cpp/347/274/226/350/257/221/345/231/250.py +317 -0
  7. l0n0lc/simd/344/274/230/345/214/226.py +260 -0
  8. l0n0lc/std_map.py +153 -0
  9. l0n0lc/std_set.py +185 -0
  10. l0n0lc/std_vector.py +96 -0
  11. l0n0lc//344/273/243/347/240/201/344/274/230/345/214/226.py +302 -0
  12. l0n0lc//344/273/243/347/240/201/347/224/237/346/210/220.py +546 -0
  13. l0n0lc//344/276/235/350/265/226/346/263/250/345/205/245.py +155 -0
  14. l0n0lc//345/215/263/346/227/266/347/274/226/350/257/221.py +192 -0
  15. l0n0lc//345/217/230/351/207/217/347/256/241/347/220/206/345/231/250.py +123 -0
  16. l0n0lc//345/237/272/347/241/200/346/230/240/345/260/204.py +103 -0
  17. l0n0lc//345/237/272/347/241/200/346/267/267/345/205/245.py +147 -0
  18. l0n0lc//345/256/271/345/231/250/346/236/204/345/273/272/345/231/250.py +214 -0
  19. l0n0lc//345/267/245/345/205/267.py +285 -0
  20. l0n0lc//345/271/266/350/241/214/347/274/226/350/257/221/345/231/250.py +412 -0
  21. l0n0lc//345/274/202/345/270/270.py +474 -0
  22. l0n0lc//346/225/260/347/273/204/345/257/271/350/261/241/346/261/240.py +248 -0
  23. l0n0lc//346/226/207/344/273/266/347/256/241/347/220/206/345/231/250.py +286 -0
  24. l0n0lc//346/227/245/345/277/227/345/267/245/345/205/267.py +152 -0
  25. l0n0lc//347/261/273/345/236/213/346/216/250/346/226/255/345/267/245/345/205/267.py +352 -0
  26. l0n0lc//347/261/273/345/236/213/350/275/254/346/215/242.py +210 -0
  27. l0n0lc//347/261/273/346/224/257/346/214/201.py +372 -0
  28. l0n0lc//347/274/226/350/257/221/344/270/212/344/270/213/346/226/207.py +132 -0
  29. l0n0lc//347/274/226/350/257/221/347/256/241/347/220/206/345/231/250.py +171 -0
  30. l0n0lc//350/241/250/350/276/276/345/274/217/345/244/204/347/220/206.py +462 -0
  31. l0n0lc//350/275/254/350/257/221/345/231/250/345/267/245/345/205/267.py +49 -0
  32. l0n0lc//350/277/220/350/241/214/346/227/266/345/212/240/350/275/275.py +217 -0
  33. l0n0lc//351/200/232/347/224/250/345/267/245/345/205/267.py +149 -0
  34. l0n0lc-1.0.0.dist-info/METADATA +363 -0
  35. l0n0lc-1.0.0.dist-info/RECORD +39 -0
  36. {l0n0lc-0.8.4.dist-info → l0n0lc-1.0.0.dist-info}/WHEEL +1 -1
  37. l0n0lc-1.0.0.dist-info/entry_points.txt +2 -0
  38. {l0n0lc-0.8.4.dist-info → l0n0lc-1.0.0.dist-info}/licenses/LICENSE +0 -0
  39. l0n0lc/StdList.py +0 -24
  40. l0n0lc/StdMap.py +0 -21
  41. l0n0lc/c/345/237/272/347/241/200/345/244/204/347/220/206.py +0 -207
  42. l0n0lc/jit.py +0 -604
  43. l0n0lc//347/274/226/350/257/221.py +0 -58
  44. l0n0lc//351/200/232/347/224/250.py +0 -134
  45. l0n0lc-0.8.4.dist-info/METADATA +0 -241
  46. l0n0lc-0.8.4.dist-info/RECORD +0 -12
  47. {l0n0lc-0.8.4.dist-info → l0n0lc-1.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,260 @@
1
+ """
2
+ SIMD (Single Instruction Multiple Data) 向量化优化模块
3
+
4
+ 提供 SIMD 指令的自动检测和向量化优化支持
5
+ """
6
+
7
+ import os
8
+ import subprocess
9
+ import platform
10
+ from typing import Optional, List, Dict, Any
11
+ from .日志工具 import 日志
12
+
13
+
14
+ class CPU特性:
15
+ """CPU SIMD 特性检测"""
16
+
17
+ def __init__(self):
18
+ self._特性缓存: Optional[Dict[str, bool]] = None
19
+
20
+ def 检测特性(self) -> Dict[str, bool]:
21
+ """
22
+ 检测 CPU 支持的 SIMD 特性
23
+
24
+ Returns:
25
+ 特性字典,包含各种 SIMD 扩展的支持情况
26
+ """
27
+ if self._特性缓存 is not None:
28
+ return self._特性缓存
29
+
30
+ 特性 = {
31
+ 'SSE': False,
32
+ 'SSE2': False,
33
+ 'SSE3': False,
34
+ 'SSE4_1': False,
35
+ 'SSE4_2': False,
36
+ 'AVX': False,
37
+ 'AVX2': False,
38
+ 'AVX512F': False,
39
+ 'NEON': False, # ARM
40
+ }
41
+
42
+ 系统 = platform.system()
43
+
44
+ if 系统 == 'Linux':
45
+ # Linux: 读取 /proc/cpuinfo
46
+ try:
47
+ with open('/proc/cpuinfo', 'r') as f:
48
+ 内容 = f.read()
49
+ 特性.update(self._从cpuinfo解析(内容))
50
+ except (FileNotFoundError, PermissionError, OSError) as e:
51
+ 日志.调试(f"无法读取 /proc/cpuinfo: {e}")
52
+ except Exception as e:
53
+ 日志.调试(f"解析 cpuinfo 时出错: {e}")
54
+
55
+ # 尝试通过 lscpu 获取更准确的信息
56
+ try:
57
+ 结果 = subprocess.run(['lscpu'], capture_output=True, text=True, timeout=5)
58
+ if 结果.returncode == 0:
59
+ 特性.update(self._从lscpu解析(结果.stdout))
60
+ except (subprocess.TimeoutExpired, FileNotFoundError, PermissionError) as e:
61
+ 日志.调试(f"无法执行 lscpu: {e}")
62
+ except Exception as e:
63
+ 日志.调试(f"解析 lscpu 输出时出错: {e}")
64
+
65
+ elif 系统 == 'Darwin': # macOS
66
+ # macOS: 使用 sysctl
67
+ try:
68
+ 结果 = subprocess.run(['sysctl', '-a'], capture_output=True, text=True, timeout=5)
69
+ if 结果.returncode == 0:
70
+ 特性.update(self._从sysctl解析(结果.stdout))
71
+ except (subprocess.TimeoutExpired, FileNotFoundError, PermissionError) as e:
72
+ 日志.调试(f"无法执行 sysctl: {e}")
73
+ except Exception as e:
74
+ 日志.调试(f"解析 sysctl 输出时出错: {e}")
75
+
76
+ elif 系统 == 'Windows':
77
+ # Windows: 使用 wmic 或 systeminfo
78
+ try:
79
+ 结果 = subprocess.run(
80
+ ['wmic', 'cpu', 'get', 'DataWidth', '/format:list'],
81
+ capture_output=True, text=True, timeout=5
82
+ )
83
+ if 结果.returncode == 0:
84
+ # Windows 上的简化检测,假设支持 SSE2+
85
+ 特性['SSE2'] = True
86
+ except (subprocess.TimeoutExpired, FileNotFoundError, PermissionError) as e:
87
+ 日志.调试(f"无法执行 wmic: {e}")
88
+ except Exception as e:
89
+ 日志.调试(f"解析 wmic 输出时出错: {e}")
90
+
91
+ # ARM 架构特殊处理
92
+ 机器 = platform.machine()
93
+ if 机器 and ('arm' in 机器.lower() or 'aarch64' in 机器.lower()):
94
+ 特性['NEON'] = True
95
+
96
+ self._特性缓存 = 特性
97
+ return 特性
98
+
99
+ def _从cpuinfo解析(self, 内容: str) -> Dict[str, bool]:
100
+ """从 /proc/cpuinfo 解析 CPU 特性"""
101
+ 特性 = {}
102
+
103
+ for 行 in 内容.split('\n'):
104
+ if 行.startswith('flags'):
105
+ 标志列表 = 行.split(':', 1)[1].strip().split()
106
+ 标志 = set(标志列表)
107
+
108
+ 特性['SSE'] = 'sse' in 标志
109
+ 特性['SSE2'] = 'sse2' in 标志
110
+ 特性['SSE3'] = 'sse3' in 标志 or 'pni' in 标志
111
+ 特性['SSE4_1'] = 'sse4_1' in 标志
112
+ 特性['SSE4_2'] = 'sse4_2' in 标志
113
+ 特性['AVX'] = 'avx' in 标志
114
+ 特性['AVX2'] = 'avx2' in 标志
115
+ 特性['AVX512F'] = 'avx512f' in 标志
116
+ break
117
+
118
+ return 特性
119
+
120
+ def _从lscpu解析(self, 内容: str) -> Dict[str, bool]:
121
+ """从 lscpu 输出解析 CPU 特性"""
122
+ 特性 = {}
123
+
124
+ for 行 in 内容.split('\n'):
125
+ if 'Flags:' in 行:
126
+ 标志列表 = 行.split(':', 1)[1].strip().split()
127
+ 标志 = set(标志列表)
128
+
129
+ 特性['SSE'] = 'sse' in 标志
130
+ 特性['SSE2'] = 'sse2' in 标志
131
+ 特性['SSE3'] = 'sse3' in 标志 or 'pni' in 标志
132
+ 特性['SSE4_1'] = 'sse4_1' in 标志
133
+ 特性['SSE4_2'] = 'sse4_2' in 标志
134
+ 特性['AVX'] = 'avx' in 标志
135
+ 特性['AVX2'] = 'avx2' in 标志
136
+ 特性['AVX512F'] = 'avx512f' in 标志
137
+ break
138
+
139
+ return 特性
140
+
141
+ def _从sysctl解析(self, 内容: str) -> Dict[str, bool]:
142
+ """从 sysctl 输出解析 CPU 特性(macOS)"""
143
+ 特性 = {}
144
+
145
+ # macOS 通常在较新的 Intel 处理器上支持 AVX
146
+ if 'machdep.cpu.features' in 内容:
147
+ for 行 in 内容.split('\n'):
148
+ if 'machdep.cpu.features:' in 行 or 'machdep.cpu.extfeatures:' in 行:
149
+ 标志列表 = 行.split(':', 1)[1].strip().split()
150
+ 标志 = set(标志列表)
151
+
152
+ 特性['SSE'] = 'SSE' in 标志
153
+ 特性['SSE2'] = 'SSE2' in 标志
154
+ 特性['SSE3'] = 'SSE3' in 标志
155
+ 特性['SSE4_1'] = 'SSE4.1' in 标志 or 'SSE4_1' in 标志
156
+ 特性['SSE4_2'] = 'SSE4.2' in 标志 or 'SSE4_2' in 标志
157
+ 特性['AVX'] = 'AVX' in 标志
158
+ 特性['AVX2'] = 'AVX2' in 标志
159
+ 特性['AVX512F'] = 'AVX512F' in 标志 or 'AVX512' in 标志
160
+ break
161
+
162
+ return 特性
163
+
164
+ def 获取最佳SIMD指令集(self) -> str:
165
+ """
166
+ 获取 CPU 支持的最佳 SIMD 指令集
167
+
168
+ Returns:
169
+ 最佳指令集名称 (SSE2, SSE4_2, AVX2, AVX512F, NEON)
170
+ """
171
+ 特性 = self.检测特性()
172
+
173
+ 优先级 = ['AVX512F', 'AVX2', 'SSE4_2', 'SSE2', 'NEON']
174
+
175
+ for 指令集 in 优先级:
176
+ if 特性.get(指令集, False):
177
+ return 指令集
178
+
179
+ return 'SSE2' # 默认回退
180
+
181
+
182
+ # 全局单例
183
+ _CPU特性实例: Optional[CPU特性] = None
184
+
185
+
186
+ def 获取CPU特性() -> CPU特性:
187
+ """获取 CPU 特性检测器单例"""
188
+ global _CPU特性实例
189
+ if _CPU特性实例 is None:
190
+ _CPU特性实例 = CPU特性()
191
+ return _CPU特性实例
192
+
193
+
194
+ def 获取最佳SIMD指令集() -> str:
195
+ """获取当前 CPU 支持的最佳 SIMD 指令集"""
196
+ return 获取CPU特性().获取最佳SIMD指令集()
197
+
198
+
199
+ def 获取SIMD编译标志(指令集: Optional[str] = None) -> List[str]:
200
+ """
201
+ 获取 SIMD 编译标志
202
+
203
+ Args:
204
+ 指令集: 指定指令集,None 表示自动检测
205
+
206
+ Returns:
207
+ 编译标志列表
208
+ """
209
+ if 指令集 is None:
210
+ 指令集 = 获取最佳SIMD指令集()
211
+
212
+ 标志映射 = {
213
+ 'SSE2': ['-msse2', '-mfpmath=sse'],
214
+ 'SSE4_2': ['-msse4.2', '-mfpmath=sse'],
215
+ 'AVX': ['-mavx'],
216
+ 'AVX2': ['-mavx2', '-mfma'],
217
+ 'AVX512F': ['-mavx512f', '-mavx512vl'],
218
+ 'NEON': [], # ARM NEON 通常默认启用
219
+ }
220
+
221
+ return 标志映射.get(指令集, ['-msse2'])
222
+
223
+
224
+ def 启用自动向量化标志() -> List[str]:
225
+ """
226
+ 获取启用编译器自动向量化的标志
227
+
228
+ Returns:
229
+ 编译标志列表
230
+ """
231
+ return ['-ftree-vectorize', '-ffast-math']
232
+
233
+
234
+ def 获取向量化宏定义(指令集: Optional[str] = None) -> Dict[str, str]:
235
+ """
236
+ 获取 SIMD 向量化相关的宏定义
237
+
238
+ Args:
239
+ 指令集: 指定指令集,None 表示自动检测
240
+
241
+ Returns:
242
+ 宏定义字典
243
+ """
244
+ if 指令集 is None:
245
+ 指令集 = 获取最佳SIMD指令集()
246
+
247
+ 宏定义 = {
248
+ 'L0N0LC_USE_SIMD': '1',
249
+ }
250
+
251
+ if 指令集 == 'AVX2':
252
+ 宏定义['L0N0LC_AVX2'] = '1'
253
+ elif 指令集 == 'AVX512F':
254
+ 宏定义['L0N0LC_AVX512F'] = '1'
255
+ elif 指令集 == 'NEON':
256
+ 宏定义['L0N0LC_NEON'] = '1'
257
+ else:
258
+ 宏定义['L0N0LC_SSE'] = '1'
259
+
260
+ return 宏定义
l0n0lc/std_map.py ADDED
@@ -0,0 +1,153 @@
1
+
2
+ from .cpp类型 import 字典初始化列表, C变量
3
+ from .工具 import 转C字符串
4
+ from .转译器工具 import 获取当前transpiler
5
+
6
+
7
+ class 标准无序映射(C变量):
8
+ def __init__(
9
+ self,
10
+ 初始化列表: 字典初始化列表,
11
+ 名称: str,
12
+ 是否参数: bool) -> None:
13
+ self.初始化列表 = 初始化列表
14
+ super().__init__(
15
+ f'std::unordered_map<{初始化列表.键类型名}, {初始化列表.值类型名}>', 名称, 是否参数)
16
+
17
+ def __getitem__(self, key):
18
+ return f'{self}[{转C字符串(key)}]'
19
+
20
+ def __setitem__(self, key, value):
21
+ left = f'{self}[{转C字符串(key)}]'
22
+ right = 转C字符串(value)
23
+ return f'{left} = {right};'
24
+
25
+ def _获取transpiler(self):
26
+ """获取当前transpiler实例来添加必要的头文件"""
27
+ return 获取当前transpiler()
28
+
29
+ # Python dict 方法映射到 C++ std::unordered_map
30
+ def get(self, key, default=None):
31
+ """安全获取值,如果键不存在则返回默认值"""
32
+ if default is None:
33
+ return f"({self}.find({转C字符串(key)}) != {self}.end() ? {self}.at({转C字符串(key)}) : decltype({self}.at({转C字符串(key)})){{}})"
34
+ else:
35
+ return f"({self}.find({转C字符串(key)}) != {self}.end() ? {self}.at({转C字符串(key)}) : {转C字符串(default)})"
36
+
37
+ def pop(self, key, default=None):
38
+ """移除并返回指定键的值"""
39
+ transpiler = self._获取transpiler()
40
+ if transpiler:
41
+ transpiler.包含头文件.add("<utility>") # for std::move
42
+ transpiler.包含头文件.add("<stdexcept>") # for std::out_of_range
43
+
44
+ if default is None:
45
+ return f"""
46
+ [&]{{
47
+ auto it = {self}.find({转C字符串(key)});
48
+ if (it != {self}.end()) {{
49
+ auto value = std::move(it->second);
50
+ {self}.erase(it);
51
+ return value;
52
+ }}
53
+ throw std::out_of_range("Key not found");
54
+ }}()
55
+ """.strip()
56
+ else:
57
+ return f"""
58
+ [&]{{
59
+ auto it = {self}.find({转C字符串(key)});
60
+ if (it != {self}.end()) {{
61
+ auto value = std::move(it->second);
62
+ {self}.erase(it);
63
+ return value;
64
+ }}
65
+ return {转C字符串(default)};
66
+ }}()
67
+ """.strip()
68
+
69
+ def popitem(self):
70
+ """移除并返回一个键值对(C++中返回第一个元素)"""
71
+ transpiler = self._获取transpiler()
72
+ if transpiler:
73
+ transpiler.包含头文件.add("<utility>") # for std::pair
74
+ transpiler.包含头文件.add("<stdexcept>") # for std::out_of_range
75
+
76
+ return f"""
77
+ [&]{{
78
+ if (!{self}.empty()) {{
79
+ auto it = {self}.begin();
80
+ auto item = std::make_pair(it->first, std::move(it->second));
81
+ {self}.erase(it);
82
+ return item;
83
+ }}
84
+ throw std::out_of_range("Dictionary is empty");
85
+ }}()
86
+ """.strip()
87
+
88
+ def setdefault(self, key, default):
89
+ """设置默认值,如果键不存在则设置并返回默认值"""
90
+ return f"""
91
+ [&]{{
92
+ auto result = {self}.emplace({转C字符串(key)}, {转C字符串(default)});
93
+ if (result.second) {{
94
+ return result.first->second;
95
+ }}
96
+ return {self}.at({转C字符串(key)});
97
+ }}()
98
+ """.strip()
99
+
100
+ def update(self, other_dict):
101
+ """用另一个字典更新当前字典"""
102
+ return f"""
103
+ [&]{{
104
+ for(const auto& pair : {other_dict}) {{
105
+ {self}[pair.first] = pair.second;
106
+ }}
107
+ return {self}.size();
108
+ }}()
109
+ """.strip()
110
+
111
+ def clear(self):
112
+ """清空字典"""
113
+ return f"{self}.clear();"
114
+
115
+ def size(self):
116
+ """返回字典大小(len() 函数会使用这个)"""
117
+ return f"{self}.size()"
118
+
119
+ def empty(self):
120
+ """检查字典是否为空"""
121
+ return f"{self}.empty()"
122
+
123
+ def contains(self, key):
124
+ """检查键是否存在(用于 'in' 操作符)"""
125
+ return f"{self}.find({转C字符串(key)}) != {self}.end()"
126
+
127
+ def keys(self):
128
+ """返回所有键的视图(用于遍历)"""
129
+ return self
130
+
131
+ def values(self):
132
+ """返回所有值的视图(用于遍历)"""
133
+ return self
134
+
135
+ def items(self):
136
+ """返回所有键值对的视图(用于遍历)"""
137
+ return self
138
+
139
+ def begin(self):
140
+ """返回指向开始位置的迭代器(用于内部操作)"""
141
+ return f"{self}.begin()"
142
+
143
+ def end(self):
144
+ """返回指向结束位置的迭代器(用于内部操作)"""
145
+ return f"{self}.end()"
146
+
147
+ def find(self, key):
148
+ """查找指定键的迭代器"""
149
+ return f"{self}.find({转C字符串(key)})"
150
+
151
+ def erase(self, iterator_or_key):
152
+ """删除指定位置的元素(内部使用)"""
153
+ return f"{self}.erase({iterator_or_key})"
l0n0lc/std_set.py ADDED
@@ -0,0 +1,185 @@
1
+ from .cpp类型 import 集合初始化列表, C变量
2
+ from .转译器工具 import 获取当前transpiler
3
+
4
+
5
+ class 标准集合(C变量):
6
+ def __init__(self, 初始化列表: 集合初始化列表, 名称: str, 是否参数: bool) -> None:
7
+ self.初始化列表 = 初始化列表
8
+ super().__init__(f"std::unordered_set<{初始化列表.类型名}>", 名称, 是否参数)
9
+
10
+ def add(self, value):
11
+ return f"{self}.insert({str(value)});"
12
+
13
+ def remove(self, value):
14
+ return f"{self}.erase({str(value)});"
15
+
16
+ def update(self, other_set):
17
+ """将另一个集合的所有元素添加到当前集合(就地修改)"""
18
+ return f"""
19
+ [&]{{
20
+ for(const auto& elem : {other_set}) {{
21
+ {self}.insert(elem);
22
+ }}
23
+ return {self};
24
+ }}()
25
+ """.strip()
26
+
27
+ def __contains__(self, item):
28
+ # This will be used in 'item in set'
29
+ # But transpiler handles 'in' via Compare?
30
+ # If transpiler calls this, fine.
31
+ return f"{self}.find({str(item)}) != {self}.end()"
32
+
33
+ def _获取transpiler(self):
34
+ """获取当前transpiler实例来添加必要的头文件"""
35
+ return 获取当前transpiler()
36
+
37
+ # Python set 方法映射到 C++ std::unordered_set
38
+ def clear(self):
39
+ """清空集合"""
40
+ return f"{self}.clear();"
41
+
42
+ def size(self):
43
+ """返回集合大小(len() 函数会使用这个)"""
44
+ return f"{self}.size()"
45
+
46
+ def empty(self):
47
+ """检查集合是否为空"""
48
+ return f"{self}.empty()"
49
+
50
+ def begin(self):
51
+ """返回指向开始位置的迭代器(用于内部操作)"""
52
+ return f"{self}.begin()"
53
+
54
+ def end(self):
55
+ """返回指向结束位置的迭代器(用于内部操作)"""
56
+ return f"{self}.end()"
57
+
58
+ def find(self, value):
59
+ """查找指定值的迭代器"""
60
+ return f"{self}.find({str(value)})"
61
+
62
+ def erase(self, value_or_iterator):
63
+ """删除指定值或迭代器位置的元素"""
64
+ return f"{self}.erase({value_or_iterator})"
65
+
66
+ def union(self, other_set):
67
+ """返回两个集合的并集"""
68
+ transpiler = self._获取transpiler()
69
+ if transpiler:
70
+ transpiler.包含头文件.add("<unordered_set>")
71
+
72
+ return f"""
73
+ [&]{{
74
+ auto result = {self};
75
+ for(const auto& elem : {other_set}) {{
76
+ result.insert(elem);
77
+ }}
78
+ return result;
79
+ }}()
80
+ """.strip()
81
+
82
+ def intersection(self, other_set):
83
+ """返回两个集合的交集"""
84
+ transpiler = self._获取transpiler()
85
+ if transpiler:
86
+ transpiler.包含头文件.add("<unordered_set>")
87
+
88
+ return f"""
89
+ [&]{{
90
+ decltype({self}) result;
91
+ for(const auto& elem : {self}) {{
92
+ if ({other_set}.find(elem) != {other_set}.end()) {{
93
+ result.insert(elem);
94
+ }}
95
+ }}
96
+ return result;
97
+ }}()
98
+ """.strip()
99
+
100
+ def difference(self, other_set):
101
+ """返回两个集合的差集"""
102
+ transpiler = self._获取transpiler()
103
+ if transpiler:
104
+ transpiler.包含头文件.add("<unordered_set>")
105
+
106
+ return f"""
107
+ [&]{{
108
+ decltype({self}) result;
109
+ for(const auto& elem : {self}) {{
110
+ if ({other_set}.find(elem) == {other_set}.end()) {{
111
+ result.insert(elem);
112
+ }}
113
+ }}
114
+ return result;
115
+ }}()
116
+ """.strip()
117
+
118
+ def issubset(self, other_set):
119
+ """检查当前集合是否为另一个集合的子集"""
120
+ return f"""
121
+ [&]{{
122
+ for(const auto& elem : {self}) {{
123
+ if ({other_set}.find(elem) == {other_set}.end()) {{
124
+ return false;
125
+ }}
126
+ }}
127
+ return true;
128
+ }}()
129
+ """.strip()
130
+
131
+ def issuperset(self, other_set):
132
+ """检查当前集合是否为另一个集合的超集"""
133
+ return f"""
134
+ [&]{{
135
+ for(const auto& elem : {other_set}) {{
136
+ if ({self}.find(elem) == {self}.end()) {{
137
+ return false;
138
+ }}
139
+ }}
140
+ return true;
141
+ }}()
142
+ """.strip()
143
+
144
+ def isdisjoint(self, other_set):
145
+ """检查两个集合是否不相交"""
146
+ return f"""
147
+ [&]{{
148
+ for(const auto& elem : {self}) {{
149
+ if ({other_set}.find(elem) != {other_set}.end()) {{
150
+ return false;
151
+ }}
152
+ }}
153
+ return true;
154
+ }}()
155
+ """.strip()
156
+
157
+ def discard(self, value):
158
+ """移除元素,如果元素不存在也不报错"""
159
+ return f"{self}.erase({str(value)});"
160
+
161
+ def pop(self):
162
+ """移除并返回一个任意元素"""
163
+ transpiler = self._获取transpiler()
164
+ if transpiler:
165
+ transpiler.包含头文件.add("<stdexcept>") # for std::out_of_range
166
+
167
+ return f"""
168
+ [&]{{
169
+ if (!{self}.empty()) {{
170
+ auto it = {self}.begin();
171
+ auto value = *it;
172
+ {self}.erase(it);
173
+ return value;
174
+ }}
175
+ throw std::out_of_range("Set is empty");
176
+ }}()
177
+ """.strip()
178
+
179
+ def copy(self):
180
+ """返回集合的浅拷贝"""
181
+ return f"{self}"
182
+
183
+ def __bool__(self):
184
+ """支持布尔上下文(用于 if not s 等)"""
185
+ return f"!{self}.empty()"
l0n0lc/std_vector.py ADDED
@@ -0,0 +1,96 @@
1
+ from .cpp类型 import C变量, Cpp类型, 列表初始化列表
2
+ from .转译器工具 import 获取当前transpiler
3
+
4
+
5
+ class 标准列表(C变量):
6
+ def __init__(self, 初始化列表: 列表初始化列表, 名称: str, 是否参数: bool) -> None:
7
+ self.初始化列表 = 初始化列表
8
+ if 初始化列表.类型名 == Cpp类型.任意:
9
+ super().__init__(f"std::vector<{初始化列表.类型名}>", 名称, 是否参数)
10
+ else:
11
+ super().__init__(f"std::vector<{初始化列表.类型名}>", 名称, 是否参数)
12
+
13
+ def __getitem__(self, key):
14
+ return f"{self}[{key}]"
15
+
16
+ def __setitem__(self, key, value):
17
+ return f"{self}[{key}] = {value};"
18
+
19
+ def 初始化代码(self, initial_value, cast_type: str | None = None):
20
+ """生成列表变量声明和初始化代码"""
21
+ # 对于列表,直接使用初始化列表语法,不需要类型转换
22
+ return f"{self.类型名} {self.C名称} {initial_value};"
23
+
24
+ def _获取transpiler(self):
25
+ """获取当前transpiler实例来添加必要的头文件"""
26
+ return 获取当前transpiler()
27
+
28
+ # Python list 方法映射到 C++ std::vector
29
+ def append(self, value):
30
+ """在列表末尾添加元素"""
31
+ return f"{self}.push_back({value});"
32
+
33
+ def extend(self, other_list):
34
+ """扩展列表,添加另一个列表的所有元素"""
35
+ return f"""
36
+ [&]{{
37
+ for(const auto& elem : {other_list}) {{
38
+ {self}.push_back(elem);
39
+ }}
40
+ return {self}.size();
41
+ }}()
42
+ """.strip()
43
+
44
+ def insert(self, index, value):
45
+ """在指定位置插入元素"""
46
+ return f"{self}.insert({self}.begin() + {index}, {value});"
47
+
48
+ def pop(self, index=-1):
49
+ """移除并返回指定位置的元素"""
50
+ if index == -1:
51
+ # 默认移除最后一个元素
52
+ return f"[&]{{ auto last_elem = {self}.back(); {self}.pop_back(); return last_elem; }}()"
53
+ else:
54
+ # 移除指定位置的元素
55
+ return f"[&]{{ auto elem = {self}[{index}]; {self}.erase({self}.begin() + {index}); return elem; }}()"
56
+
57
+ def remove(self, value):
58
+ """移除第一个匹配的元素"""
59
+ # 添加algorithm头文件以支持std::find
60
+ transpiler = self._获取transpiler()
61
+ if transpiler:
62
+ transpiler.包含头文件.add("<algorithm>")
63
+
64
+ return f"[&]{{ auto it = std::find({self}.begin(), {self}.end(), {value}); if (it != {self}.end()) {{ {self}.erase(it); }} }}()"
65
+
66
+ def clear(self):
67
+ """清空列表"""
68
+ return f"{self}.clear();"
69
+
70
+ def size(self):
71
+ """返回列表大小(len() 函数会使用这个)"""
72
+ return f"{self}.size()"
73
+
74
+ def empty(self):
75
+ """检查列表是否为空"""
76
+ return f"{self}.empty()"
77
+
78
+ def front(self):
79
+ """返回第一个元素"""
80
+ return f"{self}.front()"
81
+
82
+ def back(self):
83
+ """返回最后一个元素"""
84
+ return f"{self}.back()"
85
+
86
+ def begin(self):
87
+ """返回指向开始位置的迭代器(用于内部操作)"""
88
+ return f"{self}.begin()"
89
+
90
+ def end(self):
91
+ """返回指向结束位置的迭代器(用于内部操作)"""
92
+ return f"{self}.end()"
93
+
94
+ def erase(self, iterator):
95
+ """删除指定位置的元素(内部使用)"""
96
+ return f"{self}.erase({iterator})"