Added a copy of std::align due to missing implementation in gcc < 5

References:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57350
This commit is contained in:
Michael Krasnyk 2016-11-17 14:36:03 +01:00 committed by Daniel J. H
parent 1b4779a58c
commit ba2629456f

View File

@ -6,7 +6,6 @@
#include <array>
#include <cstdint>
#include <memory>
namespace osrm
{
@ -131,20 +130,29 @@ struct DataLayout
return result;
}
// \brief Fit aligned storage in buffer.
// Interface Similar to [ptr.align] but omits space computation.
// The method can be removed and changed directly to an std::align
// function call after dropping gcc < 5 support.
inline void* align(std::size_t align, std::size_t , void*& ptr) const noexcept
{
const auto intptr = reinterpret_cast<uintptr_t>(ptr);
const auto aligned = (intptr - 1u + align) & -align;
return ptr = reinterpret_cast<void*>(aligned);
}
inline void *GetAlignedBlockPtr(void *ptr, BlockID bid) const
{
for (auto i = 0; i < bid; i++)
{
ptr = static_cast<char *>(ptr) + sizeof(CANARY);
std::size_t space = 2 * entry_align[i] + entry_size[i];
ptr = std::align(entry_align[i], entry_size[i], ptr, space);
ptr = align(entry_align[i], entry_size[i], ptr);
ptr = static_cast<char *>(ptr) + GetBlockSize((BlockID)i);
ptr = static_cast<char *>(ptr) + sizeof(CANARY);
}
ptr = static_cast<char *>(ptr) + sizeof(CANARY);
std::size_t space = 2 * entry_align[bid] + entry_size[bid];
ptr = std::align(entry_align[bid], entry_size[bid], ptr, space);
ptr = align(entry_align[bid], entry_size[bid], ptr);
return ptr;
}