1*eea7ceb3SPulkoMandy /* 2*eea7ceb3SPulkoMandy * Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk. 3*eea7ceb3SPulkoMandy * Distributed under the terms of the MIT License. 4*eea7ceb3SPulkoMandy */ 5*eea7ceb3SPulkoMandy #ifndef _BYTE_POINTER_H 6*eea7ceb3SPulkoMandy #define _BYTE_POINTER_H 7*eea7ceb3SPulkoMandy 8*eea7ceb3SPulkoMandy 9*eea7ceb3SPulkoMandy #include <stdlib.h> 10*eea7ceb3SPulkoMandy 11*eea7ceb3SPulkoMandy 12*eea7ceb3SPulkoMandy // Behaves like a char* pointer, but -> and & return the right pointed type. 13*eea7ceb3SPulkoMandy // Assumes the offsets passed to + and += maintain the alignment for the type. 14*eea7ceb3SPulkoMandy template<class T> struct BytePointer { 15*eea7ceb3SPulkoMandy char* address; 16*eea7ceb3SPulkoMandy BytePointerBytePointer17*eea7ceb3SPulkoMandy BytePointer(void* base) { address = (char*)base; } 18*eea7ceb3SPulkoMandy 19*eea7ceb3SPulkoMandy T* operator&() { return reinterpret_cast<T*>(address); } 20*eea7ceb3SPulkoMandy T* operator->() { return reinterpret_cast<T*>(address); } 21*eea7ceb3SPulkoMandy void operator+=(size_t offset) { address += offset; } 22*eea7ceb3SPulkoMandy char* operator+(size_t offset) const { return address + offset; } 23*eea7ceb3SPulkoMandy }; 24*eea7ceb3SPulkoMandy 25*eea7ceb3SPulkoMandy 26*eea7ceb3SPulkoMandy #endif 27