From 303b28ca6138375fc6e095323eee35b9f6e3d5c0 Mon Sep 17 00:00:00 2001 From: quou Date: Wed, 26 Mar 2025 20:37:47 +1100 Subject: replace divide and multiply with shifts --- world.hpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'world.hpp') diff --git a/world.hpp b/world.hpp index a45cf9c..f486ba1 100644 --- a/world.hpp +++ b/world.hpp @@ -16,6 +16,18 @@ using Entity_Id = uint32_t; #define max_components 64 #define max_slinkies (max_entities / slinky_size) +static_assert((!(slinky_size & (slinky_size - 1)))); +/* slinky_size needs to be a power of 2 */ +static consteval int get_slinky_size_bit() { + int i; + int m = slinky_size; + for (i = 0; m; m >>= 1, i++); + if (i == 0) + throw "wtf"; + return i - 1; +} +static constexpr int slinky_size_bit = get_slinky_size_bit(); + struct Slinky { Entity_Id* entities; void* data; @@ -142,9 +154,9 @@ struct World { template C& get() { Pool* p = v->pools[ind]; - Slinky& s = p->slinkies[ptr / slinky_size]; + Slinky& s = p->slinkies[ptr >> slinky_size_bit]; int si = &s - p->slinkies; - int off = ptr - (si * slinky_size); + int off = ptr - (si << slinky_size_bit); return *(C*)( (char*)s.data + off * p->size + p->offsets[v->w->get_component_id()] @@ -157,9 +169,9 @@ struct World { Entity_Id entity() { Pool* p = v->pools[ind]; - Slinky& s = p->slinkies[ptr / slinky_size]; + Slinky& s = p->slinkies[ptr >> slinky_size_bit]; int si = &s - p->slinkies; - int off = ptr - (si * slinky_size); + int off = ptr - (si << slinky_size_bit); return s.entities[off]; } }; -- cgit v1.2.3-54-g00ecf