xref: /haiku/headers/private/shared/BytePointer.h (revision eea7ceb31dea29ffd0507aedd20e15ab966838d1)
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