#pragma once #include namespace snmalloc { /** * The type used for an address. Currently, all addresses are assumed to be * provenance-carrying values and so it is possible to cast back from the * result of arithmetic on an address_t. Eventually, this will want to be * separated into two types, one for raw addresses and one for addresses that * can be cast back to pointers. */ using address_t = uintptr_t; /** * Perform pointer arithmetic and return the adjusted pointer. */ template inline T* pointer_offset(T* base, size_t diff) { return reinterpret_cast(reinterpret_cast(base) + diff); } /** * Cast from a pointer type to an address. */ template inline address_t address_cast(T* ptr) { return reinterpret_cast(ptr); } /** * Cast from an address back to a pointer of the specified type. All uses of * this will eventually need auditing for CHERI compatibility. */ template inline T* pointer_cast(address_t address) { return reinterpret_cast(address); } } // namespace snmalloc