From eea7ceb31dea29ffd0507aedd20e15ab966838d1 Mon Sep 17 00:00:00 2001 From: PulkoMandy Date: Sat, 23 Feb 2019 18:25:31 +0100 Subject: [PATCH] Add BytePointer to help with pointer conversions This behaves mostly like a pointer, but pointer maths works in bytes, not the native object size. It avoids casting to char* and back when doing byte-based pointer math, making the code easier to read. Change-Id: I6a8681a398345f0c7d419a2cfe7244d972ffa62f Reviewed-on: https://review.haiku-os.org/c/1086 Reviewed-by: waddlesplash --- headers/private/shared/BytePointer.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 headers/private/shared/BytePointer.h diff --git a/headers/private/shared/BytePointer.h b/headers/private/shared/BytePointer.h new file mode 100644 index 0000000000..62038f820d --- /dev/null +++ b/headers/private/shared/BytePointer.h @@ -0,0 +1,26 @@ +/* + * Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk. + * Distributed under the terms of the MIT License. + */ +#ifndef _BYTE_POINTER_H +#define _BYTE_POINTER_H + + +#include + + +// Behaves like a char* pointer, but -> and & return the right pointed type. +// Assumes the offsets passed to + and += maintain the alignment for the type. +template struct BytePointer { + char* address; + + BytePointer(void* base) { address = (char*)base; } + + T* operator&() { return reinterpret_cast(address); } + T* operator->() { return reinterpret_cast(address); } + void operator+=(size_t offset) { address += offset; } + char* operator+(size_t offset) const { return address + offset; } +}; + + +#endif