#pragma once
#include <string.h>
#include <cstdint>
#include "common/assert.h"
#include "common/numeric_utils.h"
#include "common/utils.h"
namespace lbug {
namespace storage {
template<typename T>
void Store(const T& val, uint8_t* ptr) {
memcpy(ptr, (void*)&val, sizeof(val));
}
template<typename T>
T Load(const uint8_t* ptr) {
T ret{};
memcpy(&ret, ptr, sizeof(ret));
return ret;
}
template<class T, class T_U = typename common::numeric_utils::MakeUnSignedT<T>, uint64_t CHUNK_SIZE>
static void SignExtend(uint8_t* dst, uint8_t width) {
DASSERT(width < sizeof(T) * 8);
T const mask = T_U(1) << (width - 1);
for (uint64_t i = 0; i < CHUNK_SIZE; ++i) {
T value = Load<T>(dst + i * sizeof(T));
const T_U andMask = common::BitmaskUtils::all1sMaskForLeastSignificantBits<T_U>(width);
value = value & andMask;
T result = (value ^ mask) - mask;
Store(result, dst + i * sizeof(T));
}
}
} }