#pragma once namespace nall { template struct pointer { explicit operator bool() const { return value; } pointer() = default; pointer(T* source) { value = source; } pointer(const pointer& source) { value = source.value; } auto& operator=(T* source) { value = source; return *this; } auto& operator=(const pointer& source) { value = source.value; return *this; } auto operator()() -> T* { return value; } auto operator()() const -> const T* { return value; } auto operator->() -> T* { return value; } auto operator->() const -> const T* { return value; } auto operator*() -> T& { return *value; } auto operator*() const -> const T& { return *value; } auto reset() -> void { value = nullptr; } auto data() -> T* { return value; } auto data() const -> const T* { return value; } private: T* value = nullptr; }; }