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);
68_Ret_valid_ _meta_inline uint8* _Nonnull _strHdrP(_In_ strref_v s)
73_meta_inline uint8 _strHdr(_In_ strref_v s)
78_Ret_valid_ _meta_inline uint8* _Nonnull _strBuffer(_In_ strref_v s)
83#define STR_CHECK_VALID(s) (s && *(uint8*)s)
84#define STR_SAFE_DEREF(ps) ((ps && *ps) ? *ps : 0)
86_meta_inline uint32 _strFastLen(_In_ strref_v s)
88 if (!(STR_HDR(s) & STR_CX))
89 return (uint32)
cstrLen((
const char*)s);
90 switch (STR_HDR(s) & STR_LEN_MASK) {
92 return STR_LEN8_LEN(s);
94 return STR_LEN16_LEN(s);
96 return STR_LEN32_LEN(s);
98 return (uint32)
cstrLen((
const char*)_strBuffer(s));
106_Ret_maybenull_ _meta_inline uint8* _Nullable _strLen0Buf(_In_ strref_v s)
109 if ((STR_HDR(s) & STR_LEN_MASK) != STR_LEN0)
112 return _strBuffer(s);
116_meta_inline uint16 _strFastRef(_In_ strref_v s)
118 int l = STR_HDR(s) & STR_LEN_MASK;
121 return atomicLoad(uint8, &STR_FIELD(s, STR_OFF_REF(STR_HDR(s)), atomic(uint8)), Acquire);
123 return atomicLoad(uint16, &STR_FIELD(s, STR_OFF_REF(STR_HDR(s)), atomic(uint16)), Acquire);
126_meta_inline uint16 _strFastRefNoSync(_In_ strref_v s)
128 int l = STR_HDR(s) & STR_LEN_MASK;
131 return STR_LEN8_REF(s);
133 return STR_LEN16_REF(s);
137#define STR_ALLOC_SIZE 16
141#define ROPE_MIN_SIZE 64
143#define ROPE_JOIN_THRESH 128
145#define ROPE_SUBSTR_THRESH 96
147#define ROPE_MAX_MERGE 256
155#define STR_LEN0_SCAN_THRESH 1024
157#include "string_private_utf8.h"
160extern string_v _strEmpty;
163void _strReset(_Inout_ptr_opt_
strhandle s, uint32 minsz);
167void _strSetLen(_Inout_ string_v s, uint32 len);
168void _strInitRef(_Inout_ string_v s);
169void _strSetRef(_Inout_ string_v s, uint16 ref);
172void _strMakeUnique(_Inout_ptr_ strhandle_v ps, uint32 minszforcopy);
174void _strFlatten(_Inout_ptr_ strhandle_v ps, uint32 minszforcopy);
177void _strResize(_Inout_ptr_ strhandle_v ps, uint32 len,
bool unique);
179_Ret_valid_ string_v _strCopy(_In_ strref_v s, uint32 minsz);
181uint32 _strFastCopy(_In_ strref_v s, uint32 off, _Out_writes_bytes_(bytes) uint8* _Nonnull buf,
185typedef struct str_roperef {
190typedef struct str_ropedata {
196_Ret_valid_ _meta_inline str_ropedata* _strRopeData(_In_ strref_v s)
198 return STR_ROPEDATA(s);
201string_v _strCreateRope(_In_ strref_v left, uint32 left_off, uint32 left_len, _In_opt_ strref right,
202 uint32 right_off, uint32 right_len,
bool balance);
203string_v _strCreateRope1(_In_ strref_v s, uint32 off, uint32 len);
204string_v _strCloneRope(_In_ strref_v s);
205void _strDestroyRope(_Inout_ string_v s);
206uint32 _strRopeFastCopy(_In_ strref_v s, uint32 off, _Out_writes_bytes_(bytes) uint8* _Nonnull buf,
208_Success_(
return)
bool _strRopeRealStr(_Inout_ strhandle_v s, uint32 off, _Out_ strhandle_v rs,
209 _Out_ uint32* _Nonnull rsoff, _Out_ uint32* _Nonnull rslen,
210 _Out_ uint32* _Nonnull rsstart,
bool writable);
214_Pure _meta_inline uint32 _strResolvePos(uint32 slen, int32 i)
221 return ((uint32)(-i) < slen) ? (uint32)((int32)slen + i) : 0;
228_Pure _meta_inline uint32 _strResolveOff(uint32 slen, int32 i)
230 return min(_strResolvePos(slen, i), slen);
234_meta_inline uint8 _strChrFold(uint8 c,
bool ci)
236 return ci ? (uint8)tolower(c) : c;
239_meta_inline uint8 _strFastChar(_In_ strref s, uint32 i)
241 if (!(STR_HDR(s) & STR_ROPE)) {
242 return _strBuffer(s)[i];
245 uint32 realoff, reallen, realstart;
246 if (_strRopeRealStr((
string*)&s, i, &realstr, &realoff, &reallen, &realstart,
false))
247 return _strBuffer(realstr)[realoff];
252extern char _strnum_udigits[];
253extern 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.