//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#if _WIN64
typedef unsigned long long step_t;
#else
typedef unsigned int step_t;
#endif
#define s_return(n) if (!s[n]) return n
#define w_check(n) if (has_zero_byte(w[n])) { w += n; break; }
#define w_return(n) if (!(w[0] & (step_t)(0xFFULL << (8 * n)))) \
return (size_t)w - (size_t)s + n
inline step_t has_zero_byte(const step_t n)
{
const step_t finder = (step_t)0x0101010101010101ULL;
const step_t masker = (step_t)0x8080808080808080ULL;
return (n - finder) & (~n & masker);
}
size_t strlen_ex(const char* s)
{
step_t* w;
s_return(0); s_return(1); s_return(2); s_return(3);
#if _WIN64
s_return(4); s_return(5); s_return(6); s_return(7);
#endif
w = (step_t*)
(((step_t)s & ((step_t)-1 - (sizeof(step_t) - 1))) + sizeof(step_t));
while (1)
{
w_check( 0); w_check( 1); w_check( 2); w_check( 3);
w_check( 4); w_check( 5); w_check( 6); w_check( 7);
#if _WIN64
w_check( 8); w_check( 9); w_check(10); w_check(11);
w_check(12); w_check(13); w_check(14); w_check(15);
#endif
w += sizeof(step_t) * 2;
}
w_return(0); w_return(1); w_return(2); w_return(3);
#if _WIN64
w_return(4); w_return(5); w_return(6); w_return(7);
#endif
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~