5#include "cx/thread/atomic.h"
7typedef struct str_ref* _Nonnull string_v;
8typedef const struct str_ref* _Nonnull strref_v;
9typedef string_v* _Nonnull strhandle_v;
17#define STR_LEN_MASK 0x03
26#define STR_ENCODING_MASK (STR_UTF8 | STR_ASCII)
28#define STR_HDRP(s) ((uint8*)(s))
29#define STR_HDR(s) (((*STR_HDRP(s) & STR_CX) && STR_HDRP(s)[1] == 0xc1) ? *STR_HDRP(s) : 0)
30#define STR_FIELD(s, off, typ) (*(typ*)(&STR_HDRP(s)[off]))
35extern const uint8 _str_off[32];
38#define STR_OFF_BASE(hdr) ((hdr & STR_ALLOC) | (hdr & STR_LEN_MASK) << 2)
39#define STR_OFF_LEN(hdr) (_str_off[STR_OFF_BASE(hdr)])
40#define STR_OFF_REF(hdr) (_str_off[STR_OFF_BASE(hdr) | STR_OT_REF])
41#define STR_OFF_STR(hdr) (hdr & STR_CX ? (_str_off[STR_OFF_BASE(hdr) | STR_OT_STR]) : 0)
43#define STR_LEN8_LEN(s) STR_FIELD(s, _strOffLen(_strHdr(s)), uint8)
44#define STR_LEN16_LEN(s) STR_FIELD(s, _strOffLen(_strHdr(s)), uint16)
45#define STR_LEN32_LEN(s) STR_FIELD(s, _strOffLen(_strHdr(s)), uint32)
47#define STR_LEN8_REF(s) STR_FIELD(s, _strOffRef(_strHdr(s)), uint8)
48#define STR_LEN16_REF(s) STR_FIELD(s, _strOffRef(_strHdr(s)), uint16)
50#define STR_BUFFER(s) (&STR_FIELD(s, _strOffStr(_strHdr(s)), uint8))
51#define STR_ROPEDATA(s) (&STR_FIELD(s, _strOffStr(_strHdr(s)), str_ropedata))
53_meta_inline uint8 _strOffLen(uint8 hdr)
55 return STR_OFF_LEN(hdr);
58_meta_inline uint8 _strOffRef(uint8 hdr)
60 return STR_OFF_REF(hdr);
63_meta_inline uint8 _strOffStr(uint8 hdr)
65 return STR_OFF_STR(hdr);
69_meta_inline uint8 * _Nonnull _strHdrP(_In_ strref_v s)
74_meta_inline uint8 _strHdr(_In_ strref_v s)
80_meta_inline uint8 * _Nonnull _strBuffer(_In_ strref_v s)
85#define STR_CHECK_VALID(s) (s && *(uint8*)s)
86#define STR_SAFE_DEREF(ps) ((ps && *ps) ? *ps : 0)
88_meta_inline uint32 _strFastLen(_In_ strref_v s)
90 if (!(STR_HDR(s) & STR_CX))
91 return (uint32)
cstrLen((
const char*)s);
92 switch (STR_HDR(s) & STR_LEN_MASK) {
94 return STR_LEN8_LEN(s);
96 return STR_LEN16_LEN(s);
98 return STR_LEN32_LEN(s);
100 return (uint32)
cstrLen((
const char*)_strBuffer(s));
105_meta_inline uint16 _strFastRef(_In_ strref_v s)
107 int l = STR_HDR(s) & STR_LEN_MASK;
110 return atomicLoad(uint8, &STR_FIELD(s, STR_OFF_REF(STR_HDR(s)), atomic(uint8)), Acquire);
112 return atomicLoad(uint16, &STR_FIELD(s, STR_OFF_REF(STR_HDR(s)), atomic(uint16)), Acquire);
115_meta_inline uint16 _strFastRefNoSync(_In_ strref_v s)
117 int l = STR_HDR(s) & STR_LEN_MASK;
120 return STR_LEN8_REF(s);
122 return STR_LEN16_REF(s);
126#define STR_ALLOC_SIZE 16
130#define ROPE_MIN_SIZE 64
132#define ROPE_JOIN_THRESH 128
134#define ROPE_SUBSTR_THRESH 96
136#define ROPE_MAX_MERGE 256
138#include "string_private_utf8.h"
141extern string_v _strEmpty;
144void _strReset(_Inout_ptr_opt_
strhandle s, uint32 minsz);
148void _strSetLen(_Inout_ string_v s, uint32 len);
149void _strInitRef(_Inout_ string_v s);
150void _strSetRef(_Inout_ string_v s, uint16 ref);
153void _strMakeUnique(_Inout_ptr_ strhandle_v ps, uint32 minszforcopy);
155void _strFlatten(_Inout_ptr_ strhandle_v ps, uint32 minszforcopy);
158void _strResize(_Inout_ptr_ strhandle_v ps, uint32 len,
bool unique);
160_Ret_valid_ string_v _strCopy(_In_ strref_v s, uint32 minsz);
162uint32 _strFastCopy(_In_ strref_v s, uint32 off, _Out_writes_bytes_(bytes) uint8 *_Nonnull buf, uint32 bytes);
165typedef struct str_roperef {
170typedef struct str_ropedata {
177_meta_inline str_ropedata *_strRopeData(_In_ strref_v s)
179 return STR_ROPEDATA(s);
182string_v _strCreateRope(_In_ strref_v left, uint32 left_off, uint32 left_len, _In_opt_ strref right, uint32 right_off, uint32 right_len,
bool balance);
183string_v _strCreateRope1(_In_ strref_v s, uint32 off, uint32 len);
184string_v _strCloneRope(_In_ strref_v s);
185void _strDestroyRope(_Inout_ string_v s);
186uint32 _strRopeFastCopy(_In_ strref_v s, uint32 off, _Out_writes_bytes_(bytes) uint8 *_Nonnull buf, uint32 bytes);
187_Success_(
return)
bool _strRopeRealStr(_Inout_ strhandle_v s, uint32 off, _Out_ strhandle_v rs, _Out_ uint32 *_Nonnull rsoff, _Out_ uint32 *_Nonnull rslen, _Out_ uint32 *_Nonnull rsstart,
bool writable);
190int32 _strFindChar(_In_ strref_v s, int32 start,
char find);
193int32 _strFindCharR(_In_ strref_v s, int32 end,
char find);
195_meta_inline uint8 _strFastChar(_In_ strref s, uint32 i)
197 if (!(STR_HDR(s) & STR_ROPE)) {
198 return _strBuffer(s)[i];
201 uint32 realoff, reallen, realstart;
202 if (_strRopeRealStr((
string*)&s, i, &realstr, &realoff, &reallen, &realstart,
false))
203 return _strBuffer(realstr)[realoff];
208extern char _strnum_udigits[];
209extern char _strnum_ldigits[];
Comparison and clamping macros.
size_t cstrLen(const char *s)
string * strhandle
Pointer to a string variable.
Copy-on-write strings with automatic memory management and rope optimization.