diff --git a/src/external/atomic_queue/atomic_queue.h b/src/external/atomic_queue/atomic_queue.h index 23536adc..f679d32c 100644 --- a/src/external/atomic_queue/atomic_queue.h +++ b/src/external/atomic_queue/atomic_queue.h @@ -55,12 +55,17 @@ struct GetIndexShuffleBits { // the element within the cache line) with the next N bits (which are the index of the cache line) // of the element index. template -constexpr unsigned remap_index(unsigned index) noexcept { - constexpr unsigned MASK = (1u << BITS) - 1; - unsigned mix = (index ^ (index >> BITS)) & MASK; +constexpr unsigned remap_index_with_mix(unsigned index, unsigned mix) +{ return index ^ mix ^ (mix << BITS); } +template +constexpr unsigned remap_index(unsigned index) noexcept { + return remap_index_with_mix( + index, (index ^ (index >> BITS)) & ((1u << BITS) - 1)); +} + template<> constexpr unsigned remap_index<0>(unsigned index) noexcept { return index; @@ -68,8 +73,7 @@ constexpr unsigned remap_index<0>(unsigned index) noexcept { template constexpr T& map(T* elements, unsigned index) noexcept { - index = remap_index(index); - return elements[index]; + return elements[remap_index(index)]; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////