Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Fix Snapshot::read_bytes
[simgrid.git] / src / mc / AddressSpace.hpp
index 05665fb..6aed5ea 100644 (file)
@@ -1,20 +1,19 @@
-/* Copyright (c) 2008-2014. The SimGrid Team.
+/* Copyright (c) 2008-2015. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
-#ifndef MC_ADDRESS_SPACE_H
-#define MC_ADDRESS_SPACE_H
+#ifndef SIMGRID_MC_ADDRESS_SPACE_H
+#define SIMGRID_MC_ADDRESS_SPACE_H
 
+#include <cstddef>
 #include <cstdint>
 #include <type_traits>
 
 #include <xbt/misc.h>
 
-#include <stdint.h>
-
-#include "mc_forward.h"
+#include "mc_forward.hpp"
 
 namespace simgrid {
 namespace mc {
@@ -29,12 +28,16 @@ template<class T> class remote_ptr {
 public:
   remote_ptr() : address_(0) {}
   remote_ptr(std::uint64_t address) : address_(address) {}
-  remote_ptr(T* address) : address_((std::uint64_t)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_);
@@ -59,6 +62,42 @@ public:
   }
 };
 
+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)
 {
@@ -88,6 +127,8 @@ const int ProcessIndexDisabled = -2;
 const int ProcessIndexAny = 0;
 
 class AddressSpace {
+private:
+  Process* process_;
 public:
   enum ReadMode {
     Normal,
@@ -96,7 +137,10 @@ public:
      */
     Lazy
   };
+  AddressSpace(Process* process) : process_(process) {}
   virtual ~AddressSpace();
+
+  simgrid::mc::Process* process() const { return process_; }
   virtual const void* read_bytes(void* buffer, std::size_t size,
     remote_ptr<void> address, int process_index = ProcessIndexAny,
     ReadMode mode = Normal) const = 0;