PyCyBase 0.1.8.post4__cp313-cp313-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.
- cbase/__infra__.pxd +6 -0
- cbase/__init__.pxd +6 -0
- cbase/__init__.py +28 -0
- cbase/allocator_protocol/__infra__.pxd +58 -0
- cbase/allocator_protocol/__init__.pxd +58 -0
- cbase/allocator_protocol/__init__.py +45 -0
- cbase/allocator_protocol/c_allocator_protocol.c +31818 -0
- cbase/allocator_protocol/c_allocator_protocol.cp313-win_amd64.pyd +0 -0
- cbase/allocator_protocol/c_allocator_protocol.h +352 -0
- cbase/allocator_protocol/c_allocator_protocol.pxd +64 -0
- cbase/allocator_protocol/c_allocator_protocol.pyi +144 -0
- cbase/allocator_protocol/c_allocator_protocol.pyx +209 -0
- cbase/allocator_protocol/c_heap_allocator.c +38144 -0
- cbase/allocator_protocol/c_heap_allocator.cp313-win_amd64.pyd +0 -0
- cbase/allocator_protocol/c_heap_allocator.h +444 -0
- cbase/allocator_protocol/c_heap_allocator.pxd +97 -0
- cbase/allocator_protocol/c_heap_allocator.pyi +161 -0
- cbase/allocator_protocol/c_heap_allocator.pyx +300 -0
- cbase/allocator_protocol/c_nt_shm_allocator.c +33399 -0
- cbase/allocator_protocol/c_nt_shm_allocator.cp313-win_amd64.pyd +0 -0
- cbase/allocator_protocol/c_nt_shm_allocator.h +996 -0
- cbase/allocator_protocol/c_nt_shm_allocator.pxd +102 -0
- cbase/allocator_protocol/c_nt_shm_allocator.pyx +223 -0
- cbase/allocator_protocol/c_shm_allocator.h +1168 -0
- cbase/allocator_protocol/c_shm_allocator.pxd +142 -0
- cbase/allocator_protocol/c_shm_allocator.pyi +299 -0
- cbase/allocator_protocol/c_shm_allocator.pyx +442 -0
- cbase/allocator_protocol/c_shm_comp.c +4643 -0
- cbase/allocator_protocol/c_shm_comp.cp313-win_amd64.pyd +0 -0
- cbase/allocator_protocol/c_shm_comp.h +49 -0
- cbase/allocator_protocol/c_shm_comp.pxd +38 -0
- cbase/allocator_protocol/c_shm_comp.pyx +1 -0
- cbase/backports/__infra__.pxd +17 -0
- cbase/backports/__init__.pxd +17 -0
- cbase/backports/__init__.py +9 -0
- cbase/backports/pydict.h +55 -0
- cbase/backports/pydict.pxd +5 -0
- cbase/backports/pylong.c +9946 -0
- cbase/backports/pylong.cp313-win_amd64.pyd +0 -0
- cbase/backports/pylong.h +79 -0
- cbase/backports/pylong.pxd +23 -0
- cbase/backports/pylong.pyx +61 -0
- cbase/bytemap/__infra__.pxd +42 -0
- cbase/bytemap/__init__.pxd +42 -0
- cbase/bytemap/__init__.py +21 -0
- cbase/bytemap/c_bytemap.c +52076 -0
- cbase/bytemap/c_bytemap.cp313-win_amd64.pyd +0 -0
- cbase/bytemap/c_bytemap.h +867 -0
- cbase/bytemap/c_bytemap.pxd +370 -0
- cbase/bytemap/c_bytemap.pyx +1758 -0
- cbase/bytemap/xxh3.h +55 -0
- cbase/bytemap/xxhash.c +42 -0
- cbase/bytemap/xxhash.h +7487 -0
- cbase/env.c +11109 -0
- cbase/env.cp313-win_amd64.pyd +0 -0
- cbase/env.pxd +8 -0
- cbase/env.pyi +48 -0
- cbase/env.pyx +46 -0
- cbase/includes/cbase/allocator_protocol/c_allocator_protocol.c +31818 -0
- cbase/includes/cbase/allocator_protocol/c_allocator_protocol.h +352 -0
- cbase/includes/cbase/allocator_protocol/c_heap_allocator.c +38144 -0
- cbase/includes/cbase/allocator_protocol/c_heap_allocator.h +444 -0
- cbase/includes/cbase/allocator_protocol/c_nt_shm_allocator.c +33399 -0
- cbase/includes/cbase/allocator_protocol/c_nt_shm_allocator.h +996 -0
- cbase/includes/cbase/allocator_protocol/c_shm_allocator.h +1168 -0
- cbase/includes/cbase/allocator_protocol/c_shm_comp.c +4643 -0
- cbase/includes/cbase/allocator_protocol/c_shm_comp.h +49 -0
- cbase/includes/cbase/backports/pydict.h +55 -0
- cbase/includes/cbase/backports/pylong.c +9946 -0
- cbase/includes/cbase/backports/pylong.h +79 -0
- cbase/includes/cbase/bytemap/c_bytemap.c +52076 -0
- cbase/includes/cbase/bytemap/c_bytemap.h +867 -0
- cbase/includes/cbase/bytemap/xxh3.h +55 -0
- cbase/includes/cbase/bytemap/xxhash.c +42 -0
- cbase/includes/cbase/bytemap/xxhash.h +7487 -0
- cbase/includes/cbase/env.c +11109 -0
- cbase/includes/cbase/int128.h +81 -0
- cbase/includes/cbase/intern_string/c_intern_string.c +28081 -0
- cbase/includes/cbase/intern_string/c_intern_string.h +614 -0
- cbase/includes/cbase/nt/pthread_nt_compat.h +102 -0
- cbase/includes/cbase/nt/regex_nt_compat.h +133 -0
- cbase/includes/cbase/nt/time_sched_nt_compat.h +32 -0
- cbase/int128.h +81 -0
- cbase/int128.pxd +15 -0
- cbase/intern_string/BENCHMARK.md +157 -0
- cbase/intern_string/__infra__.pxd +11 -0
- cbase/intern_string/__init__.pxd +11 -0
- cbase/intern_string/__init__.py +19 -0
- cbase/intern_string/c_intern_string.c +28081 -0
- cbase/intern_string/c_intern_string.cp313-win_amd64.pyd +0 -0
- cbase/intern_string/c_intern_string.h +614 -0
- cbase/intern_string/c_intern_string.pxd +118 -0
- cbase/intern_string/c_intern_string.pyi +376 -0
- cbase/intern_string/c_intern_string.pyx +765 -0
- cbase/nt/pthread_nt_compat.h +102 -0
- cbase/nt/regex_nt_compat.h +133 -0
- cbase/nt/time_sched_nt_compat.h +32 -0
- pycybase-0.1.8.post4.dist-info/METADATA +180 -0
- pycybase-0.1.8.post4.dist-info/RECORD +101 -0
- pycybase-0.1.8.post4.dist-info/WHEEL +5 -0
- pycybase-0.1.8.post4.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#ifndef PTHREAD_NT_COMPAT_H
|
|
2
|
+
#define PTHREAD_NT_COMPAT_H
|
|
3
|
+
|
|
4
|
+
#ifndef _WIN32
|
|
5
|
+
#error "pthread_nt_compat.h is intended for Windows builds only"
|
|
6
|
+
#endif
|
|
7
|
+
|
|
8
|
+
#include <errno.h>
|
|
9
|
+
#include <limits.h>
|
|
10
|
+
#include <time.h>
|
|
11
|
+
|
|
12
|
+
#ifndef WIN32_LEAN_AND_MEAN
|
|
13
|
+
#define WIN32_LEAN_AND_MEAN
|
|
14
|
+
#endif
|
|
15
|
+
#include <windows.h>
|
|
16
|
+
|
|
17
|
+
typedef CRITICAL_SECTION pthread_mutex_t;
|
|
18
|
+
typedef void pthread_mutexattr_t;
|
|
19
|
+
typedef CONDITION_VARIABLE pthread_cond_t;
|
|
20
|
+
typedef void pthread_condattr_t;
|
|
21
|
+
|
|
22
|
+
static inline DWORD pthread_nt_timeout_ms(const struct timespec* abstime) {
|
|
23
|
+
if (!abstime) return INFINITE;
|
|
24
|
+
|
|
25
|
+
struct timespec now;
|
|
26
|
+
if (timespec_get(&now, TIME_UTC) != TIME_UTC) return 0;
|
|
27
|
+
|
|
28
|
+
time_t sec = abstime->tv_sec - now.tv_sec;
|
|
29
|
+
long nsec = abstime->tv_nsec - now.tv_nsec;
|
|
30
|
+
if (nsec < 0) { sec -= 1; nsec += 1000000000L; }
|
|
31
|
+
if (sec < 0 || (sec == 0 && nsec <= 0)) return 0;
|
|
32
|
+
|
|
33
|
+
unsigned long long ms = (unsigned long long) sec * 1000ULL;
|
|
34
|
+
ms += (unsigned long long) ((nsec + 999999L) / 1000000L);
|
|
35
|
+
if (ms > (unsigned long long) INFINITE - 1ULL) return INFINITE - 1;
|
|
36
|
+
return (DWORD) ms;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static inline int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr) {
|
|
40
|
+
(void) attr;
|
|
41
|
+
if (!mutex) return EINVAL;
|
|
42
|
+
InitializeCriticalSection(mutex);
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static inline int pthread_mutex_lock(pthread_mutex_t* mutex) {
|
|
47
|
+
if (!mutex) return EINVAL;
|
|
48
|
+
EnterCriticalSection(mutex);
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static inline int pthread_mutex_unlock(pthread_mutex_t* mutex) {
|
|
53
|
+
if (!mutex) return EINVAL;
|
|
54
|
+
LeaveCriticalSection(mutex);
|
|
55
|
+
return 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static inline int pthread_mutex_destroy(pthread_mutex_t* mutex) {
|
|
59
|
+
if (!mutex) return EINVAL;
|
|
60
|
+
DeleteCriticalSection(mutex);
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static inline int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* attr) {
|
|
65
|
+
(void) attr;
|
|
66
|
+
if (!cond) return EINVAL;
|
|
67
|
+
InitializeConditionVariable(cond);
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
static inline int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex) {
|
|
72
|
+
if (!cond || !mutex) return EINVAL;
|
|
73
|
+
if (SleepConditionVariableCS(cond, mutex, INFINITE)) return 0;
|
|
74
|
+
return EINVAL;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static inline int pthread_cond_timedwait(pthread_cond_t* cond, pthread_mutex_t* mutex, const struct timespec* abstime) {
|
|
78
|
+
if (!cond || !mutex) return EINVAL;
|
|
79
|
+
DWORD timeout_ms = pthread_nt_timeout_ms(abstime);
|
|
80
|
+
if (SleepConditionVariableCS(cond, mutex, timeout_ms)) return 0;
|
|
81
|
+
if (GetLastError() == ERROR_TIMEOUT) return ETIMEDOUT;
|
|
82
|
+
return EINVAL;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static inline int pthread_cond_signal(pthread_cond_t* cond) {
|
|
86
|
+
if (!cond) return EINVAL;
|
|
87
|
+
WakeConditionVariable(cond);
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
static inline int pthread_cond_broadcast(pthread_cond_t* cond) {
|
|
92
|
+
if (!cond) return EINVAL;
|
|
93
|
+
WakeAllConditionVariable(cond);
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
static inline int pthread_cond_destroy(pthread_cond_t* cond) {
|
|
98
|
+
(void) cond;
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
#endif /* PTHREAD_NT_COMPAT_H */
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#ifndef REGEX_NT_COMPAT_H
|
|
2
|
+
#define REGEX_NT_COMPAT_H
|
|
3
|
+
|
|
4
|
+
#ifndef _WIN32
|
|
5
|
+
#error "regex_nt_compat.h is intended for Windows builds only"
|
|
6
|
+
#endif
|
|
7
|
+
|
|
8
|
+
#include <errno.h>
|
|
9
|
+
#include <stddef.h>
|
|
10
|
+
|
|
11
|
+
#if defined(__has_include)
|
|
12
|
+
#if __has_include(<Python.h>)
|
|
13
|
+
#include <Python.h>
|
|
14
|
+
#define REGEX_NT_COMPAT_HAS_PYTHON 1
|
|
15
|
+
#else
|
|
16
|
+
#define REGEX_NT_COMPAT_HAS_PYTHON 0
|
|
17
|
+
#endif
|
|
18
|
+
#else
|
|
19
|
+
#include <Python.h>
|
|
20
|
+
#define REGEX_NT_COMPAT_HAS_PYTHON 1
|
|
21
|
+
#endif
|
|
22
|
+
|
|
23
|
+
#ifndef REG_EXTENDED
|
|
24
|
+
#define REG_EXTENDED 1
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
#ifndef REG_NOMATCH
|
|
28
|
+
#define REG_NOMATCH 1
|
|
29
|
+
#endif
|
|
30
|
+
|
|
31
|
+
#ifndef REG_BADPAT
|
|
32
|
+
#define REG_BADPAT 2
|
|
33
|
+
#endif
|
|
34
|
+
|
|
35
|
+
typedef struct regex_t {
|
|
36
|
+
PyObject* compiled;
|
|
37
|
+
} regex_t;
|
|
38
|
+
|
|
39
|
+
typedef struct regmatch_t {
|
|
40
|
+
ptrdiff_t rm_so;
|
|
41
|
+
ptrdiff_t rm_eo;
|
|
42
|
+
} regmatch_t;
|
|
43
|
+
|
|
44
|
+
#if REGEX_NT_COMPAT_HAS_PYTHON
|
|
45
|
+
|
|
46
|
+
static inline int regcomp(regex_t* regex, const char* pattern, int cflags) {
|
|
47
|
+
(void) cflags;
|
|
48
|
+
if (!regex || !pattern) {
|
|
49
|
+
return REG_BADPAT;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
regex->compiled = NULL;
|
|
53
|
+
|
|
54
|
+
PyGILState_STATE gil_state = PyGILState_Ensure();
|
|
55
|
+
PyObject* re_module = PyImport_ImportModule("re");
|
|
56
|
+
if (!re_module) {
|
|
57
|
+
PyErr_Clear();
|
|
58
|
+
PyGILState_Release(gil_state);
|
|
59
|
+
return REG_BADPAT;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
PyObject* compiled = PyObject_CallMethod(re_module, "compile", "s", pattern);
|
|
63
|
+
Py_DECREF(re_module);
|
|
64
|
+
if (!compiled) {
|
|
65
|
+
PyErr_Clear();
|
|
66
|
+
PyGILState_Release(gil_state);
|
|
67
|
+
return REG_BADPAT;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
regex->compiled = compiled;
|
|
71
|
+
PyGILState_Release(gil_state);
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
static inline int regexec(const regex_t* regex, const char* string, size_t nmatch, regmatch_t pmatch[], int eflags) {
|
|
76
|
+
(void) nmatch;
|
|
77
|
+
(void) pmatch;
|
|
78
|
+
(void) eflags;
|
|
79
|
+
|
|
80
|
+
if (!regex || !regex->compiled || !string) {
|
|
81
|
+
return REG_NOMATCH;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
PyGILState_STATE gil_state = PyGILState_Ensure();
|
|
85
|
+
PyObject* match = PyObject_CallMethod(regex->compiled, "search", "s", string);
|
|
86
|
+
if (!match) {
|
|
87
|
+
PyErr_Clear();
|
|
88
|
+
PyGILState_Release(gil_state);
|
|
89
|
+
return REG_NOMATCH;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
int result = (match == Py_None) ? REG_NOMATCH : 0;
|
|
93
|
+
Py_DECREF(match);
|
|
94
|
+
PyGILState_Release(gil_state);
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
static inline void regfree(regex_t* regex) {
|
|
99
|
+
if (!regex || !regex->compiled) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
PyGILState_STATE gil_state = PyGILState_Ensure();
|
|
104
|
+
Py_DECREF(regex->compiled);
|
|
105
|
+
regex->compiled = NULL;
|
|
106
|
+
PyGILState_Release(gil_state);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
#else
|
|
110
|
+
|
|
111
|
+
static inline int regcomp(regex_t* regex, const char* pattern, int cflags) {
|
|
112
|
+
(void) regex;
|
|
113
|
+
(void) pattern;
|
|
114
|
+
(void) cflags;
|
|
115
|
+
return REG_BADPAT;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
static inline int regexec(const regex_t* regex, const char* string, size_t nmatch, regmatch_t pmatch[], int eflags) {
|
|
119
|
+
(void) regex;
|
|
120
|
+
(void) string;
|
|
121
|
+
(void) nmatch;
|
|
122
|
+
(void) pmatch;
|
|
123
|
+
(void) eflags;
|
|
124
|
+
return REG_NOMATCH;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
static inline void regfree(regex_t* regex) {
|
|
128
|
+
(void) regex;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
#endif
|
|
132
|
+
|
|
133
|
+
#endif /* REGEX_NT_COMPAT_H */
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#ifndef TIME_SCHED_NT_COMPAT_H
|
|
2
|
+
#define TIME_SCHED_NT_COMPAT_H
|
|
3
|
+
|
|
4
|
+
#ifndef _WIN32
|
|
5
|
+
#error "time_sched_nt_compat.h is intended for Windows builds only"
|
|
6
|
+
#endif
|
|
7
|
+
|
|
8
|
+
#include <time.h>
|
|
9
|
+
|
|
10
|
+
#ifndef WIN32_LEAN_AND_MEAN
|
|
11
|
+
#define WIN32_LEAN_AND_MEAN
|
|
12
|
+
#endif
|
|
13
|
+
#include <windows.h>
|
|
14
|
+
|
|
15
|
+
#ifndef CLOCK_REALTIME
|
|
16
|
+
#define CLOCK_REALTIME 0
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
static inline int clock_gettime(int clock_id, struct timespec* ts) {
|
|
20
|
+
(void) clock_id;
|
|
21
|
+
if (!ts) {
|
|
22
|
+
return -1;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return timespec_get(ts, TIME_UTC) == TIME_UTC ? 0 : -1;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
static inline void sched_yield(void) {
|
|
29
|
+
SwitchToThread();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#endif /* TIME_SCHED_NT_COMPAT_H */
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: PyCyBase
|
|
3
|
+
Version: 0.1.8.post4
|
|
4
|
+
Summary: Common C / Cython dual interfaces (allocator protocol, SHM allocator, heap allocator) for Python HFT projects
|
|
5
|
+
Author-email: Han Bolun <Bolun.Han@outlook.com>
|
|
6
|
+
Project-URL: Homepage, https://github.com/BolunHan/PyCyBase
|
|
7
|
+
Project-URL: Repository, https://github.com/BolunHan/PyCyBase
|
|
8
|
+
Project-URL: Issues, https://github.com/BolunHan/PyCyBase/issues
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
13
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
14
|
+
Requires-Python: >=3.12
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
Requires-Dist: cython
|
|
17
|
+
Provides-Extra: docs
|
|
18
|
+
Requires-Dist: mypy; extra == "docs"
|
|
19
|
+
Requires-Dist: sphinx; extra == "docs"
|
|
20
|
+
Requires-Dist: sphinx-rtd-theme; extra == "docs"
|
|
21
|
+
Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
|
|
22
|
+
|
|
23
|
+
# PyCyBase
|
|
24
|
+
|
|
25
|
+
Common C / Cython dual interfaces for Python HFT Projects.
|
|
26
|
+
|
|
27
|
+
## Overview
|
|
28
|
+
|
|
29
|
+
Low-level allocator infrastructure shared across HFT projects:
|
|
30
|
+
|
|
31
|
+
- **Allocator Protocol** — Pluggable memory allocation with heap, shared-memory (SHM), and raw `malloc` backends. Ref-counting, vigilant mode, thread-safety controls.
|
|
32
|
+
- **Heap Allocator** — In-process allocator with free-list reuse and auto-growing pages.
|
|
33
|
+
- **SHM Allocator** — POSIX shared-memory page allocator with fixed-address virtual region mapping for cross-process pointer stability.
|
|
34
|
+
- **ByteMap** — Fast xxHash3-backed hash maps for byte-string keys (ByteMap, ByteMapEx, bound variants).
|
|
35
|
+
- **Intern String** — FNV-1a-hashed string interning with SHM-backed cross-process pools. 1.7–2.2× speedup over Python `str`.
|
|
36
|
+
|
|
37
|
+
## Quick Start
|
|
38
|
+
|
|
39
|
+
```python
|
|
40
|
+
from cbase.allocator_protocol import AllocatorProtocol, AP_SHARED
|
|
41
|
+
|
|
42
|
+
with AP_SHARED:
|
|
43
|
+
alloc = AllocatorProtocol(1024)
|
|
44
|
+
alloc.buf[0] = b'x'
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
from cbase.intern_string import POOL
|
|
49
|
+
|
|
50
|
+
aapl = POOL.istr("AAPL")
|
|
51
|
+
assert aapl is POOL.istr("AAPL") # Identity — string deduplication
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
from cbase.bytemap import ByteMap
|
|
56
|
+
|
|
57
|
+
bm = ByteMap()
|
|
58
|
+
bm[b"ticker"] = b"AAPL"
|
|
59
|
+
assert bm[b"ticker"] == b"AAPL"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Build & Install
|
|
63
|
+
|
|
64
|
+
PyCyBase is a Cython extension package — it **cannot** be used with `pip install -e .` (editable mode breaks Cython `.pxd` resolution for downstream projects).
|
|
65
|
+
|
|
66
|
+
### POSIX (Linux / macOS)
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Build extensions in-place, then install
|
|
70
|
+
./build.sh -i
|
|
71
|
+
|
|
72
|
+
# Or equivalently:
|
|
73
|
+
make build && pip install -U . --no-build-isolation
|
|
74
|
+
|
|
75
|
+
# Or step by step:
|
|
76
|
+
python setup.py build_ext --inplace --verbose --force
|
|
77
|
+
pip install -U . --no-build-isolation
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Build script reference:**
|
|
81
|
+
|
|
82
|
+
| Command | Effect |
|
|
83
|
+
|---------|--------|
|
|
84
|
+
| `./build.sh` | Clean + build in-place |
|
|
85
|
+
| `./build.sh -i` | Clean + build + `pip install .` |
|
|
86
|
+
| `./build.sh -r` | Clean + build + force-reinstall |
|
|
87
|
+
| `./build.sh -c` | Clean only (no build) |
|
|
88
|
+
| `./build.sh -a` | Deep clean (remove `.c` and `.so` files) |
|
|
89
|
+
| `./build.sh -l` | List all compile-time macros |
|
|
90
|
+
| `./build.sh -v /path/to/venv` | Use a specific venv |
|
|
91
|
+
| `make` or `make build` | Clean + build |
|
|
92
|
+
| `make install` | Build + `pip install .` |
|
|
93
|
+
| `make reinstall` | Build + force-reinstall |
|
|
94
|
+
| `make list-args` | List compile-time macros |
|
|
95
|
+
|
|
96
|
+
### Windows (NT)
|
|
97
|
+
|
|
98
|
+
```powershell
|
|
99
|
+
# Local build
|
|
100
|
+
.\build.ps1 -VenvPath "C:\Users\...\venv_313"
|
|
101
|
+
|
|
102
|
+
# Remote build (from Linux host):
|
|
103
|
+
python nt_build.py
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Compile-Time Macros
|
|
107
|
+
|
|
108
|
+
Override any macro at build time via environment variable:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
DEBUG=1 ./build.sh # Enable debug mode
|
|
112
|
+
DEBUG=1 make build # Same via Makefile
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
List all available macros and defaults:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
./build.sh -l # Auto-generates macros.json via probe.py
|
|
119
|
+
make list-args
|
|
120
|
+
python probe.py # Run the probe directly
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Key macros (see `macros.json` for full list):
|
|
124
|
+
|
|
125
|
+
| Macro | Default | Description |
|
|
126
|
+
|-------|---------|-------------|
|
|
127
|
+
| `AP_ALLOC_VIGILANT` | `1` | Enable bounds/canary checks |
|
|
128
|
+
| `AP_ALLOC_WITH_LOCK` | `1` | Thread-safety via pthread mutex |
|
|
129
|
+
| `AP_ALLOC_WITH_SHM` | `0` | Default to SHM allocator |
|
|
130
|
+
| `AP_ALLOC_WITH_FREELIST` | `1` | Free-list reuse |
|
|
131
|
+
| `AP_HEAP_AUTOPAGE_CAPACITY` | `64 KiB` | Default heap page size |
|
|
132
|
+
| `AP_HEAP_AUTOPAGE_CAPACITY_MAX` | `16 MiB` | Max heap page size |
|
|
133
|
+
| `AP_SHM_AUTOPAGE_CAPACITY` | `64 KiB` | Default SHM page size |
|
|
134
|
+
| `AP_SHM_ALLOCATOR_DEFAULT_REGION_SIZE` | `128 GiB` | SHM virtual region |
|
|
135
|
+
|
|
136
|
+
### Using `get_include()` in Downstream Projects
|
|
137
|
+
|
|
138
|
+
```python
|
|
139
|
+
from setuptools import setup, Extension
|
|
140
|
+
from Cython.Build import cythonize
|
|
141
|
+
import cbase
|
|
142
|
+
|
|
143
|
+
ext = Extension(
|
|
144
|
+
"my_module",
|
|
145
|
+
sources=["my_module.pyx"],
|
|
146
|
+
include_dirs=cbase.get_include(),
|
|
147
|
+
)
|
|
148
|
+
setup(ext_modules=cythonize([ext]))
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Modules
|
|
152
|
+
|
|
153
|
+
| Module | Description |
|
|
154
|
+
|--------|-------------|
|
|
155
|
+
| `cbase.env` | `EnvConfigContext` — context manager for temporary config changes |
|
|
156
|
+
| `cbase.allocator_protocol` | `AllocatorProtocol`, `AllocatorConfigContext`, AP sentinels |
|
|
157
|
+
| `cbase.allocator_protocol.c_heap_allocator` | In-process heap allocator with free-list |
|
|
158
|
+
| `cbase.allocator_protocol.c_shm_allocator` | POSIX shared-memory page allocator |
|
|
159
|
+
| `cbase.bytemap.c_bytemap` | xxHash3-backed hash maps |
|
|
160
|
+
| `cbase.intern_string.c_intern_string` | FNV-1a-hashed string interning |
|
|
161
|
+
| `cbase.backports.pylong` | Python int ↔ 128-bit integer (uint128_t/int128_t) backport |
|
|
162
|
+
| `cbase.backports.pydict` | PyDict_Pop backport for pre-3.13 Python |
|
|
163
|
+
|
|
164
|
+
## Documentation
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
pip install sphinx furo
|
|
168
|
+
cd docs
|
|
169
|
+
sphinx-build -M html . _build
|
|
170
|
+
# Or with the project venv:
|
|
171
|
+
~/Projects/venv_313/bin/sphinx-build -M html . _build
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Open `docs/_build/html/index.html`.
|
|
175
|
+
|
|
176
|
+
Online: https://bolunhan.github.io/PyCyBase/
|
|
177
|
+
|
|
178
|
+
## License
|
|
179
|
+
|
|
180
|
+
Proprietary.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
cbase/__infra__.pxd,sha256=GHTo1d99jSDHnJ5btmrsnIPufxObGMUuydgD9HcUVt8,164
|
|
2
|
+
cbase/__init__.pxd,sha256=GHTo1d99jSDHnJ5btmrsnIPufxObGMUuydgD9HcUVt8,164
|
|
3
|
+
cbase/__init__.py,sha256=1T5xF9VbXhDgOfEFVmvX6PYCLfPGpe2dVCMH3ZWyQFM,600
|
|
4
|
+
cbase/env.c,sha256=KTOXCNGWl0wrgfelXQ3kgHj79XLUAs0cb2bW_D3c_X0,456770
|
|
5
|
+
cbase/env.cp313-win_amd64.pyd,sha256=GdlNM3b8QodKuGJdhKKLk7okIvMOlF6FTntBgncs4mU,52736
|
|
6
|
+
cbase/env.pxd,sha256=2bdWsv4upgPCVTkMY6BRExhsZ3JDBvxiD7Qd772sMQ0,152
|
|
7
|
+
cbase/env.pyi,sha256=6B5tlM65MTJxffbSH9aFfhZlKpJ-RkFFq8uxVUg1nuE,1426
|
|
8
|
+
cbase/env.pyx,sha256=9IM97NjbyOFHu875Jx_m9MqkimuJp4uR1ysCcEdcThw,1341
|
|
9
|
+
cbase/int128.h,sha256=oViSxaugBvmicLRCp3u1RiWz23KzmxyIyZtvvSVtX2M,2398
|
|
10
|
+
cbase/int128.pxd,sha256=IbblD1oOcYMWjy0HrXxsxwL35G6xzuzaUoIxc6dU-44,520
|
|
11
|
+
cbase/allocator_protocol/__infra__.pxd,sha256=UPB1yzwMz1U7vkzw22MT0oEAxMqTG6qTAR-1KJ9jmBE,1606
|
|
12
|
+
cbase/allocator_protocol/__init__.pxd,sha256=UPB1yzwMz1U7vkzw22MT0oEAxMqTG6qTAR-1KJ9jmBE,1606
|
|
13
|
+
cbase/allocator_protocol/__init__.py,sha256=LO9W9K1ffBtp1aNhrh_oGdU9eWKwn40Off_G_lEB8uw,1272
|
|
14
|
+
cbase/allocator_protocol/c_allocator_protocol.c,sha256=OB24XCQ6I-yh7MNc0YFN_IeTzcLgCSdorykQW09lz6o,1311169
|
|
15
|
+
cbase/allocator_protocol/c_allocator_protocol.cp313-win_amd64.pyd,sha256=0S05raxTGUuLAtP4iDRKrLVNBo4RUFCvXWKtJ74UShc,147968
|
|
16
|
+
cbase/allocator_protocol/c_allocator_protocol.h,sha256=5HjHfzW6Vs-Eai9V3U9SCAqLfu92Q-EfwCYWWeirnFo,13232
|
|
17
|
+
cbase/allocator_protocol/c_allocator_protocol.pxd,sha256=iuPKlgmscpoke2seCQhf-D11xwMhRbM6_qLac1kN4_4,2549
|
|
18
|
+
cbase/allocator_protocol/c_allocator_protocol.pyi,sha256=quToj-oxTZ8VcPUxVJ2pTTJDhZ7k7fwxB7QLcKU1LbE,4182
|
|
19
|
+
cbase/allocator_protocol/c_allocator_protocol.pyx,sha256=ZziuBJ32YpRVEkX8XdLPwgmOFkXjrE6_0vlrc4JWhUA,10497
|
|
20
|
+
cbase/allocator_protocol/c_heap_allocator.c,sha256=_kbRLFCxmTDlWdkgmU1xir23P7nh8TcN-l9PKDoRi4M,1610282
|
|
21
|
+
cbase/allocator_protocol/c_heap_allocator.cp313-win_amd64.pyd,sha256=6IwumxV9H2PFTrfzp0JivuAlq1W-FRmfaHYuGet7qmY,193536
|
|
22
|
+
cbase/allocator_protocol/c_heap_allocator.h,sha256=B_vifvXGbWO9HP0DIPlji_oYub_wpYb5suSyGemhYyE,12787
|
|
23
|
+
cbase/allocator_protocol/c_heap_allocator.pxd,sha256=EqRdPROhJURVgy8BPBN7-XSJrD8E4PndYqyUsUT3Fy8,3488
|
|
24
|
+
cbase/allocator_protocol/c_heap_allocator.pyi,sha256=zR2OMuVweL_1M5Cp-Xim97JI19-WakIupgfFSCM37Zc,4654
|
|
25
|
+
cbase/allocator_protocol/c_heap_allocator.pyx,sha256=RpKmYZhP178BouAcpsbuoWYiot11xbJd1V5tG8YGkHs,11941
|
|
26
|
+
cbase/allocator_protocol/c_nt_shm_allocator.c,sha256=0yNawXhtPjKl5QtstibZmBUMMwOuDgDyIJjAdmY5Tsw,1383016
|
|
27
|
+
cbase/allocator_protocol/c_nt_shm_allocator.cp313-win_amd64.pyd,sha256=iMb_gbT5uiCS8k6-_B0nGCBzjYRVjnyMC70epMHrKFI,176128
|
|
28
|
+
cbase/allocator_protocol/c_nt_shm_allocator.h,sha256=6AYC9Nt61r8_7IciALCF4oT8nGxRZOimAx-ZzltMpdg,31151
|
|
29
|
+
cbase/allocator_protocol/c_nt_shm_allocator.pxd,sha256=pTOEt_V6ReRogJeAWr59FwYlu_Unr513Ot6nxbNSVSs,4350
|
|
30
|
+
cbase/allocator_protocol/c_nt_shm_allocator.pyx,sha256=X4NPr69cqRAt3sXUl27FpouQNER1lySQKy6DbOc_8HM,9521
|
|
31
|
+
cbase/allocator_protocol/c_shm_allocator.h,sha256=ImPRx71z9TthdQgqsS8YMKOHI5rVBME9x9UU5VF9EzM,37012
|
|
32
|
+
cbase/allocator_protocol/c_shm_allocator.pxd,sha256=iCL9rbYuh_7sfeE7qn0rHtde5l_D3CVYtOjFVbweT4U,5398
|
|
33
|
+
cbase/allocator_protocol/c_shm_allocator.pyi,sha256=jgarsVbYnjWXxlp0c9CHuBee6ZgNPDwApB5J9NrJ7b8,9570
|
|
34
|
+
cbase/allocator_protocol/c_shm_allocator.pyx,sha256=3VsNcGXMcFPK_ZxCIqPlrboUXjSdFM1h6tHtInMOOm8,16931
|
|
35
|
+
cbase/allocator_protocol/c_shm_comp.c,sha256=YUg_WaIZUclMPvk-1WXZ3wbE0RNZC6PCKvoIIzF0nXo,194664
|
|
36
|
+
cbase/allocator_protocol/c_shm_comp.cp313-win_amd64.pyd,sha256=xL90dCvkjJbIgmDQoHbAV5zrxGByh8IXAOYw_QrxWIM,18944
|
|
37
|
+
cbase/allocator_protocol/c_shm_comp.h,sha256=WBitRJ1JpWL-H_p5suhUFoFtPkkjR9TTVgQx9yuiLMU,1968
|
|
38
|
+
cbase/allocator_protocol/c_shm_comp.pxd,sha256=YXfg6kdjETbP3-hITcjewOLzzFUkFJSU-hml3LglKdM,1550
|
|
39
|
+
cbase/allocator_protocol/c_shm_comp.pyx,sha256=RkI-L73IgEIiykhdPdyfjs9lJvHBV2fCeP0cfRYcYks,121
|
|
40
|
+
cbase/backports/__infra__.pxd,sha256=YSYd_zFps3ql31h49XBA1f5F_VMws7vXJsyXZwidYZk,316
|
|
41
|
+
cbase/backports/__init__.pxd,sha256=YSYd_zFps3ql31h49XBA1f5F_VMws7vXJsyXZwidYZk,316
|
|
42
|
+
cbase/backports/__init__.py,sha256=BipEaRj9FY54ASY18NYomZ7DAa0csl81iIYMDELNRfI,193
|
|
43
|
+
cbase/backports/pydict.h,sha256=aNZ0Y1wgvG46lKS_mw4wm2vwi8OVwpow8hofg2obfKk,1741
|
|
44
|
+
cbase/backports/pydict.pxd,sha256=fF_Fpmb9xkGb37a2-5kq0r2Ogea_ST9gW8FmcoZvWRI,158
|
|
45
|
+
cbase/backports/pylong.c,sha256=CsrbJojv8mdDrBQWB96lIMsnrRwtre50VlKZ4pFNW4g,410388
|
|
46
|
+
cbase/backports/pylong.cp313-win_amd64.pyd,sha256=kd0jWksZb7H_ndxOVpiRWohkVURV-IQ2MYv9AHNFA3Y,44544
|
|
47
|
+
cbase/backports/pylong.h,sha256=ZpNpCBYduT1ER08p4wnR8u2B-KUzQ87bKl9S2o9krq4,2218
|
|
48
|
+
cbase/backports/pylong.pxd,sha256=SnC7Bx9jgAbN87KFdXnoXPTiwGMzfHVPmoSJHIIUQm8,631
|
|
49
|
+
cbase/backports/pylong.pyx,sha256=98PNQSJaVPcD3VgaCq_ownuMQLRVDDhP8OpBYUTSSmw,2178
|
|
50
|
+
cbase/bytemap/__infra__.pxd,sha256=9UzjG3AFXPFe-jVvn3Ay27RcwSgUqFQJaCX4mCE19uU,1783
|
|
51
|
+
cbase/bytemap/__init__.pxd,sha256=9UzjG3AFXPFe-jVvn3Ay27RcwSgUqFQJaCX4mCE19uU,1783
|
|
52
|
+
cbase/bytemap/__init__.py,sha256=jmVp9McBp1PFWl-Dl1cWrTTtKGlB3ZeNmeALP6OBmXA,411
|
|
53
|
+
cbase/bytemap/c_bytemap.c,sha256=Lav8WlzS1xwHbha2CtyUrq5dy73iNBYeo9HhGGiDQY4,2399329
|
|
54
|
+
cbase/bytemap/c_bytemap.cp313-win_amd64.pyd,sha256=MbSCtzq6U1145zSZ6c4WeYBjbtOu5oEGKg9LaSW7yNU,304640
|
|
55
|
+
cbase/bytemap/c_bytemap.h,sha256=hp40nHJxEanSXPPcoE211Mg7q58hRy0e5GNS11TTES4,34874
|
|
56
|
+
cbase/bytemap/c_bytemap.pxd,sha256=CtoBI94K1unkgsB1ga6_umdZ7ZfAV9c9f8fEcc6Tkzo,14782
|
|
57
|
+
cbase/bytemap/c_bytemap.pyx,sha256=tXohXFstM5_te3NBuDUzzLi0Nxl77MMsnaIApboBRIA,73054
|
|
58
|
+
cbase/bytemap/xxh3.h,sha256=p5JnfO0ib4pi-nvNTY06dDQJlOS_0-TNPfxl0XQHep0,2449
|
|
59
|
+
cbase/bytemap/xxhash.c,sha256=whY6q68SdhXQhrhbRueD3yWmBiKrSpny3n__nDTUCaE,1897
|
|
60
|
+
cbase/bytemap/xxhash.h,sha256=w0DdoWurKi0_e3N6M7L35xLo9ZK3yjBv9EG8M9FsHPM,286913
|
|
61
|
+
cbase/includes/cbase/env.c,sha256=KTOXCNGWl0wrgfelXQ3kgHj79XLUAs0cb2bW_D3c_X0,456770
|
|
62
|
+
cbase/includes/cbase/int128.h,sha256=oViSxaugBvmicLRCp3u1RiWz23KzmxyIyZtvvSVtX2M,2398
|
|
63
|
+
cbase/includes/cbase/allocator_protocol/c_allocator_protocol.c,sha256=OB24XCQ6I-yh7MNc0YFN_IeTzcLgCSdorykQW09lz6o,1311169
|
|
64
|
+
cbase/includes/cbase/allocator_protocol/c_allocator_protocol.h,sha256=5HjHfzW6Vs-Eai9V3U9SCAqLfu92Q-EfwCYWWeirnFo,13232
|
|
65
|
+
cbase/includes/cbase/allocator_protocol/c_heap_allocator.c,sha256=_kbRLFCxmTDlWdkgmU1xir23P7nh8TcN-l9PKDoRi4M,1610282
|
|
66
|
+
cbase/includes/cbase/allocator_protocol/c_heap_allocator.h,sha256=B_vifvXGbWO9HP0DIPlji_oYub_wpYb5suSyGemhYyE,12787
|
|
67
|
+
cbase/includes/cbase/allocator_protocol/c_nt_shm_allocator.c,sha256=0yNawXhtPjKl5QtstibZmBUMMwOuDgDyIJjAdmY5Tsw,1383016
|
|
68
|
+
cbase/includes/cbase/allocator_protocol/c_nt_shm_allocator.h,sha256=6AYC9Nt61r8_7IciALCF4oT8nGxRZOimAx-ZzltMpdg,31151
|
|
69
|
+
cbase/includes/cbase/allocator_protocol/c_shm_allocator.h,sha256=ImPRx71z9TthdQgqsS8YMKOHI5rVBME9x9UU5VF9EzM,37012
|
|
70
|
+
cbase/includes/cbase/allocator_protocol/c_shm_comp.c,sha256=YUg_WaIZUclMPvk-1WXZ3wbE0RNZC6PCKvoIIzF0nXo,194664
|
|
71
|
+
cbase/includes/cbase/allocator_protocol/c_shm_comp.h,sha256=WBitRJ1JpWL-H_p5suhUFoFtPkkjR9TTVgQx9yuiLMU,1968
|
|
72
|
+
cbase/includes/cbase/backports/pydict.h,sha256=aNZ0Y1wgvG46lKS_mw4wm2vwi8OVwpow8hofg2obfKk,1741
|
|
73
|
+
cbase/includes/cbase/backports/pylong.c,sha256=CsrbJojv8mdDrBQWB96lIMsnrRwtre50VlKZ4pFNW4g,410388
|
|
74
|
+
cbase/includes/cbase/backports/pylong.h,sha256=ZpNpCBYduT1ER08p4wnR8u2B-KUzQ87bKl9S2o9krq4,2218
|
|
75
|
+
cbase/includes/cbase/bytemap/c_bytemap.c,sha256=Lav8WlzS1xwHbha2CtyUrq5dy73iNBYeo9HhGGiDQY4,2399329
|
|
76
|
+
cbase/includes/cbase/bytemap/c_bytemap.h,sha256=hp40nHJxEanSXPPcoE211Mg7q58hRy0e5GNS11TTES4,34874
|
|
77
|
+
cbase/includes/cbase/bytemap/xxh3.h,sha256=p5JnfO0ib4pi-nvNTY06dDQJlOS_0-TNPfxl0XQHep0,2449
|
|
78
|
+
cbase/includes/cbase/bytemap/xxhash.c,sha256=whY6q68SdhXQhrhbRueD3yWmBiKrSpny3n__nDTUCaE,1897
|
|
79
|
+
cbase/includes/cbase/bytemap/xxhash.h,sha256=w0DdoWurKi0_e3N6M7L35xLo9ZK3yjBv9EG8M9FsHPM,286913
|
|
80
|
+
cbase/includes/cbase/intern_string/c_intern_string.c,sha256=YRWZ09M-lOqN941Nh0AWYAng3oPINcC3tgoqE8240Bo,1292853
|
|
81
|
+
cbase/includes/cbase/intern_string/c_intern_string.h,sha256=G8iWzx3gLuS6BGW1FdiEFZte1xW1-hQ49juPgRXKbjc,20420
|
|
82
|
+
cbase/includes/cbase/nt/pthread_nt_compat.h,sha256=x3ocJ7BkGvgQeoX7ajTC2mjfnvO4wUTdIndr6hwCviE,3032
|
|
83
|
+
cbase/includes/cbase/nt/regex_nt_compat.h,sha256=MgA2Lt2AEA6_DGA_UYZmIXpz0K8Rd_ggdbYsBlH7AqU,3027
|
|
84
|
+
cbase/includes/cbase/nt/time_sched_nt_compat.h,sha256=Hc93-Q5wwX54KiNDhq2-yZrR9y9tgGytuXX2MxrDGUM,638
|
|
85
|
+
cbase/intern_string/BENCHMARK.md,sha256=u3nHS7OcoiLM8g6Vj_j9u6pQd91t-gX1eSsGKKuZrY8,8449
|
|
86
|
+
cbase/intern_string/__infra__.pxd,sha256=uIc4fP6JTFkznKuOAnaGKMMaPimKKDoyUrMqP4LppM8,219
|
|
87
|
+
cbase/intern_string/__init__.pxd,sha256=uIc4fP6JTFkznKuOAnaGKMMaPimKKDoyUrMqP4LppM8,219
|
|
88
|
+
cbase/intern_string/__init__.py,sha256=AMyVENcoE1A_SF1_D3RO9s6CRCPr2IsXbfs5oqOcY3Q,315
|
|
89
|
+
cbase/intern_string/c_intern_string.c,sha256=YRWZ09M-lOqN941Nh0AWYAng3oPINcC3tgoqE8240Bo,1292853
|
|
90
|
+
cbase/intern_string/c_intern_string.cp313-win_amd64.pyd,sha256=_GpRh5Oqpj-e_024vGTPBwIVh1xUlCDkVLQuJHSuGNk,165376
|
|
91
|
+
cbase/intern_string/c_intern_string.h,sha256=G8iWzx3gLuS6BGW1FdiEFZte1xW1-hQ49juPgRXKbjc,20420
|
|
92
|
+
cbase/intern_string/c_intern_string.pxd,sha256=0p4X-1j_z69ARN0x2XxUZIyqMrkC_7xF_X3G1N8FcqM,3973
|
|
93
|
+
cbase/intern_string/c_intern_string.pyi,sha256=-6Ga6pzFv_RuOsEP0Jlb_u39VL8LYy7dfEacG-y9n8Q,11955
|
|
94
|
+
cbase/intern_string/c_intern_string.pyx,sha256=G3dDqTSR3jfPlXSzumKnbXTNORfNFjDVwXokjLC4cW0,30785
|
|
95
|
+
cbase/nt/pthread_nt_compat.h,sha256=x3ocJ7BkGvgQeoX7ajTC2mjfnvO4wUTdIndr6hwCviE,3032
|
|
96
|
+
cbase/nt/regex_nt_compat.h,sha256=MgA2Lt2AEA6_DGA_UYZmIXpz0K8Rd_ggdbYsBlH7AqU,3027
|
|
97
|
+
cbase/nt/time_sched_nt_compat.h,sha256=Hc93-Q5wwX54KiNDhq2-yZrR9y9tgGytuXX2MxrDGUM,638
|
|
98
|
+
pycybase-0.1.8.post4.dist-info/METADATA,sha256=k-V6YNdqDegRUpDx29G7GnsudV8rcUYTsIHnEfyA4T4,5896
|
|
99
|
+
pycybase-0.1.8.post4.dist-info/WHEEL,sha256=AP_wkikJcUkDPUGvTNydv7g0R7BhW1u_fVHNKW7TJyI,101
|
|
100
|
+
pycybase-0.1.8.post4.dist-info/top_level.txt,sha256=1-AmkpeoVkkB4J_ETk_plA58n1BC02e30z4uvm_6bf8,6
|
|
101
|
+
pycybase-0.1.8.post4.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cbase
|