IncludeCPP 3.7.20__py3-none-any.whl → 3.7.21__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 CHANGED
@@ -2,7 +2,7 @@ from .core.cpp_api import CppApi
2
2
  from .core import cssl_bridge as CSSL
3
3
  import warnings
4
4
 
5
- __version__ = "3.7.20"
5
+ __version__ = "3.7.21"
6
6
  __all__ = ["CppApi", "CSSL"]
7
7
 
8
8
  # Module-level cache for C++ modules
@@ -307,6 +307,10 @@ class CSSLBuiltins:
307
307
  self._functions['dataspace'] = self.builtin_dataspace
308
308
  self._functions['openquote'] = self.builtin_openquote
309
309
  self._functions['OpenFind'] = self.builtin_openfind
310
+ self._functions['vector'] = self.builtin_vector
311
+ self._functions['array'] = self.builtin_array
312
+ self._functions['stack'] = self.builtin_stack
313
+ self._functions['map'] = self.builtin_map
310
314
 
311
315
  # Print aliases for CSSL
312
316
  self._functions['printl'] = self.builtin_println # CSSL uses printl for println
@@ -433,13 +437,50 @@ class CSSLBuiltins:
433
437
  # ============= Type Checking =============
434
438
 
435
439
  def builtin_typeof(self, value: Any) -> str:
436
- """Get type name"""
440
+ """Get type name - returns CSSL-specific type names for CSSL types"""
437
441
  if value is None:
438
442
  return 'null'
443
+
444
+ # Check CSSL-specific types first
445
+ from .cssl_types import (Vector, Array, Stack, DataStruct,
446
+ List as CSSLList, Dictionary, Map,
447
+ Shuffled, Iterator, Combo, DataSpace,
448
+ OpenQuote, Parameter, CSSLInstance)
449
+
450
+ if isinstance(value, Vector):
451
+ return 'vector'
452
+ elif isinstance(value, Array):
453
+ return 'array'
454
+ elif isinstance(value, Stack):
455
+ return 'stack'
456
+ elif isinstance(value, DataStruct):
457
+ return 'datastruct'
458
+ elif isinstance(value, CSSLList):
459
+ return 'list'
460
+ elif isinstance(value, Dictionary):
461
+ return 'dictionary'
462
+ elif isinstance(value, Map):
463
+ return 'map'
464
+ elif isinstance(value, Shuffled):
465
+ return 'shuffled'
466
+ elif isinstance(value, Iterator):
467
+ return 'iterator'
468
+ elif isinstance(value, Combo):
469
+ return 'combo'
470
+ elif isinstance(value, DataSpace):
471
+ return 'dataspace'
472
+ elif isinstance(value, OpenQuote):
473
+ return 'openquote'
474
+ elif isinstance(value, Parameter):
475
+ return 'parameter'
476
+ elif isinstance(value, CSSLInstance):
477
+ return value._class.name
478
+
479
+ # Python types as fallback
439
480
  type_map = {
440
481
  int: 'int',
441
482
  float: 'float',
442
- str: 'str',
483
+ str: 'string',
443
484
  bool: 'bool',
444
485
  list: 'list',
445
486
  dict: 'dict',
@@ -2322,6 +2363,38 @@ class CSSLBuiltins:
2322
2363
  from .cssl_types import OpenQuote
2323
2364
  return OpenQuote(db_ref)
2324
2365
 
2366
+ def builtin_vector(self, element_type: str = 'dynamic') -> Any:
2367
+ """Create a vector container.
2368
+
2369
+ Usage: vector<int> myVector; or vector('int')
2370
+ """
2371
+ from .cssl_types import Vector
2372
+ return Vector(element_type)
2373
+
2374
+ def builtin_array(self, element_type: str = 'dynamic') -> Any:
2375
+ """Create an array container.
2376
+
2377
+ Usage: array<string> myArray; or array('string')
2378
+ """
2379
+ from .cssl_types import Array
2380
+ return Array(element_type)
2381
+
2382
+ def builtin_stack(self, element_type: str = 'dynamic') -> Any:
2383
+ """Create a stack container.
2384
+
2385
+ Usage: stack<int> myStack; or stack('int')
2386
+ """
2387
+ from .cssl_types import Stack
2388
+ return Stack(element_type)
2389
+
2390
+ def builtin_map(self, key_type: str = 'dynamic', value_type: str = 'dynamic') -> Any:
2391
+ """Create a map container.
2392
+
2393
+ Usage: map<string, int> myMap; or map('string', 'int')
2394
+ """
2395
+ from .cssl_types import Map
2396
+ return Map(key_type, value_type)
2397
+
2325
2398
  def builtin_openfind(self, combo_or_type: Any, index: int = 0, params: list = None) -> Any:
2326
2399
  """Find open parameter by type or combo space.
2327
2400
 
@@ -848,7 +848,7 @@ class CSSLParser:
848
848
  if self._match_keyword('open'):
849
849
  param_info['open'] = True
850
850
 
851
- # Handle type annotations
851
+ # Handle type annotations (builtin types like int, string, etc.)
852
852
  if self._check(TokenType.KEYWORD) and self._is_type_keyword(self._current().value):
853
853
  param_info['type'] = self._advance().value
854
854
 
@@ -872,6 +872,39 @@ class CSSLParser:
872
872
  self._advance()
873
873
  param_info['generic'] = ''.join(generic_parts)
874
874
 
875
+ # Handle custom class types (identifier followed by another identifier = type + name)
876
+ elif self._check(TokenType.IDENTIFIER):
877
+ # Look ahead: if next token is also an identifier, current is the type
878
+ saved_pos = self.pos
879
+ potential_type = self._advance().value
880
+
881
+ # Check for generic type parameter <T> on custom type
882
+ if self._check(TokenType.COMPARE_LT):
883
+ self._advance()
884
+ generic_parts = []
885
+ depth = 1
886
+ while depth > 0 and not self._is_at_end():
887
+ if self._check(TokenType.COMPARE_LT):
888
+ depth += 1
889
+ generic_parts.append('<')
890
+ elif self._check(TokenType.COMPARE_GT):
891
+ depth -= 1
892
+ if depth > 0:
893
+ generic_parts.append('>')
894
+ elif self._check(TokenType.COMMA):
895
+ generic_parts.append(',')
896
+ else:
897
+ generic_parts.append(self._current().value)
898
+ self._advance()
899
+ param_info['generic'] = ''.join(generic_parts)
900
+
901
+ # If followed by identifier, this is "Type name" pattern
902
+ if self._check(TokenType.IDENTIFIER):
903
+ param_info['type'] = potential_type
904
+ else:
905
+ # Not a type, restore position - this is just a param name
906
+ self.pos = saved_pos
907
+
875
908
  # Handle reference operator &
876
909
  if self._match(TokenType.AMPERSAND):
877
910
  param_info['ref'] = True
@@ -2509,6 +2542,20 @@ class CSSLParser:
2509
2542
 
2510
2543
  self._expect(TokenType.BLOCK_END) # consume }
2511
2544
 
2545
+ # Check for array-style initialization: vector<int>[1, 2, 3], array<string>["a", "b"]
2546
+ elif self._check(TokenType.BRACKET_START):
2547
+ self._advance() # consume [
2548
+ init_values = []
2549
+
2550
+ while not self._check(TokenType.BRACKET_END) and not self._is_at_end():
2551
+ init_values.append(self._parse_expression())
2552
+
2553
+ # Optional comma
2554
+ if self._check(TokenType.COMMA):
2555
+ self._advance()
2556
+
2557
+ self._expect(TokenType.BRACKET_END) # consume ]
2558
+
2512
2559
  return ASTNode('type_instantiation', value={
2513
2560
  'type': name,
2514
2561
  'element_type': element_type,
@@ -830,8 +830,18 @@ class CSSLRuntime:
830
830
  if hasattr(instance, 'append'):
831
831
  instance.append(init_value)
832
832
 
833
+ # Check for global modifier
834
+ modifiers = decl.get('modifiers', [])
835
+ is_global = 'global' in modifiers
836
+
833
837
  # Store in scope
834
838
  self.scope.set(var_name, instance)
839
+
840
+ # If global, also store in promoted_globals and global_scope
841
+ if is_global:
842
+ self._promoted_globals[var_name] = instance
843
+ self.global_scope.set(var_name, instance)
844
+
835
845
  return instance
836
846
 
837
847
  def _exec_instance_declaration(self, node: ASTNode) -> Any:
@@ -978,6 +988,14 @@ class CSSLRuntime:
978
988
  result = self._evaluate(inner.value)
979
989
  return result
980
990
 
991
+ # Handle typed declaration: global datastruct<int> data;
992
+ elif inner.type == 'typed_declaration':
993
+ # Add global modifier to the declaration
994
+ if isinstance(inner.value, dict):
995
+ inner.value['modifiers'] = inner.value.get('modifiers', []) + ['global']
996
+ result = self._exec_typed_declaration(inner)
997
+ return result
998
+
981
999
  # Fallback: execute normally
982
1000
  return self._execute_node(inner)
983
1001
 
@@ -1756,9 +1774,14 @@ class CSSLRuntime:
1756
1774
  elif mode == 'move':
1757
1775
  # Move & remove from source
1758
1776
  final_value = source
1759
- # Clear the source
1760
- if isinstance(source_node, ASTNode) and source_node.type == 'identifier':
1761
- self.scope.set(source_node.value, None)
1777
+ # Clear the source - handle all node types
1778
+ if isinstance(source_node, ASTNode):
1779
+ if source_node.type == 'identifier':
1780
+ self.scope.set(source_node.value, None)
1781
+ elif source_node.type == 'module_ref':
1782
+ self._set_module_value(source_node.value, None)
1783
+ elif source_node.type == 'member_access':
1784
+ self._set_member(source_node, None)
1762
1785
  else:
1763
1786
  final_value = source
1764
1787
 
@@ -1830,9 +1853,14 @@ class CSSLRuntime:
1830
1853
  final_value = [current_value, source]
1831
1854
  elif mode == 'move':
1832
1855
  final_value = source
1833
- # Clear the source
1834
- if isinstance(source_node, ASTNode) and source_node.type == 'identifier':
1835
- self.scope.set(source_node.value, None)
1856
+ # Clear the source - handle all node types
1857
+ if isinstance(source_node, ASTNode):
1858
+ if source_node.type == 'identifier':
1859
+ self.scope.set(source_node.value, None)
1860
+ elif source_node.type == 'module_ref':
1861
+ self._set_module_value(source_node.value, None)
1862
+ elif source_node.type == 'member_access':
1863
+ self._set_member(source_node, None)
1836
1864
  else:
1837
1865
  final_value = source
1838
1866
 
@@ -2132,12 +2160,13 @@ class CSSLRuntime:
2132
2160
  return value
2133
2161
 
2134
2162
  if node.type == 'module_ref':
2135
- # Check modules first, then promoted globals, then scope
2136
- value = self.get_module(node.value)
2137
- if value is None:
2138
- value = self._promoted_globals.get(node.value)
2163
+ # User-defined globals have priority over SDK modules
2164
+ # Check promoted globals first, then global scope, then SDK modules
2165
+ value = self._promoted_globals.get(node.value)
2139
2166
  if value is None:
2140
2167
  value = self.global_scope.get(node.value)
2168
+ if value is None:
2169
+ value = self.get_module(node.value) # SDK modules as fallback
2141
2170
  return value
2142
2171
 
2143
2172
  if node.type == 'self_ref':
@@ -2221,12 +2250,28 @@ class CSSLRuntime:
2221
2250
  value_type = node.value.get('value_type') # For map<K, V>
2222
2251
  init_values = node.value.get('init_values') # For inline init: map<K,V>{...}
2223
2252
 
2253
+ # Helper to populate container with init values
2254
+ def _populate_container(container, init_vals):
2255
+ if init_vals and isinstance(init_vals, list):
2256
+ for val_node in init_vals:
2257
+ val = self._evaluate(val_node) if isinstance(val_node, ASTNode) else val_node
2258
+ if hasattr(container, 'push'):
2259
+ container.push(val)
2260
+ elif hasattr(container, 'add'):
2261
+ container.add(val)
2262
+ elif hasattr(container, 'append'):
2263
+ container.append(val)
2264
+ return container
2265
+
2224
2266
  if type_name == 'stack':
2225
- return Stack(element_type)
2267
+ s = Stack(element_type)
2268
+ return _populate_container(s, init_values)
2226
2269
  elif type_name == 'vector':
2227
- return Vector(element_type)
2270
+ v = Vector(element_type)
2271
+ return _populate_container(v, init_values)
2228
2272
  elif type_name == 'datastruct':
2229
- return DataStruct(element_type)
2273
+ d = DataStruct(element_type)
2274
+ return _populate_container(d, init_values)
2230
2275
  elif type_name == 'shuffled':
2231
2276
  return Shuffled(element_type)
2232
2277
  elif type_name == 'iterator':
@@ -2238,9 +2283,11 @@ class CSSLRuntime:
2238
2283
  elif type_name == 'openquote':
2239
2284
  return OpenQuote()
2240
2285
  elif type_name == 'array':
2241
- return Array(element_type)
2286
+ a = Array(element_type)
2287
+ return _populate_container(a, init_values)
2242
2288
  elif type_name == 'list':
2243
- return List(element_type)
2289
+ l = List(element_type)
2290
+ return _populate_container(l, init_values)
2244
2291
  elif type_name in ('dictionary', 'dict'):
2245
2292
  return Dictionary(element_type)
2246
2293
  elif type_name == 'map':
@@ -3027,12 +3074,20 @@ class CSSLRuntime:
3027
3074
  pass
3028
3075
 
3029
3076
  def _set_module_value(self, path: str, value: Any):
3030
- """Set a value on a module path"""
3077
+ """Set a value on a module path or promoted global"""
3031
3078
  parts = path.split('.')
3032
3079
  if len(parts) < 2:
3080
+ # Single name (no dots) - set in promoted_globals and global_scope
3081
+ self._promoted_globals[path] = value
3082
+ self.global_scope.set(path, value)
3033
3083
  return
3034
3084
 
3035
3085
  obj = self._modules.get(parts[0])
3086
+ # Also check promoted_globals for the base object
3087
+ if obj is None:
3088
+ obj = self._promoted_globals.get(parts[0])
3089
+ if obj is None:
3090
+ obj = self.global_scope.get(parts[0])
3036
3091
  if obj is None:
3037
3092
  return
3038
3093
 
@@ -64,6 +64,33 @@ class DataStruct(list):
64
64
  return target_type(self[0])
65
65
  return None
66
66
 
67
+ def length(self) -> int:
68
+ """Return datastruct length"""
69
+ return len(self)
70
+
71
+ def size(self) -> int:
72
+ """Return datastruct size (alias for length)"""
73
+ return len(self)
74
+
75
+ def push(self, item: Any) -> 'DataStruct':
76
+ """Push item to datastruct (alias for add)"""
77
+ self.append(item)
78
+ return self
79
+
80
+ def isEmpty(self) -> bool:
81
+ """Check if datastruct is empty"""
82
+ return len(self) == 0
83
+
84
+ def contains(self, item: Any) -> bool:
85
+ """Check if datastruct contains item"""
86
+ return item in self
87
+
88
+ def at(self, index: int) -> Any:
89
+ """Get item at index (safe access)"""
90
+ if 0 <= index < len(self):
91
+ return self[index]
92
+ return None
93
+
67
94
  def begin(self) -> int:
68
95
  """Return iterator to beginning (C++ style)"""
69
96
  return 0
@@ -99,6 +126,16 @@ class Stack(list):
99
126
  self.append(item)
100
127
  return self
101
128
 
129
+ def pop(self) -> Any:
130
+ """Pop and return top element from stack"""
131
+ if len(self) == 0:
132
+ return None
133
+ return super().pop()
134
+
135
+ def pop_back(self) -> Any:
136
+ """Pop and return top element (alias for pop)"""
137
+ return self.pop()
138
+
102
139
  def peek(self) -> Any:
103
140
  """View top item without removing"""
104
141
  return self[-1] if self else None
@@ -701,6 +738,39 @@ class List(list):
701
738
  self.extend([value] * count)
702
739
  return self
703
740
 
741
+ def map(self, func: Callable[[Any], Any]) -> 'List':
742
+ """Apply function to all elements"""
743
+ result = List(self._element_type)
744
+ result.extend(func(item) for item in self)
745
+ return result
746
+
747
+ def filter(self, predicate: Callable[[Any], bool]) -> 'List':
748
+ """Filter elements by predicate"""
749
+ result = List(self._element_type)
750
+ result.extend(item for item in self if predicate(item))
751
+ return result
752
+
753
+ def forEach(self, func: Callable[[Any], None]) -> 'List':
754
+ """Execute function for each element"""
755
+ for item in self:
756
+ func(item)
757
+ return self
758
+
759
+ def reduce(self, func: Callable[[Any, Any], Any], initial: Any = None) -> Any:
760
+ """Reduce list to single value"""
761
+ from functools import reduce as py_reduce
762
+ if initial is None:
763
+ return py_reduce(func, self)
764
+ return py_reduce(func, self, initial)
765
+
766
+ def every(self, predicate: Callable[[Any], bool]) -> bool:
767
+ """Check if all elements match predicate"""
768
+ return all(predicate(item) for item in self)
769
+
770
+ def some(self, predicate: Callable[[Any], bool]) -> bool:
771
+ """Check if any element matches predicate"""
772
+ return any(predicate(item) for item in self)
773
+
704
774
  def begin(self) -> int:
705
775
  """Return iterator to beginning"""
706
776
  return 0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: IncludeCPP
3
- Version: 3.7.20
3
+ Version: 3.7.21
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
@@ -1,4 +1,4 @@
1
- includecpp/__init__.py,sha256=4Ymntg7zK4sO2Z-sJmMHLXLI0Dqe1DbKESuvJYSZgDg,1673
1
+ includecpp/__init__.py,sha256=hYkRPXgViZO8YrWxqA7IX284xwW81zMDqqjHUgMlOEM,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,14 +21,14 @@ 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=6L2C_74mlVnd5C27z9LwmD5Z2jbT4wXp_QNb34cA004,89578
24
+ includecpp/core/cssl/cssl_builtins.py,sha256=r-FX4WQeKxerkepqodIiwhtL_kxxa4PJym_WyWIwA_s,92290
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=YLQUnuKwY37d1LtrJ2UMysgpAXVgIvcRQO7gUFUONts,113476
29
- includecpp/core/cssl/cssl_runtime.py,sha256=6wtifsRurFRm62KrdnTpzNdofl5vSOfaHM6KPXzhJVE,142036
28
+ includecpp/core/cssl/cssl_parser.py,sha256=SaFgehSB2300s4DtC_v1lmVyaBpg2jIRZcEeEiJ9E_o,115774
29
+ includecpp/core/cssl/cssl_runtime.py,sha256=EETUsUOZL7PZ1a9Chz0JeJFP0w68DtSthoqSebigxrw,144834
30
30
  includecpp/core/cssl/cssl_syntax.py,sha256=bgo3NFehoPTQa5dqwNd_CstkVGVCNYAXbGYUcu5BEN0,16982
31
- includecpp/core/cssl/cssl_types.py,sha256=ebgZrrddhmTRK8vQ3dNWVH15Z4rMqEx1sSmozhnJyQA,48292
31
+ includecpp/core/cssl/cssl_types.py,sha256=gVjtfxk0Uzfj-H7_LD79oqspFMYDf79ZrRrlZk8eAEs,50647
32
32
  includecpp/generator/__init__.py,sha256=Rsy41bwimaEloD3gDRR_znPfIJzIsCFuWZgCTJBLJlc,62
33
33
  includecpp/generator/parser.cpp,sha256=hbhHdtFH65rzp6prnARN9pNFF_ssr0NseVVcxq0fJh4,76833
34
34
  includecpp/generator/parser.h,sha256=EDm0b-pEesIIIQQ2PvH5h2qwlqJU9BH8SiMV7MWbsTo,11073
@@ -43,9 +43,9 @@ includecpp/vscode/cssl/images/cssl.png,sha256=BxAGsnfS0ZzzCvqV6Zb1OAJAZpDUoXlR86
43
43
  includecpp/vscode/cssl/images/cssl_pl.png,sha256=z4WMk7g6YCTbUUbSFk343BO6yi_OmNEVYkRenWGydwM,799
44
44
  includecpp/vscode/cssl/snippets/cssl.snippets.json,sha256=l4SCEPR3CsPxA8HIVLKYY__I979TfKzYWtH1KYIsboo,33062
45
45
  includecpp/vscode/cssl/syntaxes/cssl.tmLanguage.json,sha256=XKRLBOHlCqDDnGPvmNHDQPsIMR1UD9PBaJIlgZOiPqM,21173
46
- includecpp-3.7.20.dist-info/licenses/LICENSE,sha256=fWCsGGsiWZir0UzDd20Hh-3wtRyk1zqUntvtVuAWhvc,1093
47
- includecpp-3.7.20.dist-info/METADATA,sha256=K63lr_YXZIRgYK-UUGPkwnRp4f-9JqvyJZtpibEjKFI,32122
48
- includecpp-3.7.20.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
- includecpp-3.7.20.dist-info/entry_points.txt,sha256=6A5Mif9gi0139Bf03W5plAb3wnAgbNaEVe1HJoGE-2o,59
50
- includecpp-3.7.20.dist-info/top_level.txt,sha256=RFUaR1KG-M6mCYwP6w4ydP5Cgc8yNbP78jxGAvyjMa8,11
51
- includecpp-3.7.20.dist-info/RECORD,,
46
+ includecpp-3.7.21.dist-info/licenses/LICENSE,sha256=fWCsGGsiWZir0UzDd20Hh-3wtRyk1zqUntvtVuAWhvc,1093
47
+ includecpp-3.7.21.dist-info/METADATA,sha256=3M6Vqu-_8hFmQBEst3XiQFaISZ70aTT2BGahWg-Bmpk,32122
48
+ includecpp-3.7.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
+ includecpp-3.7.21.dist-info/entry_points.txt,sha256=6A5Mif9gi0139Bf03W5plAb3wnAgbNaEVe1HJoGE-2o,59
50
+ includecpp-3.7.21.dist-info/top_level.txt,sha256=RFUaR1KG-M6mCYwP6w4ydP5Cgc8yNbP78jxGAvyjMa8,11
51
+ includecpp-3.7.21.dist-info/RECORD,,