--- deliantra/Deliantra-Client/Client.xs 2018/11/19 00:10:34 1.331 +++ deliantra/Deliantra-Client/Client.xs 2018/11/19 01:56:11 1.335 @@ -79,6 +79,7 @@ #endif #include "ecb.h" +#include "salloc.h" #define OBJ_STR "\xef\xbf\xbc" /* U+FFFC, object replacement character */ @@ -100,6 +101,30 @@ #define TEXID_SPEECH 1 #define TEXID_NOFACE 2 +// approximately divide by 255 +static unsigned int +div255 (unsigned int n) +{ + return (n + (n >> 8)) >> 8; +} + +static unsigned int +minpot (unsigned int n) +{ + if (!n) + return 0; + + --n; + + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + + return n + 1; +} + static char * fast_sv_grow (SV *sv, STRLEN need) { @@ -294,7 +319,7 @@ typedef mapgrid *DC__Map; template -static void +ecb_cold static void prepend (T *&ptr, int sze, int inc) { T *p; @@ -308,7 +333,7 @@ } template -static void +ecb_cold static void append (T *&ptr, int sze, int inc) { Renew (ptr, sze + inc, T); @@ -318,21 +343,23 @@ static void need_facenum (struct mapgrid *self, faceid face) { - while (self->faces <= face) - { - append (self->face2tile, self->faces, self->faces); - self->faces *= 2; - } + if (ecb_expect_true (self->faces > face)) + return; + + size_t newsize = minpot (face + 1); + append (self->face2tile, self->faces, newsize - self->faces); + self->faces = newsize; } static void need_texid (struct mapgrid *self, int texid) { - while (self->texs <= texid) - { - append (self->tex, self->texs, self->texs); - self->texs *= 2; - } + if (ecb_expect_true (self->texs > texid)) + return; + + size_t newsize = minpot (texid + 1); + append (self->tex, self->texs, newsize - self->texs); + self->texs = newsize; } static maprow * @@ -456,7 +483,7 @@ } }; -typedef ska::flat_hash_map smooth_hash; +typedef ska::flat_hash_map, std::equal_to, slice_allocator> smooth_hash; namespace std { template <> @@ -506,30 +533,6 @@ SDL_PushEvent ((SDL_Event *)&ev); } -// approximately divide by 255 -static unsigned int -div255 (unsigned int n) -{ - return (n + (n >> 8)) >> 8; -} - -static unsigned int -minpot (unsigned int n) -{ - if (!n) - return 0; - - --n; - - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - - return n + 1; -} - /* SDL should provide this, really. */ #define SDLK_MODIFIER_MIN 300 #define SDLK_MODIFIER_MAX 314 @@ -868,6 +871,12 @@ IV minpot (UV n) +UV ld32 (UV n) + CODE: + RETVAL = ecb_ld32 (n); + OUTPUT: + RETVAL + IV popcount (UV n) CODE: RETVAL = ecb_popcount32 (n);