IncludeCPP 3.7.25__py3-none-any.whl → 3.7.27__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.
- includecpp/__init__.py +1 -1
- includecpp/core/cssl/cssl_builtins.py +209 -0
- includecpp/core/cssl/cssl_parser.py +13 -2
- includecpp/vscode/cssl/extension.js +5 -5
- includecpp/vscode/cssl/snippets/cssl.snippets.json +126 -0
- includecpp/vscode/cssl/syntaxes/cssl.tmLanguage.json +8 -0
- {includecpp-3.7.25.dist-info → includecpp-3.7.27.dist-info}/METADATA +55 -224
- {includecpp-3.7.25.dist-info → includecpp-3.7.27.dist-info}/RECORD +12 -12
- {includecpp-3.7.25.dist-info → includecpp-3.7.27.dist-info}/WHEEL +0 -0
- {includecpp-3.7.25.dist-info → includecpp-3.7.27.dist-info}/entry_points.txt +0 -0
- {includecpp-3.7.25.dist-info → includecpp-3.7.27.dist-info}/licenses/LICENSE +0 -0
- {includecpp-3.7.25.dist-info → includecpp-3.7.27.dist-info}/top_level.txt +0 -0
includecpp/__init__.py
CHANGED
|
@@ -205,6 +205,11 @@ class CSSLBuiltins:
|
|
|
205
205
|
self._functions['isavailable'] = self.builtin_isavailable
|
|
206
206
|
self._functions['instance::exists'] = self.builtin_isavailable # Alias
|
|
207
207
|
|
|
208
|
+
# Python interop functions
|
|
209
|
+
self._functions['python::pythonize'] = self.builtin_python_pythonize
|
|
210
|
+
self._functions['python::wrap'] = self.builtin_python_pythonize # Alias
|
|
211
|
+
self._functions['python::export'] = self.builtin_python_pythonize # Alias
|
|
212
|
+
|
|
208
213
|
# Regex functions
|
|
209
214
|
self._functions['match'] = self.builtin_match
|
|
210
215
|
self._functions['search'] = self.builtin_search
|
|
@@ -2445,6 +2450,210 @@ class CSSLBuiltins:
|
|
|
2445
2450
|
|
|
2446
2451
|
return None
|
|
2447
2452
|
|
|
2453
|
+
# ============= Python Interop Functions =============
|
|
2454
|
+
|
|
2455
|
+
def builtin_python_pythonize(self, cssl_instance: Any) -> Any:
|
|
2456
|
+
"""Convert a CSSL class instance to a Python-usable object.
|
|
2457
|
+
|
|
2458
|
+
This allows CSSL classes to be returned and used in Python code
|
|
2459
|
+
with proper attribute access and method calls.
|
|
2460
|
+
|
|
2461
|
+
Usage in CSSL:
|
|
2462
|
+
class Greeter {
|
|
2463
|
+
string name;
|
|
2464
|
+
|
|
2465
|
+
Greeter(string n) {
|
|
2466
|
+
this->name = n;
|
|
2467
|
+
}
|
|
2468
|
+
|
|
2469
|
+
string sayHello() {
|
|
2470
|
+
return "Hello, " + this->name + "!";
|
|
2471
|
+
}
|
|
2472
|
+
|
|
2473
|
+
void setName(string newName) {
|
|
2474
|
+
this->name = newName;
|
|
2475
|
+
}
|
|
2476
|
+
|
|
2477
|
+
string getName() {
|
|
2478
|
+
return this->name;
|
|
2479
|
+
}
|
|
2480
|
+
}
|
|
2481
|
+
|
|
2482
|
+
greeter = new Greeter("World");
|
|
2483
|
+
pyclass = python::pythonize(greeter);
|
|
2484
|
+
parameter.return(pyclass);
|
|
2485
|
+
|
|
2486
|
+
Usage in Python:
|
|
2487
|
+
from includecpp import CSSL
|
|
2488
|
+
|
|
2489
|
+
cssl = CSSL.CsslLang()
|
|
2490
|
+
greeter = cssl.run('''
|
|
2491
|
+
class Greeter { ... }
|
|
2492
|
+
g = new Greeter("World");
|
|
2493
|
+
parameter.return(python::pythonize(g));
|
|
2494
|
+
''')
|
|
2495
|
+
|
|
2496
|
+
# Now use it like a normal Python object:
|
|
2497
|
+
print(greeter.name) # "World"
|
|
2498
|
+
print(greeter.sayHello()) # "Hello, World!"
|
|
2499
|
+
greeter.setName("Python")
|
|
2500
|
+
print(greeter.getName()) # "Python"
|
|
2501
|
+
|
|
2502
|
+
Args:
|
|
2503
|
+
cssl_instance: A CSSLInstance object (created via 'new ClassName()')
|
|
2504
|
+
|
|
2505
|
+
Returns:
|
|
2506
|
+
PythonizedCSSLInstance - A Python-friendly wrapper
|
|
2507
|
+
"""
|
|
2508
|
+
from .cssl_types import CSSLInstance, CSSLClass
|
|
2509
|
+
|
|
2510
|
+
if cssl_instance is None:
|
|
2511
|
+
return None
|
|
2512
|
+
|
|
2513
|
+
# Already pythonized
|
|
2514
|
+
if isinstance(cssl_instance, PythonizedCSSLInstance):
|
|
2515
|
+
return cssl_instance
|
|
2516
|
+
|
|
2517
|
+
# Must be a CSSLInstance
|
|
2518
|
+
if not isinstance(cssl_instance, CSSLInstance):
|
|
2519
|
+
# If it's a dict, wrap it as a simple object
|
|
2520
|
+
if isinstance(cssl_instance, dict):
|
|
2521
|
+
return PythonizedDict(cssl_instance)
|
|
2522
|
+
# Return as-is for primitives
|
|
2523
|
+
return cssl_instance
|
|
2524
|
+
|
|
2525
|
+
return PythonizedCSSLInstance(cssl_instance, self.runtime)
|
|
2526
|
+
|
|
2527
|
+
|
|
2528
|
+
class PythonizedCSSLInstance:
|
|
2529
|
+
"""Python wrapper for CSSL class instances.
|
|
2530
|
+
|
|
2531
|
+
Provides Pythonic attribute access and method calling for CSSL objects.
|
|
2532
|
+
"""
|
|
2533
|
+
|
|
2534
|
+
def __init__(self, instance: Any, runtime: Any = None):
|
|
2535
|
+
# Use object.__setattr__ to avoid triggering our custom __setattr__
|
|
2536
|
+
object.__setattr__(self, '_cssl_instance', instance)
|
|
2537
|
+
object.__setattr__(self, '_cssl_runtime', runtime)
|
|
2538
|
+
object.__setattr__(self, '_cssl_class_name', instance._class.name if hasattr(instance, '_class') else 'Unknown')
|
|
2539
|
+
|
|
2540
|
+
def __getattr__(self, name: str) -> Any:
|
|
2541
|
+
"""Get member or method from CSSL instance."""
|
|
2542
|
+
if name.startswith('_'):
|
|
2543
|
+
raise AttributeError(f"'{self._cssl_class_name}' has no attribute '{name}'")
|
|
2544
|
+
|
|
2545
|
+
instance = object.__getattribute__(self, '_cssl_instance')
|
|
2546
|
+
runtime = object.__getattribute__(self, '_cssl_runtime')
|
|
2547
|
+
|
|
2548
|
+
# Check for member variable first
|
|
2549
|
+
if instance.has_member(name):
|
|
2550
|
+
value = instance.get_member(name)
|
|
2551
|
+
# Recursively pythonize nested CSSL instances
|
|
2552
|
+
from .cssl_types import CSSLInstance
|
|
2553
|
+
if isinstance(value, CSSLInstance):
|
|
2554
|
+
return PythonizedCSSLInstance(value, runtime)
|
|
2555
|
+
return value
|
|
2556
|
+
|
|
2557
|
+
# Check for method
|
|
2558
|
+
method = instance.get_method(name)
|
|
2559
|
+
if method is not None:
|
|
2560
|
+
# Return a callable wrapper for the method
|
|
2561
|
+
return PythonizedMethod(instance, name, method, runtime)
|
|
2562
|
+
|
|
2563
|
+
raise AttributeError(f"'{self._cssl_class_name}' has no attribute '{name}'")
|
|
2564
|
+
|
|
2565
|
+
def __setattr__(self, name: str, value: Any) -> None:
|
|
2566
|
+
"""Set member value on CSSL instance."""
|
|
2567
|
+
if name.startswith('_'):
|
|
2568
|
+
object.__setattr__(self, name, value)
|
|
2569
|
+
return
|
|
2570
|
+
|
|
2571
|
+
instance = object.__getattribute__(self, '_cssl_instance')
|
|
2572
|
+
instance.set_member(name, value)
|
|
2573
|
+
|
|
2574
|
+
def __repr__(self) -> str:
|
|
2575
|
+
class_name = object.__getattribute__(self, '_cssl_class_name')
|
|
2576
|
+
instance = object.__getattribute__(self, '_cssl_instance')
|
|
2577
|
+
members = list(instance._members.keys()) if hasattr(instance, '_members') else []
|
|
2578
|
+
return f"<PythonizedCSSL '{class_name}' members={members}>"
|
|
2579
|
+
|
|
2580
|
+
def __dir__(self) -> list:
|
|
2581
|
+
"""List available attributes."""
|
|
2582
|
+
instance = object.__getattribute__(self, '_cssl_instance')
|
|
2583
|
+
members = list(instance._members.keys()) if hasattr(instance, '_members') else []
|
|
2584
|
+
methods = list(instance._class.methods.keys()) if hasattr(instance._class, 'methods') else []
|
|
2585
|
+
return members + methods
|
|
2586
|
+
|
|
2587
|
+
def _to_dict(self) -> dict:
|
|
2588
|
+
"""Convert to Python dictionary."""
|
|
2589
|
+
instance = object.__getattribute__(self, '_cssl_instance')
|
|
2590
|
+
result = {}
|
|
2591
|
+
for name, value in instance._members.items():
|
|
2592
|
+
from .cssl_types import CSSLInstance
|
|
2593
|
+
if isinstance(value, CSSLInstance):
|
|
2594
|
+
result[name] = PythonizedCSSLInstance(value, None)._to_dict()
|
|
2595
|
+
else:
|
|
2596
|
+
result[name] = value
|
|
2597
|
+
return result
|
|
2598
|
+
|
|
2599
|
+
|
|
2600
|
+
class PythonizedMethod:
|
|
2601
|
+
"""Wrapper that makes CSSL methods callable from Python."""
|
|
2602
|
+
|
|
2603
|
+
def __init__(self, instance: Any, method_name: str, method_ast: Any, runtime: Any):
|
|
2604
|
+
self._instance = instance
|
|
2605
|
+
self._method_name = method_name
|
|
2606
|
+
self._method_ast = method_ast
|
|
2607
|
+
self._runtime = runtime
|
|
2608
|
+
|
|
2609
|
+
def __call__(self, *args, **kwargs) -> Any:
|
|
2610
|
+
"""Call the CSSL method with arguments."""
|
|
2611
|
+
if self._runtime is None:
|
|
2612
|
+
raise RuntimeError(f"Cannot call method '{self._method_name}' - no runtime available")
|
|
2613
|
+
|
|
2614
|
+
# Execute the method through the runtime
|
|
2615
|
+
result = self._runtime._call_method(self._instance, self._method_name, list(args))
|
|
2616
|
+
|
|
2617
|
+
# Pythonize the result if it's a CSSL instance
|
|
2618
|
+
from .cssl_types import CSSLInstance
|
|
2619
|
+
if isinstance(result, CSSLInstance):
|
|
2620
|
+
return PythonizedCSSLInstance(result, self._runtime)
|
|
2621
|
+
|
|
2622
|
+
return result
|
|
2623
|
+
|
|
2624
|
+
def __repr__(self) -> str:
|
|
2625
|
+
return f"<method '{self._method_name}' of '{self._instance._class.name}'>"
|
|
2626
|
+
|
|
2627
|
+
|
|
2628
|
+
class PythonizedDict:
|
|
2629
|
+
"""Simple wrapper for dict objects with attribute access."""
|
|
2630
|
+
|
|
2631
|
+
def __init__(self, data: dict):
|
|
2632
|
+
object.__setattr__(self, '_data', data)
|
|
2633
|
+
|
|
2634
|
+
def __getattr__(self, name: str) -> Any:
|
|
2635
|
+
data = object.__getattribute__(self, '_data')
|
|
2636
|
+
if name in data:
|
|
2637
|
+
value = data[name]
|
|
2638
|
+
if isinstance(value, dict):
|
|
2639
|
+
return PythonizedDict(value)
|
|
2640
|
+
return value
|
|
2641
|
+
raise AttributeError(f"No attribute '{name}'")
|
|
2642
|
+
|
|
2643
|
+
def __setattr__(self, name: str, value: Any) -> None:
|
|
2644
|
+
if name.startswith('_'):
|
|
2645
|
+
object.__setattr__(self, name, value)
|
|
2646
|
+
return
|
|
2647
|
+
data = object.__getattribute__(self, '_data')
|
|
2648
|
+
data[name] = value
|
|
2649
|
+
|
|
2650
|
+
def __repr__(self) -> str:
|
|
2651
|
+
data = object.__getattribute__(self, '_data')
|
|
2652
|
+
return f"<PythonizedDict {data}>"
|
|
2653
|
+
|
|
2654
|
+
def _to_dict(self) -> dict:
|
|
2655
|
+
return object.__getattribute__(self, '_data')
|
|
2656
|
+
|
|
2448
2657
|
|
|
2449
2658
|
# Module-level convenience functions
|
|
2450
2659
|
_default_builtins: Optional[CSSLBuiltins] = None
|
|
@@ -716,7 +716,7 @@ class CSSLParser:
|
|
|
716
716
|
def _is_type_keyword(self, value: str) -> bool:
|
|
717
717
|
"""Check if a keyword is a type declaration"""
|
|
718
718
|
return value in ('int', 'string', 'float', 'bool', 'void', 'json', 'array', 'vector', 'stack',
|
|
719
|
-
'list', 'dictionary', 'dict', 'instance', 'map',
|
|
719
|
+
'list', 'dictionary', 'dict', 'instance', 'map', 'openquote', 'parameter',
|
|
720
720
|
'dynamic', 'datastruct', 'dataspace', 'shuffled', 'iterator', 'combo', 'structure')
|
|
721
721
|
|
|
722
722
|
def _looks_like_function_declaration(self) -> bool:
|
|
@@ -727,14 +727,17 @@ class CSSLParser:
|
|
|
727
727
|
- undefined int funcName(...)
|
|
728
728
|
- vector<string> funcName(...)
|
|
729
729
|
- undefined void funcName(...)
|
|
730
|
+
- private super virtual meta FuncName(...) <- modifiers without return type
|
|
730
731
|
"""
|
|
731
732
|
saved_pos = self.pos
|
|
733
|
+
has_modifiers = False
|
|
732
734
|
|
|
733
735
|
# Skip modifiers (undefined, open, meta, super, closed, private, virtual)
|
|
734
736
|
while self._check(TokenType.KEYWORD) and self._is_function_modifier(self._current().value):
|
|
735
737
|
self._advance()
|
|
738
|
+
has_modifiers = True
|
|
736
739
|
|
|
737
|
-
# Check for type keyword
|
|
740
|
+
# Check for type keyword (optional if modifiers present)
|
|
738
741
|
if self._check(TokenType.KEYWORD) and self._is_type_keyword(self._current().value):
|
|
739
742
|
self._advance()
|
|
740
743
|
|
|
@@ -756,6 +759,14 @@ class CSSLParser:
|
|
|
756
759
|
self.pos = saved_pos
|
|
757
760
|
return is_func
|
|
758
761
|
|
|
762
|
+
# If we have modifiers and the next token is an identifier followed by (
|
|
763
|
+
# This handles: private super virtual meta FuncName()
|
|
764
|
+
elif has_modifiers and self._check(TokenType.IDENTIFIER):
|
|
765
|
+
self._advance()
|
|
766
|
+
is_func = self._check(TokenType.PAREN_START)
|
|
767
|
+
self.pos = saved_pos
|
|
768
|
+
return is_func
|
|
769
|
+
|
|
759
770
|
self.pos = saved_pos
|
|
760
771
|
return False
|
|
761
772
|
|
|
@@ -53,23 +53,23 @@ function activate(context) {
|
|
|
53
53
|
// Run the CSSL file using includecpp cssl run
|
|
54
54
|
const args = ['-m', 'includecpp', 'cssl', 'run', filePath];
|
|
55
55
|
|
|
56
|
-
const
|
|
56
|
+
const childProcess = spawn(pythonPath, args, {
|
|
57
57
|
cwd: path.dirname(filePath),
|
|
58
58
|
env: { ...process.env }
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
let hasError = false;
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
childProcess.stdout.on('data', (data) => {
|
|
64
64
|
outputChannel.append(data.toString());
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
childProcess.stderr.on('data', (data) => {
|
|
68
68
|
hasError = true;
|
|
69
69
|
outputChannel.append(data.toString());
|
|
70
70
|
});
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
childProcess.on('close', (code) => {
|
|
73
73
|
outputChannel.appendLine('');
|
|
74
74
|
outputChannel.appendLine('─'.repeat(50));
|
|
75
75
|
if (code === 0) {
|
|
@@ -79,7 +79,7 @@ function activate(context) {
|
|
|
79
79
|
}
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
childProcess.on('error', (err) => {
|
|
83
83
|
outputChannel.appendLine(`[CSSL] Error: ${err.message}`);
|
|
84
84
|
vscode.window.showErrorMessage(`Failed to run CSSL: ${err.message}. Make sure IncludeCPP is installed (pip install includecpp).`);
|
|
85
85
|
});
|
|
@@ -1076,5 +1076,131 @@
|
|
|
1076
1076
|
"}"
|
|
1077
1077
|
],
|
|
1078
1078
|
"description": "Open parameter function"
|
|
1079
|
+
},
|
|
1080
|
+
"Undefined Function": {
|
|
1081
|
+
"prefix": ["undefined", "undef"],
|
|
1082
|
+
"body": [
|
|
1083
|
+
"undefined ${1:void} ${2:FuncName}(${3:params}) {",
|
|
1084
|
+
"\t$0",
|
|
1085
|
+
"}"
|
|
1086
|
+
],
|
|
1087
|
+
"description": "Function with undefined modifier - suppresses all errors during execution"
|
|
1088
|
+
},
|
|
1089
|
+
"Private Function": {
|
|
1090
|
+
"prefix": "private",
|
|
1091
|
+
"body": [
|
|
1092
|
+
"private ${1:void} ${2:FuncName}(${3:params}) {",
|
|
1093
|
+
"\t$0",
|
|
1094
|
+
"}"
|
|
1095
|
+
],
|
|
1096
|
+
"description": "Private function - disables all external injections"
|
|
1097
|
+
},
|
|
1098
|
+
"Closed Function": {
|
|
1099
|
+
"prefix": "closed",
|
|
1100
|
+
"body": [
|
|
1101
|
+
"closed ${1:void} ${2:FuncName}(${3:params}) {",
|
|
1102
|
+
"\t$0",
|
|
1103
|
+
"}"
|
|
1104
|
+
],
|
|
1105
|
+
"description": "Closed function - protects from external injection modifications"
|
|
1106
|
+
},
|
|
1107
|
+
"Virtual Function": {
|
|
1108
|
+
"prefix": "virtual",
|
|
1109
|
+
"body": [
|
|
1110
|
+
"virtual ${1:void} ${2:FuncName}(${3:params}) {",
|
|
1111
|
+
"\t$0",
|
|
1112
|
+
"}"
|
|
1113
|
+
],
|
|
1114
|
+
"description": "Virtual function - can be overridden in child classes"
|
|
1115
|
+
},
|
|
1116
|
+
"Meta Function": {
|
|
1117
|
+
"prefix": "meta",
|
|
1118
|
+
"body": [
|
|
1119
|
+
"meta ${1:void} ${2:FuncName}(${3:params}) {",
|
|
1120
|
+
"\t$0",
|
|
1121
|
+
"}"
|
|
1122
|
+
],
|
|
1123
|
+
"description": "Meta function - metaprogramming function for code generation"
|
|
1124
|
+
},
|
|
1125
|
+
"Super Function": {
|
|
1126
|
+
"prefix": "super",
|
|
1127
|
+
"body": [
|
|
1128
|
+
"super ${1:void} ${2:FuncName}(${3:params}) {",
|
|
1129
|
+
"\t$0",
|
|
1130
|
+
"}"
|
|
1131
|
+
],
|
|
1132
|
+
"description": "Super function - enhanced privileges for system-level operations"
|
|
1133
|
+
},
|
|
1134
|
+
"SQLBased Function": {
|
|
1135
|
+
"prefix": "sqlbased",
|
|
1136
|
+
"body": [
|
|
1137
|
+
"sqlbased ${1:void} ${2:FuncName}(${3:params}) {",
|
|
1138
|
+
"\t$0",
|
|
1139
|
+
"}"
|
|
1140
|
+
],
|
|
1141
|
+
"description": "SQL-based function - optimized for database operations"
|
|
1142
|
+
},
|
|
1143
|
+
"API Function with Modifiers": {
|
|
1144
|
+
"prefix": ["apifunc", "globalapi"],
|
|
1145
|
+
"body": [
|
|
1146
|
+
"private super virtual meta ${1:GlobalApi}() {",
|
|
1147
|
+
"\tinstance<\"${2:apiName}\"> api;",
|
|
1148
|
+
"\tclass ${3:Api} {",
|
|
1149
|
+
"\t\tdefine ${4:getMethod}() {",
|
|
1150
|
+
"\t\t\t$0",
|
|
1151
|
+
"\t\t}",
|
|
1152
|
+
"\t}",
|
|
1153
|
+
"\t%api +<== new ${3}();",
|
|
1154
|
+
"\treturn %api;",
|
|
1155
|
+
"}"
|
|
1156
|
+
],
|
|
1157
|
+
"description": "Global API function with full modifiers and instance pattern"
|
|
1158
|
+
},
|
|
1159
|
+
"Combined Modifiers Function": {
|
|
1160
|
+
"prefix": "modfunc",
|
|
1161
|
+
"body": [
|
|
1162
|
+
"${1|undefined,private,closed,virtual,meta,super,sqlbased|} ${2|undefined,private,closed,virtual,meta,super,sqlbased,void,int,string|} ${3:FuncName}(${4:params}) {",
|
|
1163
|
+
"\t$0",
|
|
1164
|
+
"}"
|
|
1165
|
+
],
|
|
1166
|
+
"description": "Function with selectable modifier combinations"
|
|
1167
|
+
},
|
|
1168
|
+
"Python Pythonize": {
|
|
1169
|
+
"prefix": ["python::pythonize", "pythonize"],
|
|
1170
|
+
"body": "python::pythonize(${1:instance})$0",
|
|
1171
|
+
"description": "Convert CSSL class instance to Python-usable object"
|
|
1172
|
+
},
|
|
1173
|
+
"Return Pythonized Class": {
|
|
1174
|
+
"prefix": "returnpython",
|
|
1175
|
+
"body": [
|
|
1176
|
+
"${1:instance} = new ${2:ClassName}(${3:args});",
|
|
1177
|
+
"pyobj = python::pythonize(${1});",
|
|
1178
|
+
"parameter.return(pyobj);"
|
|
1179
|
+
],
|
|
1180
|
+
"description": "Create class instance and return as Python object"
|
|
1181
|
+
},
|
|
1182
|
+
"Class with Python Export": {
|
|
1183
|
+
"prefix": "pyclass",
|
|
1184
|
+
"body": [
|
|
1185
|
+
"class ${1:ClassName} {",
|
|
1186
|
+
"\t${2:string} ${3:name};",
|
|
1187
|
+
"",
|
|
1188
|
+
"\t${1}(${4:params}) {",
|
|
1189
|
+
"\t\tthis->${3} = ${5:value};",
|
|
1190
|
+
"\t}",
|
|
1191
|
+
"",
|
|
1192
|
+
"\t${6:string} get${3/(.*)/${1:/capitalize}/}() {",
|
|
1193
|
+
"\t\treturn this->${3};",
|
|
1194
|
+
"\t}",
|
|
1195
|
+
"",
|
|
1196
|
+
"\tvoid set${3/(.*)/${1:/capitalize}/}(${2} newValue) {",
|
|
1197
|
+
"\t\tthis->${3} = newValue;",
|
|
1198
|
+
"\t}",
|
|
1199
|
+
"}",
|
|
1200
|
+
"",
|
|
1201
|
+
"${7:obj} = new ${1}(${8:args});",
|
|
1202
|
+
"parameter.return(python::pythonize(${7}));$0"
|
|
1203
|
+
],
|
|
1204
|
+
"description": "Create a class and export as Python object"
|
|
1079
1205
|
}
|
|
1080
1206
|
}
|
|
@@ -319,6 +319,14 @@
|
|
|
319
319
|
{
|
|
320
320
|
"name": "support.function.namespace.combo.cssl",
|
|
321
321
|
"match": "\\bcombo::(filterdb|blocked|like)\\b"
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"name": "support.function.namespace.python.cssl",
|
|
325
|
+
"match": "\\bpython::(pythonize|wrap|export)\\b"
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"name": "support.function.namespace.filter.cssl",
|
|
329
|
+
"match": "\\bfilter::(register|unregister|list|exists)\\b"
|
|
322
330
|
}
|
|
323
331
|
]
|
|
324
332
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: IncludeCPP
|
|
3
|
-
Version: 3.7.
|
|
3
|
+
Version: 3.7.27
|
|
4
4
|
Summary: Professional C++ Python bindings with type-generic templates, pystubs and native threading
|
|
5
5
|
Home-page: https://github.com/liliassg/IncludeCPP
|
|
6
6
|
Author: Lilias Hatterscheidt
|
|
@@ -839,7 +839,7 @@ print(math_mod.multiply(4, 5)) # 20
|
|
|
839
839
|
cssl = CSSL.CsslLang()
|
|
840
840
|
|
|
841
841
|
# Register code as payload
|
|
842
|
-
cssl.
|
|
842
|
+
cssl.script(<name>, "helpers", '''
|
|
843
843
|
global version = "1.0.0";
|
|
844
844
|
void log(string msg) {
|
|
845
845
|
printl("[LOG] " + msg);
|
|
@@ -847,230 +847,61 @@ cssl.code("helpers", '''
|
|
|
847
847
|
''')
|
|
848
848
|
|
|
849
849
|
# Use in CSSL
|
|
850
|
-
cssl.
|
|
851
|
-
payload("
|
|
850
|
+
cssl.run('''
|
|
851
|
+
payload("<name>"); // use module you declared in cssl.script(<name>, ...)
|
|
852
852
|
@log("Application started");
|
|
853
853
|
printl(@version);
|
|
854
854
|
''')
|
|
855
855
|
```
|
|
856
856
|
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
- CPPY: C++ reserved words (double, int, void, etc.) now properly escaped as Python identifiers
|
|
909
|
-
- CPPY: C++ STL functions (accumulate, find, sort, reverse) properly converted to Python equivalents
|
|
910
|
-
- CPPY: Member variables with trailing underscore (memory_) now get self. prefix
|
|
911
|
-
- CPPY: Private class members now detected for self. prefix conversion
|
|
912
|
-
- Plugin: Auto-detect header files from #include directives in source files
|
|
913
|
-
|
|
914
|
-
## v3.4.0
|
|
915
|
-
- **CodeMaker Major Update:**
|
|
916
|
-
- New Source node type with 8 connection ports for code generation
|
|
917
|
-
- Smart code generation: Source nodes generate Python/Plugin files with all connected nodes included
|
|
918
|
-
- Right-click on Source node: "Create Python" creates .py in project root
|
|
919
|
-
- Right-click on Source node: "Create Plugin" creates .cp, .h, .cpp in plugins/ and include/
|
|
920
|
-
- Code options hidden after file generation (prevents duplicates)
|
|
921
|
-
- Enhanced description display with background rect in node body
|
|
922
|
-
- Arrow key navigation to pan the canvas
|
|
923
|
-
- New toolbar buttons: Align H, Align V, Auto-Arrange
|
|
924
|
-
- Quick-add buttons: +Source, +Class, +Function
|
|
925
|
-
- Properties Panel on the right side for editing selected nodes
|
|
926
|
-
- Auto-arrange algorithm for grid layout
|
|
927
|
-
- Align horizontal/vertical for selected nodes
|
|
928
|
-
- **Bug Fixes:**
|
|
929
|
-
- Changelog encoding fixes for Windows console
|
|
930
|
-
- CPPY C++ keyword escaping (double, int, etc.)
|
|
931
|
-
- CPPY C++ to Python syntax conversion improvements
|
|
932
|
-
- CPPY self. prefix for member variables
|
|
933
|
-
- Plugin auto-header detection from #include
|
|
934
|
-
|
|
935
|
-
## v3.3.21
|
|
936
|
-
- **Encoding Fixes:**
|
|
937
|
-
- Replaced Unicode arrow characters with ASCII in changelog (Windows console compatibility)
|
|
938
|
-
|
|
939
|
-
## v3.3.20
|
|
940
|
-
- **Bug Fixes:**
|
|
941
|
-
- Fixed `QPoint.toPoint()` AttributeError in rubber band selection
|
|
942
|
-
- Added UTF-8 encoding to all file read/write operations for cross-platform compatibility
|
|
943
|
-
- Fixed bare `except:` clauses to proper `except Exception:` in settings_ui.py
|
|
944
|
-
|
|
945
|
-
## v3.3.19
|
|
946
|
-
- **PyQt6 Import Fix:**
|
|
947
|
-
- Fixed silent import failure that caused "PyQt6 not installed" error even when installed
|
|
948
|
-
- Moved `QUndoStack`, `QUndoCommand`, `QShortcut` from QtWidgets to QtGui (correct location in PyQt6)
|
|
949
|
-
|
|
950
|
-
## v3.3.18
|
|
951
|
-
- **CodeMaker Visual Editor (Experimental):**
|
|
952
|
-
- Complete rewrite of `project` command with professional-grade UI
|
|
953
|
-
- 24 node types across 5 categories (Code Structures, Functions, Data, Organization, Flow)
|
|
954
|
-
- Undo/redo system with full command history
|
|
955
|
-
- Multi-selection with rubber band and Ctrl+Click
|
|
956
|
-
- Copy/paste/duplicate with Ctrl+C/V/D shortcuts
|
|
957
|
-
- Node grouping with Ctrl+G
|
|
958
|
-
- Code generation for C++ (header/source) and Python
|
|
959
|
-
- Search and filter nodes by name and type
|
|
960
|
-
- Export to PNG/SVG with transparency support
|
|
961
|
-
- Categorized right-click context menus
|
|
962
|
-
- Toolbar with common actions
|
|
963
|
-
- Cross-platform font detection (Windows/macOS/Linux)
|
|
964
|
-
- DPI-aware scaling for high-resolution displays
|
|
965
|
-
- **Experimental Feature Gating:**
|
|
966
|
-
- `project` command now requires "Enable Experimental Features" in settings
|
|
967
|
-
- Consistent gating with `ai` and `cppy` commands
|
|
968
|
-
|
|
969
|
-
## v3.3.16-3.3.17
|
|
970
|
-
- **QPen Bug Fixes:**
|
|
971
|
-
- Fixed 3 instances of `setPen(Qt.PenStyle.NoPen)` to `setPen(QPen(Qt.PenStyle.NoPen))`
|
|
972
|
-
- Proper QPen construction for PyQt6 compatibility
|
|
973
|
-
|
|
974
|
-
## v3.3.15
|
|
975
|
-
- **CPPY Converter Major Fixes:**
|
|
976
|
-
- Functions returning container now get `std::vector<T>` return type (e.g., shuffle_list)
|
|
977
|
-
- `max(items)` / `min(items)` now correctly uses `std::max_element` / `std::min_element`
|
|
978
|
-
- Template element parameters (`value`, `item`) now use `const T&` instead of `double`
|
|
979
|
-
- Explicit template instantiations now include correct return types and all parameters
|
|
980
|
-
- Python docstrings now become C++ comments instead of dangling string literals
|
|
981
|
-
- **Unicode Fallback System:**
|
|
982
|
-
- AI progress indicators use ASCII fallbacks on Windows terminals
|
|
983
|
-
- Fixed encoding errors in changelog display
|
|
984
|
-
|
|
985
|
-
## v3.3.14
|
|
986
|
-
- **Experimental Features System:**
|
|
987
|
-
- AI and CPPY commands now hidden by default
|
|
988
|
-
- Enable via Settings UI: "Enable Experimental Features" checkbox
|
|
989
|
-
- Warning about potential bugs documented in README
|
|
990
|
-
- **Settings UI Improvements:**
|
|
991
|
-
- Added scrollable content area to prevent layout squashing
|
|
992
|
-
- New "Experimental" section with orange header
|
|
993
|
-
- Better spacing and styling for all elements
|
|
994
|
-
- Preserved existing config values on save
|
|
995
|
-
|
|
996
|
-
## v3.3.13
|
|
997
|
-
- **Template Support for Generic Functions:**
|
|
998
|
-
- Generic container parameters now generate proper C++ templates
|
|
999
|
-
- `template<typename T> T getChoice(const std::vector<T>& choices)` instead of invalid `std::vector<auto>`
|
|
1000
|
-
- Automatic explicit template instantiations for int, double, std::string
|
|
1001
|
-
- **AI Conversion - No pybind11:**
|
|
1002
|
-
- AI no longer generates pybind11 code - IncludeCPP handles bindings automatically
|
|
1003
|
-
- Clean C++ output in `namespace includecpp`
|
|
1004
|
-
- User runs `includecpp plugin` separately to generate bindings
|
|
1005
|
-
- **AI Context - Dynamic README:**
|
|
1006
|
-
- AI now loads README.md dynamically for accurate IncludeCPP documentation
|
|
1007
|
-
- Better understanding of IncludeCPP workflow and patterns
|
|
1008
|
-
|
|
1009
|
-
## v3.3.12
|
|
1010
|
-
- **Smart Type Inference:**
|
|
1011
|
-
- Parameter types now inferred from common naming patterns (start/end -> int, name/path -> string, etc.)
|
|
1012
|
-
- Variable type tracking throughout conversion for accurate string detection
|
|
1013
|
-
- Loop variable types inferred from iterables (enumerate, for loops)
|
|
1014
|
-
- **String Conversion Fix:**
|
|
1015
|
-
- No more `std::to_string()` on already-string variables in f-strings
|
|
1016
|
-
- `_is_string_expr()` method for comprehensive string type detection
|
|
1017
|
-
- String variables detected by name, type tracking, and method calls
|
|
1018
|
-
- **AI Conversion Improvements:**
|
|
1019
|
-
- Explicit file extension enforcement (.cpp NOT .cp, .h NOT .hpp)
|
|
1020
|
-
- Better --no-h flag handling with clear AI instructions
|
|
1021
|
-
- AI can request clarification on unconvertible modules (tkinter, pygame, etc.)
|
|
1022
|
-
- User prompted for input when AI needs guidance
|
|
1023
|
-
|
|
1024
|
-
## v3.3.11
|
|
1025
|
-
- **CPPY Converter Improvements:**
|
|
1026
|
-
- Added `_safe_arg()` and `_safe_get()` for robust bounds checking on all args
|
|
1027
|
-
- Added comprehensive try-except handling in `_convert_expr()` with warnings
|
|
1028
|
-
- Improved type inference with empty container handling and exception safety
|
|
1029
|
-
- Complete string escaping: `\0`, `\f`, `\b`, `\a`, `\v` now properly escaped
|
|
1030
|
-
- **New Python Constructs:**
|
|
1031
|
-
- Dict comprehensions: `{k: v for k, v in items}` now converts to C++
|
|
1032
|
-
- Set comprehensions: `{x for x in items}` now converts to C++
|
|
1033
|
-
- Generator expressions: `(x for x in items)` now converts to vector
|
|
1034
|
-
- Tuple unpacking: `a, b = func()` now uses C++17 structured bindings
|
|
1035
|
-
- **AI Conversion Flags:**
|
|
1036
|
-
- New `--think` flag for less context mode
|
|
1037
|
-
- New `--think3` flag for maximum context mode
|
|
1038
|
-
- New `--websearch` flag for web search in AI conversion
|
|
1039
|
-
- Default: `--think2` mode (unchanged behavior)
|
|
1040
|
-
|
|
1041
|
-
## v3.3.10
|
|
1042
|
-
- **CPPY Converter seeded RNG fixes:**
|
|
1043
|
-
- Fixed `rng = random.Random(seed)` then `rng.randint()` - now properly tracks seeded RNG variables
|
|
1044
|
-
- Fixed `random.choices(...)[0]` subscript - returns single element directly without `[0]`
|
|
1045
|
-
- Seeded RNG methods (randint, uniform, choice, random) now use the tracked variable with proper C++ distributions
|
|
1046
|
-
|
|
1047
|
-
## v3.3.9
|
|
1048
|
-
- **CPPY Converter fixes:**
|
|
1049
|
-
- Added f-string (JoinedStr) support - f"text {expr}" now converts to string concatenation
|
|
1050
|
-
- Fixed `random.Random(seed).method()` chained calls - now generates proper inline lambda with seeded RNG
|
|
1051
|
-
- Fixed `random.choices(items, weights=weights)` keyword argument handling
|
|
1052
|
-
- Improved string type detection in f-string expressions
|
|
1053
|
-
|
|
1054
|
-
## v3.3.8
|
|
1055
|
-
- **Major rulebased converter improvements:**
|
|
1056
|
-
- Added Python `random` module support (randint, uniform, choice, sample, shuffle, gauss, etc.)
|
|
1057
|
-
- Added `os` module support (getcwd, path.join, path.exists, listdir, mkdir, etc.)
|
|
1058
|
-
- Added `time` module support (sleep, time, perf_counter, monotonic)
|
|
1059
|
-
- Added `sys` module support (exit, platform)
|
|
1060
|
-
- Added `math` module support (sqrt, pow, sin, cos, log, etc.)
|
|
1061
|
-
- Added `re` (regex) module support (match, search, sub, findall)
|
|
1062
|
-
- Added `threading` module support (Thread, Lock, Semaphore, etc.)
|
|
1063
|
-
- Added `collections` module support (deque, defaultdict, Counter)
|
|
1064
|
-
- Added `pathlib.Path` support
|
|
1065
|
-
- **Unconvertible code detection:**
|
|
1066
|
-
- Automatically detects GUI frameworks (tkinter, PyQt, PySide, pygame) and other unconvertible modules
|
|
1067
|
-
- Shows red warning with line numbers when unconvertible code is found
|
|
1068
|
-
- New `--force` flag to convert anyway (with `/* UNCONVERTIBLE */` comments)
|
|
1069
|
-
- Supports 30+ modules in detection (numpy, pandas, flask, django, etc.)
|
|
1070
|
-
- Fixed duplicate file output in `cppy convert --ai`
|
|
1071
|
-
- Plugin command now skips inline and underscore-prefixed functions
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
---
|
|
1075
|
-
|
|
1076
|
-
MIT License | v3.4.20 | [GitHub](https://github.com/liliassg/IncludeCPP)
|
|
857
|
+
## Return CSSL Classes to Python
|
|
858
|
+
|
|
859
|
+
Use `python::pythonize()` to convert CSSL class instances into Python-usable objects:
|
|
860
|
+
|
|
861
|
+
```python
|
|
862
|
+
from includecpp import CSSL
|
|
863
|
+
|
|
864
|
+
cssl = CSSL.CsslLang()
|
|
865
|
+
|
|
866
|
+
# Create and return a CSSL class as a Python object
|
|
867
|
+
greeter = cssl.run('''
|
|
868
|
+
class Greeter {
|
|
869
|
+
string name;
|
|
870
|
+
|
|
871
|
+
Greeter(string n) {
|
|
872
|
+
this->name = n;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
string sayHello() {
|
|
876
|
+
return "Hello, " + this->name + "!";
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
void setName(string newName) {
|
|
880
|
+
this->name = newName;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
string getName() {
|
|
884
|
+
return this->name;
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
instance = new Greeter("World");
|
|
889
|
+
pyclass = python::pythonize(instance);
|
|
890
|
+
parameter.return(pyclass);
|
|
891
|
+
''')
|
|
892
|
+
|
|
893
|
+
# Now use it like a normal Python object!
|
|
894
|
+
print(greeter.name) # "World"
|
|
895
|
+
print(greeter.sayHello()) # "Hello, World!"
|
|
896
|
+
greeter.setName("Python")
|
|
897
|
+
print(greeter.getName()) # "Python"
|
|
898
|
+
print(greeter.name) # "Python"
|
|
899
|
+
```
|
|
900
|
+
|
|
901
|
+
### Aliases
|
|
902
|
+
|
|
903
|
+
- `python::pythonize(instance)` - Main function
|
|
904
|
+
- `python::wrap(instance)` - Alias
|
|
905
|
+
- `python::export(instance)` - Alias
|
|
906
|
+
|
|
907
|
+
All three do the same thing: wrap a CSSL class instance for Python use.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
includecpp/__init__.py,sha256=
|
|
1
|
+
includecpp/__init__.py,sha256=gn3oD2EMNH7bWVbzB5YF8aWPQa-TM5SEAUhSW27jrxI,1673
|
|
2
2
|
includecpp/__init__.pyi,sha256=uSDYlbqd2TinmrdepmE_zvN25jd3Co2cgyPzXgDpopM,7193
|
|
3
3
|
includecpp/__main__.py,sha256=d6QK0PkvUe1ENofpmHRAg3bwNbZr8PiRscfI3-WRfVg,72
|
|
4
4
|
includecpp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -21,11 +21,11 @@ includecpp/core/project_ui.py,sha256=la2EQZKmUkJGuJxnbs09hH1ZhBh9bfndo6okzZsk2dQ
|
|
|
21
21
|
includecpp/core/settings_ui.py,sha256=B2SlwgdplF2KiBk5UYf2l8Jjifjd0F-FmBP0DPsVCEQ,11798
|
|
22
22
|
includecpp/core/cssl/CSSL_DOCUMENTATION.md,sha256=47sUPO-FMq_8_CrJBZFoFBgSO3gSi5zoB1Xp7oeifho,40773
|
|
23
23
|
includecpp/core/cssl/__init__.py,sha256=scDXRBNK2L6A8qmlpNyaqQj6BFcSfPInBlucdeNfMF0,1975
|
|
24
|
-
includecpp/core/cssl/cssl_builtins.py,sha256=
|
|
24
|
+
includecpp/core/cssl/cssl_builtins.py,sha256=1OTSTZWbyIAGcEs5k6Y0mbJ0vlz3xf150vvvtsyLvH8,100161
|
|
25
25
|
includecpp/core/cssl/cssl_builtins.pyi,sha256=3ai2V4LyhzPBhAKjRRf0rLVu_bg9ECmTfTkdFKM64iA,127430
|
|
26
26
|
includecpp/core/cssl/cssl_events.py,sha256=nupIcXW_Vjdud7zCU6hdwkQRQ0MujlPM7Tk2u7eDAiY,21013
|
|
27
27
|
includecpp/core/cssl/cssl_modules.py,sha256=cUg0-zdymMnWWTsA_BUrW5dx4R04dHpKcUhm-Wfiwwo,103006
|
|
28
|
-
includecpp/core/cssl/cssl_parser.py,sha256=
|
|
28
|
+
includecpp/core/cssl/cssl_parser.py,sha256=WxfqNhsryt5IR7KdDgbHrrYlXS-xBXTsr3YAiGBJZIc,117711
|
|
29
29
|
includecpp/core/cssl/cssl_runtime.py,sha256=iZgNcKDoTeV50-IsXcsrpuTyDPxEHWyQz5uR3s5UVHg,154613
|
|
30
30
|
includecpp/core/cssl/cssl_syntax.py,sha256=bgo3NFehoPTQa5dqwNd_CstkVGVCNYAXbGYUcu5BEN0,16982
|
|
31
31
|
includecpp/core/cssl/cssl_types.py,sha256=gVjtfxk0Uzfj-H7_LD79oqspFMYDf79ZrRrlZk8eAEs,50647
|
|
@@ -37,16 +37,16 @@ includecpp/generator/type_resolver.h,sha256=ZsaxQqcCcKJJApYn7KOp2dLlQ1VFVG_oZDja
|
|
|
37
37
|
includecpp/templates/cpp.proj.template,sha256=Iy-L8I4Cl3tIgBMx1Qp5h6gURvkqOAqyodVHuDJ0Luw,359
|
|
38
38
|
includecpp/vscode/__init__.py,sha256=yLKw-_7MTX1Rx3jLk5JjharJQfFXbwtZVE7YqHpM7yg,39
|
|
39
39
|
includecpp/vscode/cssl/__init__.py,sha256=rQJAx5X05v-mAwqX1Qb-rbZO219iR73MziFNRUCNUIo,31
|
|
40
|
-
includecpp/vscode/cssl/extension.js,sha256=
|
|
40
|
+
includecpp/vscode/cssl/extension.js,sha256=FZaKfOpzo2jXtubVCZmnhDZd4eUVHltm5VW_fgNnSkE,4327
|
|
41
41
|
includecpp/vscode/cssl/language-configuration.json,sha256=61Q00cKI9may5L8YpxMmvfo6PAc-abdJqApfR85DWuw,904
|
|
42
42
|
includecpp/vscode/cssl/package.json,sha256=Zu2QoTE0OVCCDUHp1hc7kN2NBbFs60bX-LLGMpXz25M,4853
|
|
43
43
|
includecpp/vscode/cssl/images/cssl.png,sha256=BxAGsnfS0ZzzCvqV6Zb1OAJAZpDUoXlR86MsvUGlSZw,510
|
|
44
44
|
includecpp/vscode/cssl/images/cssl_pl.png,sha256=z4WMk7g6YCTbUUbSFk343BO6yi_OmNEVYkRenWGydwM,799
|
|
45
|
-
includecpp/vscode/cssl/snippets/cssl.snippets.json,sha256=
|
|
46
|
-
includecpp/vscode/cssl/syntaxes/cssl.tmLanguage.json,sha256=
|
|
47
|
-
includecpp-3.7.
|
|
48
|
-
includecpp-3.7.
|
|
49
|
-
includecpp-3.7.
|
|
50
|
-
includecpp-3.7.
|
|
51
|
-
includecpp-3.7.
|
|
52
|
-
includecpp-3.7.
|
|
45
|
+
includecpp/vscode/cssl/snippets/cssl.snippets.json,sha256=uV3nHJyQ5f7Pr3FzfbQT2VZOEY3AlGs4wrmqe884jm4,37372
|
|
46
|
+
includecpp/vscode/cssl/syntaxes/cssl.tmLanguage.json,sha256=ArCRc_G54kiKGh6WEd4CbmR-SX1X9BOcp3Y0hwZcw44,21543
|
|
47
|
+
includecpp-3.7.27.dist-info/licenses/LICENSE,sha256=fWCsGGsiWZir0UzDd20Hh-3wtRyk1zqUntvtVuAWhvc,1093
|
|
48
|
+
includecpp-3.7.27.dist-info/METADATA,sha256=J7R2bswVgzfG0ENxhVQkmElAGeWvJt0OpY1VNFDYyRo,22511
|
|
49
|
+
includecpp-3.7.27.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
50
|
+
includecpp-3.7.27.dist-info/entry_points.txt,sha256=6A5Mif9gi0139Bf03W5plAb3wnAgbNaEVe1HJoGE-2o,59
|
|
51
|
+
includecpp-3.7.27.dist-info/top_level.txt,sha256=RFUaR1KG-M6mCYwP6w4ydP5Cgc8yNbP78jxGAvyjMa8,11
|
|
52
|
+
includecpp-3.7.27.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|