+/** Pointer to a remote address-space (process, snapshot)
+ *
+ * With this we can clearly identify the expected type of an address in the
+ * remote process whild avoiding to use native local pointers.
+ */
+template<class T> class remote_ptr {
+ std::uint64_t address_;
+public:
+ remote_ptr() : address_(0) {}
+ remote_ptr(std::uint64_t address) : address_(address) {}
+ remote_ptr(T* address) : address_((std::uintptr_t)address) {}
+ std::uint64_t address() const { return address_; }
+ operator bool() const
+ {
+ return address_;
+ }
+ bool operator!() const
+ {
+ return !address_;
+ }
+ operator remote_ptr<void>() const
+ {
+ return remote_ptr<void>(address_);
+ }
+ remote_ptr<T> operator+(std::uint64_t n) const
+ {
+ return remote_ptr<T>(address_ + n * sizeof(T));
+ }
+ remote_ptr<T> operator-(std::uint64_t n) const
+ {
+ return remote_ptr<T>(address_ - n * sizeof(T));
+ }
+ remote_ptr<T>& operator+=(std::uint64_t n) const
+ {
+ address_ += n * sizeof(T);
+ return *this;
+ }
+ remote_ptr<T>& operator-=(std::uint64_t n) const
+ {
+ address_ -= n * sizeof(T);
+ return *this;
+ }
+};
+
+template<class X, class Y>
+bool operator<(remote_ptr<X> const& x, remote_ptr<Y> const& y)
+{
+ return x.address() < y.address();
+}
+
+template<class X, class Y>
+bool operator>(remote_ptr<X> const& x, remote_ptr<Y> const& y)
+{
+ return x.address() > y.address();
+}
+
+template<class X, class Y>
+bool operator>=(remote_ptr<X> const& x, remote_ptr<Y> const& y)
+{
+ return x.address() >= y.address();
+}
+
+template<class X, class Y>
+bool operator<=(remote_ptr<X> const& x, remote_ptr<Y> const& y)
+{
+ return x.address() <= y.address();
+}
+
+template<class X, class Y>
+bool operator==(remote_ptr<X> const& x, remote_ptr<Y> const& y)
+{
+ return x.address() == y.address();
+}
+
+template<class X, class Y>
+bool operator!=(remote_ptr<X> const& x, remote_ptr<Y> const& y)
+{
+ return x.address() != y.address();
+}
+
+template<class T> inline
+remote_ptr<T> remote(T *p)
+{
+ return remote_ptr<T>(p);
+}
+
+template<class T=void> inline
+remote_ptr<T> remote(uint64_t p)
+{
+ return remote_ptr<T>(p);
+}
+