S8Split2
This commit is contained in:
parent
3a4af168b1
commit
b3345df5bf
56
rtcore.h
56
rtcore.h
@ -212,6 +212,10 @@ RTC_API u8 *S8End(s8 s);
|
|||||||
/* Splits the given string s at the first occurence of c.
|
/* Splits the given string s at the first occurence of c.
|
||||||
* If c does not occur, split_result.first contains the whole string */
|
* If c does not occur, split_result.first contains the whole string */
|
||||||
RTC_API split_result S8Split(s8 s, u8 c);
|
RTC_API split_result S8Split(s8 s, u8 c);
|
||||||
|
/* Splits the given string s at the first occurence of c.
|
||||||
|
* If c does not occur, split_result.first contains the whole string.
|
||||||
|
* This version also consumes repeating occurences of c */
|
||||||
|
RTC_API split_result S8Split2(s8 s, u8 c);
|
||||||
/* Creates a clone of string s on arena a */
|
/* Creates a clone of string s on arena a */
|
||||||
RTC_API s8 S8Clone(s8 s, arena *a);
|
RTC_API s8 S8Clone(s8 s, arena *a);
|
||||||
|
|
||||||
@ -254,6 +258,43 @@ RTC_API b32 WriteEntireFile(s8 path, byte *data, isize length);
|
|||||||
#define AtomicLoadAcquire(_ptr) _InterlockedOr_HLEAcquire(_ptr, 0)
|
#define AtomicLoadAcquire(_ptr) _InterlockedOr_HLEAcquire(_ptr, 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Aliases for intrinsics */
|
||||||
|
#if defined(__GNUC__) || defined(__clang__)
|
||||||
|
#define CTZ32(ui) __builtin_ctz(ui)
|
||||||
|
#define CTZ64(ul) __builtin_ctzl(ul)
|
||||||
|
#define CLZ32(ui) __builtin_clz(ui)
|
||||||
|
#define CLZ64(ul) __builtin_clzl(ul)
|
||||||
|
#define PopCount32(_x) __builtin_popcount(_x)
|
||||||
|
#define PopCount64(_x) __builtin_popcountl(_x)
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
static force_inline unsigned int CTZ32(u32 x)
|
||||||
|
{
|
||||||
|
unsigned int index;
|
||||||
|
_BitScanReverse(&index, x);
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
static force_inline unsigned int CTZ64(u64 x)
|
||||||
|
{
|
||||||
|
unsigned int index;
|
||||||
|
_BitScanReverse64(&index, x);
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
static force_inline unsigned int CLZ32(u32 x)
|
||||||
|
{
|
||||||
|
unsigned int index;
|
||||||
|
_BitScanForward(&index, x);
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
static force_inline unsigned int CLZ64(u64 x)
|
||||||
|
{
|
||||||
|
unsigned int index;
|
||||||
|
_BitScanForward64(&index, x);
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
#define PopCount32(_x) __popcnt(_x)
|
||||||
|
#define PopCount64(_x) __popcnt64(_x)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Threading wrapper */
|
/* Threading wrapper */
|
||||||
typedef struct thread thread;
|
typedef struct thread thread;
|
||||||
|
|
||||||
@ -391,6 +432,21 @@ S8Split(s8 s, u8 c)
|
|||||||
S8Span(chr + 1, S8End(s) + 1),
|
S8Span(chr + 1, S8End(s) + 1),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
RTC_API split_result
|
||||||
|
S8Split2(s8 s, u8 c)
|
||||||
|
{
|
||||||
|
u8 *chr = S8Chr(s, c);
|
||||||
|
if (!chr)
|
||||||
|
return (split_result){s};
|
||||||
|
split_result r = {
|
||||||
|
.first = S8Span(s.data, chr),
|
||||||
|
};
|
||||||
|
u8 *end = S8End(s) + 1;
|
||||||
|
while (chr != end && *chr == c)
|
||||||
|
++chr;
|
||||||
|
r.second = S8Span(chr, end);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
RTC_API s8
|
RTC_API s8
|
||||||
S8Clone(s8 s, arena *a)
|
S8Clone(s8 s, arena *a)
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user