Make atomic_queue constexpr functions compliant to C++11

This commit is contained in:
Jean Pierre Cimalando 2020-05-02 11:35:14 +02:00
parent 7710282bd0
commit 65eb564222

View file

@ -55,12 +55,17 @@ struct GetIndexShuffleBits<false, array_size, elements_per_cache_line> {
// the element within the cache line) with the next N bits (which are the index of the cache line) // the element within the cache line) with the next N bits (which are the index of the cache line)
// of the element index. // of the element index.
template<int BITS> template<int BITS>
constexpr unsigned remap_index(unsigned index) noexcept { constexpr unsigned remap_index_with_mix(unsigned index, unsigned mix)
constexpr unsigned MASK = (1u << BITS) - 1; {
unsigned mix = (index ^ (index >> BITS)) & MASK;
return index ^ mix ^ (mix << BITS); return index ^ mix ^ (mix << BITS);
} }
template<int BITS>
constexpr unsigned remap_index(unsigned index) noexcept {
return remap_index_with_mix<BITS>(
index, (index ^ (index >> BITS)) & ((1u << BITS) - 1));
}
template<> template<>
constexpr unsigned remap_index<0>(unsigned index) noexcept { constexpr unsigned remap_index<0>(unsigned index) noexcept {
return index; return index;
@ -68,8 +73,7 @@ constexpr unsigned remap_index<0>(unsigned index) noexcept {
template<int BITS, class T> template<int BITS, class T>
constexpr T& map(T* elements, unsigned index) noexcept { constexpr T& map(T* elements, unsigned index) noexcept {
index = remap_index<BITS>(index); return elements[remap_index<BITS>(index)];
return elements[index];
} }
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////