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:
parent
1b4779a58c
commit
ba2629456f
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user