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,363 @@
1
+ Metadata-Version: 2.4
2
+ Name: l0n0lc
3
+ Version: 1.0.0
4
+ Summary: 一个将python函数翻译为c++函数并运行的jit编译器
5
+ Classifier: Programming Language :: Python :: 3
6
+ Requires-Python: >=3.10
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Dynamic: license-file
10
+
11
+ # l0n0lc
12
+
13
+ <div align="center">
14
+
15
+ **将 Python 函数翻译为 C++ 并运行的 JIT 编译器**
16
+
17
+ [![Python Version](https://img.shields.io/badge/python-3.10+-blue.svg)](https://python.org)
18
+ [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
19
+ [![Version](https://img.shields.io/badge/version-1.0.0-orange.svg)](pyproject.toml)
20
+ [![Zero Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen.svg)](pyproject.toml)
21
+
22
+ </div>
23
+
24
+ ---
25
+
26
+ ## 简介
27
+
28
+ l0n0lc 是一个零外部依赖的 Python JIT 编译器,通过简单的装饰器将 Python 函数转换为原生 C++ 代码并编译执行。它专注于计算密集型任务的性能优化,同时保持 API 的简洁性和易用性。
29
+
30
+ ### 核心特点
31
+
32
+ - **零依赖** - 仅依赖 Python 3.10+ 标准库
33
+ - **简单易用** - 一个 `@jit` 装饰器即可启用
34
+ - **智能缓存** - 基于源码哈希,自动避免重复编译
35
+ - **跨平台** - 支持 Linux、macOS、Windows
36
+ - **类型推断** - 自动推断变量类型,生成高效 C++ 代码
37
+
38
+ ---
39
+
40
+ ## 安装
41
+
42
+ ```bash
43
+ pip install l0n0lc
44
+ ```
45
+
46
+ ### 系统要求
47
+
48
+ - Python 3.10 或更高版本
49
+ - C++ 编译器(g++、clang++ 或 c++)
50
+
51
+ ```bash
52
+ # Ubuntu/Debian
53
+ sudo apt install g++
54
+
55
+ # macOS
56
+ xcode-select --install
57
+
58
+ # Windows (MSYS2)
59
+ pacman -S mingw-w64-x86_64-gcc
60
+ ```
61
+
62
+ ---
63
+
64
+ ## 快速开始
65
+
66
+ ### 基础用法
67
+
68
+ ```python
69
+ from l0n0lc import jit
70
+
71
+ @jit()
72
+ def fibonacci(n: int) -> int:
73
+ if n <= 1:
74
+ return n
75
+ a, b = 0, 1
76
+ for _ in range(2, n + 1):
77
+ a, b = b, a + b
78
+ return b
79
+
80
+ print(fibonacci(40)) # 输出: 102334155
81
+ ```
82
+
83
+ ### 容器类型支持
84
+
85
+ ```python
86
+ from typing import List
87
+
88
+ @jit()
89
+ def sum_list(nums: List[int]) -> int:
90
+ total = 0
91
+ for num in nums:
92
+ total += num
93
+ return total
94
+
95
+ print(sum_list([1, 2, 3, 4, 5])) # 输出: 15
96
+ ```
97
+
98
+ ### 类支持
99
+
100
+ ```python
101
+ # 定义类(类本身不需要 jit 装饰器)
102
+ class Point:
103
+ x: float
104
+ y: float
105
+
106
+ def __init__(self, x: float, y: float):
107
+ self.x = x
108
+ self.y = y
109
+
110
+ @jit()
111
+ def compute_distance() -> float:
112
+ # 在 JIT 函数内部创建和使用类实例
113
+ p1 = Point(0.0, 0.0)
114
+ p2 = Point(3.0, 4.0)
115
+ dx = p1.x - p2.x
116
+ dy = p1.y - p2.y
117
+ return (dx * dx + dy * dy) ** 0.5
118
+
119
+ print(compute_distance()) # 输出: 25.0 (平方距离)
120
+ ```
121
+
122
+ ---
123
+
124
+ ## API 参考
125
+
126
+ ### @jit 装饰器
127
+
128
+ ```python
129
+ @jit(
130
+ 总是重编=False, # 强制重新编译
131
+ 可执行文件名=None, # 编译为独立可执行文件
132
+ 优化级别="-O3", # C++ 优化级别
133
+ 启用_lto=False, # 启用链接时优化
134
+ 启用_simd=False, # 启用 SIMD 优化
135
+ )
136
+ def function_name() -> ReturnType:
137
+ ...
138
+ ```
139
+
140
+ ### 中文别名
141
+
142
+ ```python
143
+ from l0n0lc import jit, 即时编译
144
+
145
+ # 两者等价
146
+ @jit()
147
+ def func1(): pass
148
+
149
+ @即时编译()
150
+ def func2(): pass
151
+ ```
152
+
153
+ ---
154
+
155
+ ## 高级功能
156
+
157
+ ### AOT 编译
158
+
159
+ ```bash
160
+ # 将 Python 文件编译为独立可执行文件
161
+ l0n0lc-aot-compile input.py -o output_executable
162
+ ```
163
+
164
+ ### 自定义 C++ 映射
165
+
166
+ ```python
167
+ import l0n0lc as lc
168
+
169
+ # 映射到 C++ 标准库函数
170
+ @lc.映射函数到('sqrt({x})', ['<cmath>'])
171
+ def my_sqrt(x: float) -> float:
172
+ return 0 # 实际使用 C++ 实现
173
+ ```
174
+
175
+ ### 性能优化选项
176
+
177
+ ```python
178
+ # 启用 LTO 优化
179
+ @jit(启用_lto=True)
180
+ def optimized_function():
181
+ pass
182
+
183
+ # 启用 SIMD
184
+ @jit(启用_simd=True)
185
+ def vectorized_compute(data: List[float]) -> List[float]:
186
+ pass
187
+ ```
188
+
189
+ ---
190
+
191
+ ## 工作原理
192
+
193
+ ```
194
+ Python 函数
195
+
196
+ AST 解析与类型推断
197
+
198
+ C++ 代码生成
199
+
200
+ 系统 C++ 编译器
201
+
202
+ 动态库 (.so/.dll/.dylib)
203
+
204
+ ctypes 加载执行
205
+ ```
206
+
207
+ ---
208
+
209
+ ## 性能对比
210
+
211
+ ```python
212
+ import time
213
+ from l0n0lc import jit
214
+
215
+ def fib_py(n: int) -> int:
216
+ if n <= 1:
217
+ return n
218
+ return fib_py(n-1) + fib_py(n-2)
219
+
220
+ @jit()
221
+ def fib_jit(n: int) -> int:
222
+ if n <= 1:
223
+ return n
224
+ return fib_jit(n-1) + fib_jit(n-2)
225
+
226
+ # 测试
227
+ n = 35
228
+
229
+ t = time.time()
230
+ fib_py(n)
231
+ py_time = time.time() - t
232
+
233
+ t = time.time()
234
+ fib_jit(n)
235
+ jit_time = time.time() - t
236
+
237
+ print(f"Python: {py_time:.3f}s")
238
+ print(f"JIT: {jit_time:.3f}s")
239
+ print(f"加速比: {py_time/jit_time:.1f}x")
240
+ ```
241
+
242
+ ---
243
+
244
+ ## 支持的语言特性
245
+
246
+ | 特性 | 支持情况 |
247
+ |------|----------|
248
+ | 基本类型 (int, float, bool, str) | ✅ |
249
+ | 容器类型 (List, Dict, Set) | ✅ |
250
+ | 类定义和实例方法 | ✅ |
251
+ | for/while 循环 | ✅ |
252
+ | if/else 条件 | ✅ |
253
+ | try/except 异常处理 | ✅ |
254
+ | 列表推导式 | ✅ |
255
+ | 可变参数 (*args, **kwargs) | ❌ |
256
+ | 生成器 | ❌ |
257
+ | 异步函数 | ❌ |
258
+
259
+ ---
260
+
261
+ ## 开发
262
+
263
+ ### 从源码构建
264
+
265
+ ```bash
266
+ git clone https://github.com/username/l0n0lc.git
267
+ cd l0n0lc
268
+ pip install -e .
269
+ ```
270
+
271
+ ### 运行测试
272
+
273
+ ```bash
274
+ cd tests
275
+ for test in test_*.py; do
276
+ echo "Running $test"
277
+ python "$test"
278
+ done
279
+ ```
280
+
281
+ ### 构建发布包
282
+
283
+ ```bash
284
+ # 使用 uv 构建
285
+ uv build
286
+
287
+ # 或使用构建脚本
288
+ ./build.sh
289
+ ```
290
+
291
+ ---
292
+
293
+ ## 缓存机制
294
+
295
+ 编译产物存储在 `l0n0lcoutput/` 目录:
296
+
297
+ ```
298
+ l0n0lcoutput/
299
+ ├── {hash}_{filename}_{funcname}@_{hash}.cpp # C++ 源码
300
+ ├── {hash}_{filename}_{funcname}@_{hash}.h # 头文件
301
+ └── {hash}_{filename}_{funcname}@_{hash}.so # 动态库
302
+ ```
303
+
304
+ 缓存基于函数源码的 BLAKE2s 哈希,代码修改后自动重新编译。
305
+
306
+ ### 清理缓存
307
+
308
+ ```bash
309
+ # 清理所有缓存
310
+ rm -rf l0n0lcoutput/
311
+
312
+ # 清理构建产物
313
+ ./build.sh # 自动清理并重新构建
314
+ ```
315
+
316
+ ---
317
+
318
+ ## 项目结构
319
+
320
+ ```
321
+ l0n0lc/
322
+ ├── 即时编译.py # @jit 装饰器
323
+ ├── Py转Cpp转译器.py # AST 转 C++ 核心逻辑
324
+ ├── cpp编译器.py # C++ 编译器管理
325
+ ├── 运行时加载.py # ctypes 加载
326
+ ├── cpp类型.py # C++ 类型定义
327
+ ├── 类型转换.py # Python ↔ C++ 类型转换
328
+ ├── std_vector.py # std::vector 支持
329
+ ├── std_map.py # std::map 支持
330
+ ├── std_set.py # std::set 支持
331
+ ├── aot编译.py # AOT 编译
332
+ ├── simd优化.py # SIMD 优化
333
+ ├── 并行编译器.py # 并行编译
334
+ └── ...
335
+ ```
336
+
337
+ ---
338
+
339
+ ## 限制与注意事项
340
+
341
+ 1. **类型注解** - 建议提供完整的类型注解以提高代码质量
342
+ 2. **首次编译** - 首次调用会有编译延迟,后续调用使用缓存
343
+ 3. **适用场景** - 适合计算密集型任务,简单函数可能因编译开销反而变慢
344
+ 4. **函数名编码** - 包含非 ASCII 字符的函数名会被编码
345
+
346
+ ---
347
+
348
+ ## 许可证
349
+
350
+ [MIT License](LICENSE)
351
+
352
+ ---
353
+
354
+ ## 作者
355
+
356
+ 倾城铸剑师
357
+
358
+ ---
359
+
360
+ ## 文档
361
+
362
+ - [CLAUDE.md](CLAUDE.md) - 开发者文档
363
+ - [tests/](tests/) - 测试用例和示例
@@ -0,0 +1,39 @@
1
+ l0n0lc/Py转Cpp转译器.py,sha256=l60o45f-CM3oloTTLawAHh_It0BjmgKVwBcI5C6Qoek,25781
2
+ l0n0lc/__init__.py,sha256=ASRJnSQn5a3oFEksFBzdAh2u7s0LTjz5qDBGGHU7lvQ,1822
3
+ l0n0lc/aot编译.py,sha256=tU801fcisn5F0v_FshjjFV1jcBJK8vsZkMo3NFvr5Hg,22003
4
+ l0n0lc/ast访问者.py,sha256=QamOTOI6morgU6WPDQWSpFQCPbM8B_s4zHIJVuAmvoo,25661
5
+ l0n0lc/cpp类型.py,sha256=zL0imonIuP53Bt0dcWy8H-MaTEJ5B0OLlVu1nnFusO0,9614
6
+ l0n0lc/cpp编译器.py,sha256=BaqEqWNMQ9zjZ9Y7Kccx8HhZMubuTPiDj83vBEKLXsg,11180
7
+ l0n0lc/simd优化.py,sha256=PAu88gHVPYiyFHD9nL4mGT4kBKs7aOMFrnYRWn8MeZM,8576
8
+ l0n0lc/std_map.py,sha256=4KDcIczA03M758t1nrQzHLa-Y0aDYaFaGWNX4odUfVc,5235
9
+ l0n0lc/std_set.py,sha256=12kiT3cYSlTEXNn1M5Cv2QYOPN_XTOO2jkCfkFI-ATM,5594
10
+ l0n0lc/std_vector.py,sha256=MyjmQtWm1I0hUYgSGH5olmOUrlC-jdGIvjNi-rUxG_A,3449
11
+ l0n0lc/代码优化.py,sha256=ij2xKXaKnTraqCxyRg6z4Hp7cMvd1UWMxOEduXSeADA,10311
12
+ l0n0lc/代码生成.py,sha256=6CzOo_qBRPPnCH_865TEfQ-uKemJTAzd-624bUusa3g,23861
13
+ l0n0lc/依赖注入.py,sha256=NzuHJm-H3gEqo2wvj9iflB5NjtyYnsbF9_i-Fexgsuc,4075
14
+ l0n0lc/即时编译.py,sha256=6PBDtQbyC-8-ZKmWdw5UjyKmBvtkDrFRawbbteGp3RY,7420
15
+ l0n0lc/变量管理器.py,sha256=Gj3fCrBussjVIamAEoRwup5pzw73RVD5Cm6vfzHj5Ko,3402
16
+ l0n0lc/基础映射.py,sha256=2xiPNOpZrTg1H9S8n1fMnBBol4gHcVm43xXvlF3VXzo,3347
17
+ l0n0lc/基础混入.py,sha256=O49XZcyIQK7XgA1lrpC7MkRsmFyE8qnhKO9LWTy67VQ,4345
18
+ l0n0lc/容器构建器.py,sha256=3_JeYVCcxns6mv7FErVd-p8GszGDPmjKdgBsNF24S9M,7525
19
+ l0n0lc/工具.py,sha256=O2FKVsiP6f0aP2utyto9n-6omnP_XN4omnY_3__3Hh0,9478
20
+ l0n0lc/并行编译器.py,sha256=8B4jjor7idNdm9HUITAD3BWBWzb-R251VnVfnUfwApM,12982
21
+ l0n0lc/异常.py,sha256=eZZFdeY7nNiawmlF8aQ_FEEHQBB6bedRiE1Ah6nZ0hg,15766
22
+ l0n0lc/数组对象池.py,sha256=rt1SU8G2izXDRJfdmF5IeaDCLsbK_v0O-B_RbIcReGM,7119
23
+ l0n0lc/文件管理器.py,sha256=xBKI71X0ZGQVdDUqN3s_R-JNUqX3yQaiS092nInP8GA,8531
24
+ l0n0lc/日志工具.py,sha256=yEXoyxljokVSzag7A7jYdiHaFDrOpjV0worQHMwktmU,5081
25
+ l0n0lc/类型推断工具.py,sha256=rWpY60dp6dELDDNMlMC6gjrtdxXMQeFqvthuYdeTxrM,12597
26
+ l0n0lc/类型转换.py,sha256=LW8Adh689HpKpC53P_4M-9Ip41ujHGBSVeZY5hC83ro,7892
27
+ l0n0lc/类支持.py,sha256=sranCRrZDogZpMKLp5So-hjy1KGG5CddziBw9A1O9gA,15435
28
+ l0n0lc/编译上下文.py,sha256=aadn7UHesoy9TUHXGrKf5rJAUAEfGG_kUyMRrwfthkc,3585
29
+ l0n0lc/编译管理器.py,sha256=MoV_ABlW2tJ9MLyqbODaIss5jF2ySfWo0axF3hLoHBo,5493
30
+ l0n0lc/表达式处理.py,sha256=y7zqNSyYvTsIUgeOoGILKISLqsV6qz7wkN5rre7LG6A,20163
31
+ l0n0lc/转译器工具.py,sha256=okgsrhMEq3ucYuWVStv1kBVgH9QrwxQsYpwYBHt6XXk,1429
32
+ l0n0lc/运行时加载.py,sha256=t-P9jZj8ShRImOiGE-v64rfw6Mte2m4zqyx2VUzBwkM,8684
33
+ l0n0lc/通用工具.py,sha256=3FDv6aLVqxVmzZNSUACpubM9A7sjigfulqJJ1-YEaaA,4148
34
+ l0n0lc-1.0.0.dist-info/licenses/LICENSE,sha256=1L-MAjulZ3kpbYwsJtlXpDVITRxykna2Ecg_521YfkA,1093
35
+ l0n0lc-1.0.0.dist-info/METADATA,sha256=E50BmlQ71-CUV8HafPfv_MowYUzcKexyhqlAmHoeiWM,6846
36
+ l0n0lc-1.0.0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
37
+ l0n0lc-1.0.0.dist-info/entry_points.txt,sha256=u1ynz2q2r-oPTc8k0uthgRqbxuyQ_DN5pkEigeKJvHw,61
38
+ l0n0lc-1.0.0.dist-info/top_level.txt,sha256=Q21D_eEY_-xgRUPwATGp9YDKSBO4w_7MI2MYxQI1aT4,7
39
+ l0n0lc-1.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ l0n0lc-aot-compile = l0n0lc.aot编译:main
l0n0lc/StdList.py DELETED
@@ -1,24 +0,0 @@
1
- from .c基础处理 import c变量, cpp类型, list初始化列表
2
-
3
-
4
- class StdList(c变量):
5
- def __init__(
6
- self,
7
- 初始化列表: list初始化列表,
8
- 名字: str, 是参数: bool) -> None:
9
- self.初始化列表 = 初始化列表
10
- if 初始化列表.类型 == cpp类型.ANY:
11
- super().__init__(f'std::vector<{初始化列表.类型}>', 名字, 是参数)
12
- else:
13
- super().__init__(f'{初始化列表.类型}', 名字, 是参数)
14
-
15
- def __getitem__(self, key):
16
- return f'{self}[{key}]'
17
-
18
- def __setitem__(self, key, value):
19
- return f'{self}[{key}] = {value};'
20
-
21
- def 初始化(self, 初始值):
22
- if self.初始化列表.类型 == cpp类型.ANY:
23
- return super().初始化(初始值)
24
- return f'{self.类型} {self.名字}[] = {初始值};'
l0n0lc/StdMap.py DELETED
@@ -1,21 +0,0 @@
1
- from .c基础处理 import py类型转c类型, dict初始化列表, c变量, cpp类型
2
- from typing import Tuple, Union, List
3
- from .通用 import toCString
4
-
5
-
6
- class StdUnorderedMap(c变量):
7
- def __init__(
8
- self,
9
- 初始化列表: dict初始化列表,
10
- 名字: str, 是参数: bool) -> None:
11
- self.初始化列表 = 初始化列表
12
- super().__init__(
13
- f'std::unordered_map<{初始化列表.key类型}, {初始化列表.value类型}>', 名字, 是参数)
14
-
15
- def __getitem__(self, key):
16
- return f'{self}[{toCString(key)}]'
17
-
18
- def __setitem__(self, key, value):
19
- 左 = f'{self}[{toCString(key)}]'
20
- 右 = toCString(value)
21
- return f'{左} = {右};'
@@ -1,207 +0,0 @@
1
- from typing import Union, List, get_origin, get_args
2
- from .通用 import 生成变量Id, toCString
3
- import ctypes
4
-
5
-
6
- def cpp获取变量类型(v):
7
- return f'decltype({v})'
8
-
9
-
10
- class cpp类型:
11
- INT8_T = 'int8_t'
12
- INT16_T = 'int16_t'
13
- INT32_T = 'int32_t'
14
- INT64_T = 'int64_t'
15
- UINT8_T = 'uint8_t'
16
- UINT16_T = 'uint16_t'
17
- UINT32_T = 'uint32_t'
18
- UINT64_T = 'uint64_t'
19
- HALF = 'half'
20
- FLOAT = 'float'
21
- STRING = 'std::string'
22
- BOOL = 'bool'
23
- ANY = 'std::any'
24
- AUTO = 'auto'
25
- VOID_P = 'void*'
26
-
27
-
28
- class 指针:
29
- def __init__(self, 类型) -> None:
30
- self.基础类型 = 类型
31
-
32
- def __str__(self) -> str:
33
- return f'{self.基础类型}*'
34
-
35
-
36
- def 执行额外函数(函数列表: List, *args):
37
- for fn in 函数列表:
38
- ret = fn(*args)
39
- if ret is not None:
40
- return ret
41
-
42
-
43
- 额外py转ctypes函数 = []
44
-
45
-
46
- def py类型转ctypes类型(类型):
47
- ret = 执行额外函数(额外py转ctypes函数, 类型)
48
- if ret is not None:
49
- return ret
50
-
51
- # 基础类型
52
- if 类型 is int:
53
- return ctypes.c_int64
54
- if 类型 is float:
55
- return ctypes.c_float
56
- if 类型 is str:
57
- return ctypes.c_char_p
58
- if 类型 is bool:
59
- return ctypes.c_bool
60
- if 类型 is 指针:
61
- return ctypes.c_void_p
62
-
63
- 额外py转c函数 = []
64
-
65
-
66
- def py类型转c类型(类型):
67
- ret = 执行额外函数(额外py转c函数, 类型)
68
- if ret is not None:
69
- return ret
70
-
71
- # 基础类型
72
- if 类型 is int:
73
- return cpp类型.INT64_T
74
- if 类型 is float:
75
- return cpp类型.FLOAT
76
- if 类型 is str:
77
- return cpp类型.STRING
78
- if 类型 is bool:
79
- return cpp类型.BOOL
80
- if 类型 is 指针:
81
- return cpp类型.VOID_P
82
-
83
- origin = get_origin(类型)
84
- args = get_args(类型)
85
-
86
- if origin is Union:
87
- return cpp类型.ANY
88
-
89
- # List[...] → 指针(...)
90
- if origin is list:
91
- if args:
92
- elem_type = args[0]
93
- return 指针(py类型转c类型(elem_type))
94
-
95
- # Dict[K, V] → std::unordered_map<K, V>
96
- if origin is dict:
97
- if len(args) == 2:
98
- key_type = py类型转c类型(args[0])
99
- val_type = py类型转c类型(args[1])
100
- return f"std::unordered_map<{key_type}, {val_type}>&"
101
-
102
- # 直接传字符串类型名
103
- if isinstance(类型, str):
104
- return 类型
105
-
106
- return cpp类型.ANY
107
-
108
- def cpp类型检查(类型, 支持提示: str):
109
- if 类型 not in [int, float, str, bool]:
110
- raise Exception(f'{支持提示} 仅支持 [int, float, str, bool]')
111
-
112
-
113
- class list初始化列表:
114
- def __init__(
115
- self,
116
- 代码: str,
117
- 类型列表: Union[List[Union[int, float, bool, str]],
118
- int, float, bool, str],
119
- 长度: int) -> None:
120
- self.代码 = 代码
121
- self.类型列表 = 类型列表
122
- self.类型 = py类型转c类型(类型列表)
123
- self.长度 = 长度
124
-
125
- def __str__(self) -> str:
126
- return self.代码
127
-
128
-
129
- def 从list构建初始化列表(value: List):
130
- 数据类型列表 = []
131
- 初始化列表 = []
132
- for v in value:
133
- dtype = type(v)
134
- cpp类型检查(dtype, 'List')
135
- 数据类型列表.append(dtype)
136
- 初始化列表.append(toCString(v))
137
- # 构建初始化列表
138
- 初始化列表 = '{' + ','.join(初始化列表) + '}'
139
-
140
- # 构建类型列表
141
- if all(类型 == 数据类型列表[0] for 类型 in 数据类型列表):
142
- 数据类型列表 = 数据类型列表[0]
143
-
144
- return list初始化列表(初始化列表, 数据类型列表, len(value))
145
-
146
-
147
- class dict初始化列表:
148
- def __init__(
149
- self,
150
- 代码: str,
151
- key类型列表: Union[List[Union[int, float, bool, str]],
152
- int, float, bool, str],
153
- value类型列表: Union[List[Union[int, float, bool, str]],
154
- int, float, bool, str]) -> None:
155
- self.代码 = 代码
156
- self.key类型列表 = key类型列表
157
- self.value类型列表 = value类型列表
158
- self.key类型 = py类型转c类型(key类型列表)
159
- self.value类型 = py类型转c类型(value类型列表)
160
-
161
- def __str__(self) -> str:
162
- return self.代码
163
-
164
-
165
- def 从dict构建初始化列表(value: dict):
166
- code = []
167
- key类型列表 = []
168
- value类型列表 = []
169
- for k, v in value.items():
170
- key类型 = type(k)
171
- cpp类型检查(key类型, 'Map')
172
- value类型 = type(v)
173
- cpp类型检查(value类型, 'Map')
174
- key类型列表.append(key类型)
175
- value类型列表.append(value类型)
176
- code.append(f'{{ {toCString(k)}, {v} }}')
177
-
178
- # 构建类型列表
179
- if all(类型 == key类型列表[0] for 类型 in key类型列表):
180
- key类型列表 = key类型列表[0]
181
-
182
- if all(类型 == value类型列表[0] for 类型 in value类型列表):
183
- value类型列表 = value类型列表[0]
184
-
185
- # 构建初始化列表
186
- 初始化列表 = '{' + ','.join(code) + '}'
187
-
188
- return dict初始化列表(初始化列表, key类型列表, value类型列表)
189
-
190
-
191
- class c变量:
192
- def __init__(self, 类型: str, 名字: str, 是参数: bool, 默认值=None) -> None:
193
- self.类型 = 类型
194
- self.名字 = 名字
195
- self.c名字 = 生成变量Id(名字)
196
- self.是参数 = 是参数
197
- self.默认值 = 默认值
198
-
199
- def __str__(self):
200
- return self.c名字
201
-
202
- @property
203
- def c类型(self):
204
- return cpp获取变量类型(self)
205
-
206
- def 初始化(self, 初始值):
207
- return f'{self.类型} {self.c名字} = {初始值};'