pythonstl 0.1.4__cp311-cp311-win_amd64.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.
@@ -0,0 +1,449 @@
1
+ Metadata-Version: 2.4
2
+ Name: pythonstl
3
+ Version: 0.1.4
4
+ Classifier: Development Status :: 4 - Beta
5
+ Classifier: Intended Audience :: Developers
6
+ Classifier: License :: OSI Approved :: MIT License
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: Programming Language :: Python :: 3.10
9
+ Classifier: Programming Language :: Python :: 3.11
10
+ Classifier: Programming Language :: Python :: 3.12
11
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
12
+ Classifier: Topic :: Software Development :: Libraries
13
+ Classifier: Typing :: Typed
14
+ Classifier: Operating System :: OS Independent
15
+ License-File: LICENSE
16
+ Summary: C++ STL-style containers implemented in Python using the Facade Design Pattern
17
+ Keywords: stl,data-structures,containers,facade-pattern,cpp-stl,standard-template-library
18
+ Author-email: PySTL Contributors <pythonstl@example.com>
19
+ License: MIT
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
22
+ Project-URL: Documentation, https://github.com/AnshMNSoni/STL#readme
23
+ Project-URL: Homepage, https://github.com/AnshMNSoni/STL
24
+ Project-URL: Issues, https://github.com/AnshMNSoni/STL/issues
25
+ Project-URL: Repository, https://github.com/AnshMNSoni/STL
26
+
27
+ # PythonSTL - Python Standard Template Library
28
+
29
+ [![Downloads](https://static.pepy.tech/badge/pythonstl)](https://pepy.tech/project/pythonstl)
30
+ [![Python Version](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
31
+ [![PyPI version](https://img.shields.io/pypi/v/pythonstl.svg)](https://pypi.org/project/pythonstl/)
32
+ [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
33
+ <br>
34
+
35
+ <div align="center">
36
+ <img width="500" height="500" alt="pythonstl_logo" src="https://github.com/user-attachments/assets/7ef83b5f-d005-48e0-a186-05dd7e2221c2" />
37
+ </div><br>
38
+
39
+ A Python package that replicates C++ STL-style data structures using the **Facade Design Pattern**. PythonSTL provides clean, familiar interfaces for developers coming from C++ while maintaining Pythonic best practices.
40
+
41
+ ## Features
42
+
43
+ - **C++ STL Compliance**: Exact method names and semantics matching C++ STL
44
+ - **Facade Design Pattern**: Clean separation between interface and implementation
45
+ - **Iterator Support**: STL-style iterators (begin, end, rbegin, rend) and Python iteration
46
+ - **Python Integration**: Magic methods (__len__, __bool__, __contains__, __repr__, __eq__)
47
+ - **Type Safety**: Full type hints throughout the codebase
48
+ - **Copy Operations**: Deep copy support with copy(), __copy__(), and __deepcopy__()
49
+ - **Comprehensive Documentation**: Detailed docstrings with time complexity annotations
50
+ - **Production Quality**: Proper error handling, PEP8 compliance, and extensive testing
51
+ - **Zero Dependencies**: Core package has no external dependencies
52
+
53
+ ## 📦 Installation
54
+
55
+ ```bash
56
+ pip install pythonstl
57
+ ```
58
+
59
+ Or install from source:
60
+
61
+ ```bash
62
+ git clone https://github.com/AnshMNSoni/PythonSTL.git
63
+ cd PythonSTL
64
+ pip install -e .
65
+ ```
66
+
67
+ ## Quick Start
68
+
69
+ ```python
70
+ from pythonstl import stack, queue, vector, stl_set, stl_map, priority_queue
71
+
72
+ # Stack (LIFO) - Now with Python magic methods!
73
+ s = stack()
74
+ s.push(10)
75
+ s.push(20)
76
+ print(s.top()) # 20
77
+ print(len(s)) # 2 - Python len() support
78
+ print(bool(s)) # True - Python bool() support
79
+
80
+ # Vector (Dynamic Array) - With iterators!
81
+ v = vector()
82
+ v.push_back(100)
83
+ v.push_back(200)
84
+ v.push_back(300)
85
+ v.reserve(1000) # Pre-allocate capacity
86
+ print(len(v)) # 3
87
+ print(200 in v) # True - Python 'in' operator
88
+
89
+ # Iterate using STL-style iterators
90
+ for elem in v.begin():
91
+ print(elem)
92
+
93
+ # Or use Python iteration
94
+ for elem in v:
95
+ print(elem)
96
+
97
+ # Set (Unique Elements) - With magic methods
98
+ s = stl_set()
99
+ s.insert(5)
100
+ s.insert(10)
101
+ print(5 in s) # True
102
+ print(len(s)) # 2
103
+
104
+ # Map (Key-Value Pairs) - With iteration
105
+ m = stl_map()
106
+ m.insert("key1", 100)
107
+ m.insert("key2", 200)
108
+ print("key1" in m) # True
109
+ for key, value in m:
110
+ print(f"{key}: {value}")
111
+
112
+ # Priority Queue - With comparator support
113
+ pq_max = priority_queue(comparator="max") # Max-heap (default)
114
+ pq_min = priority_queue(comparator="min") # Min-heap
115
+ pq_max.push(30)
116
+ pq_max.push(10)
117
+ pq_max.push(20)
118
+ print(pq_max.top()) # 30
119
+ ```
120
+
121
+ ## Data Structures
122
+
123
+ ### Stack
124
+
125
+ LIFO (Last-In-First-Out) container adapter.
126
+
127
+ **Methods:**
128
+ - `push(value)` - Add element to top
129
+ - `pop()` - Remove top element
130
+ - `top()` - Access top element
131
+ - `empty()` - Check if empty
132
+ - `size()` - Get number of elements
133
+ - `copy()` - Create deep copy
134
+
135
+ **Python Integration:**
136
+ - `len(s)` - Get size
137
+ - `bool(s)` - Check if non-empty
138
+ - `repr(s)` - String representation
139
+ - `s1 == s2` - Equality comparison
140
+
141
+ ### Queue
142
+
143
+ FIFO (First-In-First-Out) container adapter.
144
+
145
+ **Methods:**
146
+ - `push(value)` - Add element to back
147
+ - `pop()` - Remove front element
148
+ - `front()` - Access front element
149
+ - `back()` - Access back element
150
+ - `empty()` - Check if empty
151
+ - `size()` - Get number of elements
152
+ - `copy()` - Create deep copy
153
+
154
+ **Python Integration:**
155
+ - `len(q)` - Get size
156
+ - `bool(q)` - Check if non-empty
157
+ - `repr(q)` - String representation
158
+ - `q1 == q2` - Equality comparison
159
+
160
+ ### Vector
161
+
162
+ Dynamic array with capacity management.
163
+
164
+ **Methods:**
165
+ - `push_back(value)` - Add element to end
166
+ - `pop_back()` - Remove last element
167
+ - `at(index)` - Access element with bounds checking
168
+ - `insert(position, value)` - Insert element at position
169
+ - `erase(position)` - Remove element at position
170
+ - `clear()` - Remove all elements
171
+ - `reserve(capacity)` - Pre-allocate capacity
172
+ - `shrink_to_fit()` - Reduce capacity to size
173
+ - `size()` - Get number of elements
174
+ - `capacity()` - Get current capacity
175
+ - `empty()` - Check if empty
176
+ - `begin()` - Get forward iterator
177
+ - `end()` - Get end iterator
178
+ - `rbegin()` - Get reverse iterator
179
+ - `rend()` - Get reverse end iterator
180
+ - `copy()` - Create deep copy
181
+
182
+ **Python Integration:**
183
+ - `len(v)` - Get size
184
+ - `bool(v)` - Check if non-empty
185
+ - `value in v` - Check if value exists
186
+ - `repr(v)` - String representation
187
+ - `v1 == v2` - Equality comparison
188
+ - `v1 < v2` - Lexicographic comparison
189
+ - `for elem in v` - Python iteration
190
+
191
+ ### Set
192
+
193
+ Associative container storing unique elements.
194
+
195
+ **Methods:**
196
+ - `insert(value)` - Add element
197
+ - `erase(value)` - Remove element
198
+ - `find(value)` - Check if element exists
199
+ - `empty()` - Check if empty
200
+ - `size()` - Get number of elements
201
+ - `begin()` - Get iterator
202
+ - `end()` - Get end iterator
203
+ - `copy()` - Create deep copy
204
+
205
+ **Python Integration:**
206
+ - `len(s)` - Get size
207
+ - `bool(s)` - Check if non-empty
208
+ - `value in s` - Check if value exists
209
+ - `repr(s)` - String representation
210
+ - `s1 == s2` - Equality comparison
211
+ - `for elem in s` - Python iteration
212
+
213
+ ### Map
214
+
215
+ Associative container storing key-value pairs.
216
+
217
+ **Methods:**
218
+ - `insert(key, value)` - Add or update key-value pair
219
+ - `erase(key)` - Remove key-value pair
220
+ - `find(key)` - Check if key exists
221
+ - `at(key)` - Access value by key
222
+ - `empty()` - Check if empty
223
+ - `size()` - Get number of pairs
224
+ - `begin()` - Get iterator
225
+ - `end()` - Get end iterator
226
+ - `copy()` - Create deep copy
227
+
228
+ **Python Integration:**
229
+ - `len(m)` - Get size
230
+ - `bool(m)` - Check if non-empty
231
+ - `key in m` - Check if key exists
232
+ - `repr(m)` - String representation
233
+ - `m1 == m2` - Equality comparison
234
+ - `for key, value in m` - Python iteration
235
+
236
+ ### Priority Queue
237
+
238
+ Container adapter providing priority-based access.
239
+
240
+ **Methods:**
241
+ - `push(value)` - Insert element
242
+ - `pop()` - Remove top element
243
+ - `top()` - Access top element
244
+ - `empty()` - Check if empty
245
+ - `size()` - Get number of elements
246
+ - `copy()` - Create deep copy
247
+
248
+ **Comparator Support:**
249
+ - `priority_queue(comparator="max")` - Max-heap (default)
250
+ - `priority_queue(comparator="min")` - Min-heap
251
+
252
+ **Python Integration:**
253
+ - `len(pq)` - Get size
254
+ - `bool(pq)` - Check if non-empty
255
+ - `repr(pq)` - String representation
256
+ - `pq1 == pq2` - Equality comparison
257
+
258
+ ## Time Complexity Reference
259
+
260
+ | Container | Operation | Complexity |
261
+ |-----------|-----------|------------|
262
+ | **Stack** | push() | O(1) amortized |
263
+ | | pop() | O(1) |
264
+ | | top() | O(1) |
265
+ | **Queue** | push() | O(1) |
266
+ | | pop() | O(1) |
267
+ | | front() / back() | O(1) |
268
+ | **Vector** | push_back() | O(1) amortized |
269
+ | | pop_back() | O(1) |
270
+ | | at() | O(1) |
271
+ | | insert() | O(n) |
272
+ | | erase() | O(n) |
273
+ | | reserve() | O(1) |
274
+ | | shrink_to_fit() | O(1) |
275
+ | **Set** | insert() | O(1) average |
276
+ | | erase() | O(1) average |
277
+ | | find() | O(1) average |
278
+ | **Map** | insert() | O(1) average |
279
+ | | erase() | O(1) average |
280
+ | | find() | O(1) average |
281
+ | | at() | O(1) average |
282
+ | **Priority Queue** | push() | O(log n) |
283
+ | | pop() | O(log n) |
284
+ | | top() | O(1) |
285
+
286
+ ## 🏗️ Architecture
287
+
288
+ PythonSTL follows the **Facade Design Pattern** with three layers:
289
+
290
+ 1. **Core Layer** (`pythonstl/core/`)
291
+ - Base classes and type definitions
292
+ - Custom exceptions
293
+ - Iterator classes
294
+
295
+ 2. **Implementation Layer** (`pythonstl/implementations/`)
296
+ - Private implementation classes (prefixed with `_`)
297
+ - Efficient use of Python built-ins
298
+ - Not intended for direct user access
299
+
300
+ 3. **Facade Layer** (`pythonstl/facade/`)
301
+ - Public-facing classes
302
+ - Clean, STL-compliant API
303
+ - Delegates to implementation layer
304
+
305
+ This architecture ensures:
306
+ - **Encapsulation**: Internal implementation is hidden
307
+ - **Maintainability**: Easy to modify internals without breaking API
308
+ - **Testability**: Each layer can be tested independently
309
+
310
+ ## Thread Safety
311
+
312
+ **Important:** PythonSTL containers are **NOT thread-safe** by default. If you need to use them in a multi-threaded environment, you must provide your own synchronization (e.g., using `threading.Lock`).
313
+
314
+ ```python
315
+ import threading
316
+ from pythonstl import stack
317
+
318
+ s = stack()
319
+ lock = threading.Lock()
320
+
321
+ def thread_safe_push(value):
322
+ with lock:
323
+ s.push(value)
324
+ ```
325
+
326
+ ## Design Decisions
327
+
328
+ ### Why Facade Pattern?
329
+
330
+ - **Clean API**: Users interact with simple, well-defined interfaces
331
+ - **Flexibility**: Internal implementation can change without affecting users
332
+ - **Type Safety**: Facade layer enforces type contracts
333
+ - **Error Handling**: Consistent error messages across all containers
334
+
335
+ ### Why STL Naming?
336
+
337
+ - **Familiarity**: C++ developers can use PythonSTL immediately
338
+ - **Consistency**: Predictable method names across containers
339
+ - **Documentation**: Extensive C++ STL documentation applies
340
+
341
+ ### Python Integration
342
+
343
+ Full Python integration while maintaining STL compatibility:
344
+ - Magic methods for natural Python usage
345
+ - Iterator protocol support
346
+ - Copy protocol support
347
+ - Maintains backward compatibility
348
+
349
+ ## 📊 Performance Benchmarks
350
+
351
+ PythonSTL includes a compiled Rust backend (built with PyO3 and Maturin) for high-performance operations, alongside pure-Python fallbacks. Below are the actual performance comparison results against pure-Python and native C++ (compiled with `g++ -O3`).
352
+
353
+ ### 1. Containers Performance (50,000 Operations)
354
+
355
+ | Container Class | Pure Python | Python + Rust | Speedup Status | Design / Algorithmic Trade-off |
356
+ | :--- | :--- | :--- | :--- | :--- |
357
+ | **Stack** | 0.2470s | 0.1604s | **1.54x faster** | Linear stack operations. Limited by FFI call overhead. |
358
+ | **Queue** | 0.2547s | 0.1946s | **1.31x faster** | FIFO operations. Limited by FFI call overhead. |
359
+ | **Vector** | 0.0050s | 0.0045s | **1.10x faster** | Push_back & random access indices. Limited by FFI. |
360
+ | **Set** | 0.0337s | 0.1844s | *0.18x faster* | **Sorted Set vs Unordered Hash Set** (replicates C++ B-Tree structure) |
361
+ | **Map** | 0.0421s | 0.2104s | *0.20x faster* | **Sorted Map vs Unordered Hash Map** (replicates C++ B-Tree structure) |
362
+ | **Priority Queue**| 0.0584s | 0.0900s | *0.65x faster* | Custom binary heap vs. C-optimized `heapq` module. |
363
+
364
+ * **Sorted Trees vs. Hash Tables**: Python's native `set` and `dict` are highly optimized $O(1)$ hash tables written in C. PythonSTL sets/maps replicate C++'s `std::set`/`std::map` using sorted trees (`BTreeSet`/`BTreeMap`), which run in $O(\log N)$ and sort keys.
365
+ * **FFI overhead**: Storing arbitrary Python objects in Rust requires acquiring the GIL and calling back into the Python VM for comparisons, creating high FFI boundaries.
366
+
367
+ ### 2. Algorithms Suite
368
+
369
+ | Algorithm Name | Pure Python (Middle Pivot) | Python + Rust | Pure C++ (O3) | Rust Speedup | Design & FFI Insights |
370
+ | :--- | :--- | :--- | :--- | :--- | :--- |
371
+ | **next_permutation** | 0.3158s | 0.2530s | 0.0020s | **1.2x** | Lexicographical rearrangement. Limited by FFI conversions. |
372
+ | **nth_element** | 0.0068s | 0.0047s | 0.0000s | **1.5x** | Quickselect median find. (Previously **70.85s** before optimization). |
373
+ | **partition** | 0.0193s | 0.0197s | 0.0000s | **1.0x** | Lambda-predicate partitioning. Dominated by FFI callback overhead. |
374
+
375
+ * **Algorithmic Pivot Vulnerabilities**: A naive Lomuto partition (`pivot = arr[right]`) causes $O(N^2)$ worst-case time on already-sorted or reversed lists (taking **70.85s**). By switching PythonSTL to a middle-pivot (`arr[mid]`), we restore $O(N)$ average time (**0.0068s**).
376
+
377
+ ### 3. Binary Search (5,000 Queries on 1,000,000 elements)
378
+
379
+ | Search Mode / Comparator | Pure Python | Python + Rust | Pure C++ (O3) | Rust Speedup | Systems & Design Insights |
380
+ | :--- | :--- | :--- | :--- | :--- | :--- |
381
+ | **Standard (`<` comparison)** | 0.0214s | 0.0028s | 0.0000s | **7.5x** | Preserves $O(\log N)$ via direct list indexing. |
382
+ | **Custom Comparator (lambda)**| 0.0251s | 0.0074s | N/A | **3.4x** | Overcomes Python loop overhead despite FFI callbacks. |
383
+
384
+ * **Direct Indexing**: Instead of extracting/copying the entire list (an $O(N)$ operation), the Rust backend uses direct GIL-bound indexing (`arr.get_item(mid)`), maintaining the strict $O(\log N)$ search complexity.
385
+
386
+
387
+ ## Testing
388
+
389
+ Run the test suite:
390
+
391
+ ```bash
392
+ # Install test dependencies
393
+ pip install pytest pytest-cov
394
+
395
+ # Run tests
396
+ pytest tests/
397
+
398
+ # Run with coverage
399
+ pytest tests/ --cov=pythonstl --cov-report=html
400
+ ```
401
+
402
+ ## 🛠️ Development
403
+
404
+ ### Setup
405
+
406
+ ```bash
407
+ git clone https://github.com/AnshMNSoni/PythonSTL.git
408
+ cd PythonSTL
409
+ pip install -e ".[dev]"
410
+ ```
411
+
412
+ ### Code Quality
413
+
414
+ ```bash
415
+ # Type checking
416
+ mypy pythonstl/
417
+
418
+ # Linting
419
+ flake8 pythonstl/
420
+
421
+ # Run all checks
422
+ pytest && mypy pythonstl/ && flake8 pythonstl/
423
+ ```
424
+
425
+ ## Note
426
+ ➡️ The goal is NOT to replace Python built-ins.<br>
427
+ ➡️ The goal is to provide: 1) Conceptual clarity 2) STL familiarity for C++ developers 3) A structured learning bridge for DSA <br>
428
+
429
+ ## 📝 License
430
+
431
+ MIT License - see LICENSE file for details.
432
+
433
+ ## 🤝 Contributing
434
+
435
+ Contributions are welcome! Please:
436
+ 1. Fork the repository
437
+ 2. Create a feature branch
438
+ 3. Add tests for new features
439
+ 4. Ensure all tests pass
440
+ 5. Submit a pull request
441
+
442
+ ## Thankyou
443
+ ## Contact
444
+
445
+ - GitHub: [@AnshMNSoni](https://github.com/AnshMNSoni)
446
+ - Issues: [GitHub Issues](https://github.com/AnshMNSoni/PythonSTL/issues)
447
+
448
+ **PythonSTL v0.1.1** - Bringing C++ STL elegance to Python
449
+
@@ -0,0 +1,29 @@
1
+ pythonstl/__init__.py,sha256=wgAOHPx1Y5BtyyamjC9D_GqH7fsnsYgIAuHMOiGaS4g,1508
2
+ pythonstl/_rust.cp311-win_amd64.pyd,sha256=UtA0KGxgxvvOCv6chRbwz4Lgo5YleV4cR_jTgGBr3DE,423424
3
+ pythonstl/core/__init__.py,sha256=81LULJtWHKaiJNbRnpVt8-Uz8E-7LdyeRxJQmwhnSDU,609
4
+ pythonstl/core/base.py,sha256=2ubTWKFRG_JusR0L2OKuKgMXtDvJ9ArVps0q4tEWmaQ,1177
5
+ pythonstl/core/exceptions.py,sha256=pg5ss907qymfj1DldO_rqUJPnfd4KCCxl6SMSgAUthI,1577
6
+ pythonstl/core/iterator.py,sha256=jQ_ZG9x5zVi66buaFYbLKfkE0N3D0-IdIHLBdIBNHfo,4319
7
+ pythonstl/facade/__init__.py,sha256=2zWzJYoIT6kerkKacDbIUQK5UCywxpvuuamauZv1NS0,307
8
+ pythonstl/facade/algorithms.py,sha256=0vbi8qHxnQl827VokS8rai8OZ4MKdj8COTmz4WApQbI,10067
9
+ pythonstl/facade/map.py,sha256=XXzzTnwF9vCc0mTQ1d8B8VkKyW0UcplwU-1FJI8Psn8,7591
10
+ pythonstl/facade/priority_queue.py,sha256=KxSWuJwMqYiF9YjPCjPDpwCgdBYcauVKy7SBttnFd8Q,6389
11
+ pythonstl/facade/queue.py,sha256=6IZtUE8cf0Lv6Fve00E9mWczj1CGnAg-F55hn8upLOA,5821
12
+ pythonstl/facade/set.py,sha256=VJ7kspjJT8JPhsGpr2aZMycPsC2zEaGGIHDY8VaCWGI,6873
13
+ pythonstl/facade/stack.py,sha256=mE26wLbqYz0KK3GSDMTRVC7N389TfMNePBxOxYqCvO8,5400
14
+ pythonstl/facade/vector.py,sha256=J8fpEhKERHAB7wLlVIt1eXZnrYZMRR464QpBkQYan6k,11123
15
+ pythonstl/implementations/__init__.py,sha256=rOIZG5NCgUaOup2FkKQX4n27hcMGGpDSxdPWDauKTts,71
16
+ pythonstl/implementations/associative/__init__.py,sha256=0oJQgl46lIyGGHEMlO7Yj7aNo-pNLp-KdTPiaU0rhmk,157
17
+ pythonstl/implementations/associative/_map_impl.py,sha256=OVrKZ9r-7aJjFDNjiiSfN53UM9LOj33YFi-TNoTMu9Q,3875
18
+ pythonstl/implementations/associative/_set_impl.py,sha256=zeYslC9POFL2EfZh-2io4BpPfwgJTRbw6SJ3aFcVCHU,3187
19
+ pythonstl/implementations/heaps/__init__.py,sha256=0LzowSWclW5tQp4PYwXI8lvileUabUgSqVKxzqe5sc0,142
20
+ pythonstl/implementations/heaps/_priority_queue_impl.py,sha256=oEp-kqVIhawKfpqD9dbcOOrE3rPzNFYvb0blGQq4Zqc,3269
21
+ pythonstl/implementations/linear/__init__.py,sha256=tQEb-ET187aI52zutrPeDBOgan-2YVn0JridSjSuAbw,218
22
+ pythonstl/implementations/linear/_queue_impl.py,sha256=o6LUjuWUGRdBXbU5uVoI9UAHAtRIrrA8fAH62n-pyYA,2683
23
+ pythonstl/implementations/linear/_stack_impl.py,sha256=YbfS_bCfwL-MirygNDsBoxUr4JlIQRVllWXJgfjcFIQ,2230
24
+ pythonstl/implementations/linear/_vector_impl.py,sha256=EkrdVYQ2Bx-ODYSGTQchxlpLaoUSvBShccuucNgc_60,6633
25
+ pythonstl-0.1.4.dist-info/METADATA,sha256=M8we3u8BkBBY9D9f9m6E7m9Md865Iv-5--Jn-1d3eKI,15130
26
+ pythonstl-0.1.4.dist-info/WHEEL,sha256=MNbZA0Qxe2sofZd_Bc8WoTBs5-iWa5LbpPbLucFxOR4,97
27
+ pythonstl-0.1.4.dist-info/licenses/LICENSE,sha256=ND9L_NX7XUK60wPiNv7APrznXh12mnDlp6G-hmkbgtw,1096
28
+ pythonstl-0.1.4.dist-info/sboms/pythonstl.cyclonedx.json,sha256=Cf0q4R1lI9RJmSUVO61C-Ntg2_jmDihzmzmStbCyzD4,32529
29
+ pythonstl-0.1.4.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: maturin (1.14.0)
3
+ Root-Is-Purelib: false
4
+ Tag: cp311-cp311-win_amd64
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PySTL Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.