Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of scm.gforge.inria.fr:/gitroot/simgrid/simgrid
[simgrid.git] / src / mc / ChunkedData.hpp
1 #ifndef SIMGRID_MC_CHUNKED_DATA_HPP
2 #define SIMGRID_MC_CHUNKED_DATA_HPP
3
4 #include <cstddef>
5 #include <cstdint>
6
7 #include <vector>
8
9 #include <mc/mc_forward.hpp>
10 #include <mc/AddressSpace.hpp>
11 #include <mc/PageStore.hpp>
12
13 namespace simgrid {
14 namespace mc {
15
16 class ChunkedData {
17   PageStore* store_;
18   std::vector<std::size_t> pagenos_;
19 public:
20   ChunkedData() : store_(nullptr) {}
21   ChunkedData(ChunkedData const& that)
22   {
23     store_ = that.store_;
24     pagenos_ = that.pagenos_;
25     for (std::size_t pageno : pagenos_)
26       store_->ref_page(pageno);
27   }
28   void clear()
29   {
30     for (std::size_t pageno : pagenos_)
31       store_->unref_page(pageno);
32     pagenos_.clear();
33   }
34   ~ChunkedData()
35   {
36     clear();
37   }
38
39   ChunkedData(ChunkedData&& that)
40   {
41     store_ = that.store_;
42     that.store_ = nullptr;
43     pagenos_ = std::move(that.pagenos_);
44     that.pagenos_.clear();
45   }
46   ChunkedData& operator=(ChunkedData const& that)
47   {
48     this->clear();
49     store_ = that.store_;
50     pagenos_ = that.pagenos_;
51     for (std::size_t pageno : pagenos_)
52       store_->ref_page(pageno);
53     return *this;
54   }
55   ChunkedData& operator=(ChunkedData && that)
56   {
57     this->clear();
58     store_ = that.store_;
59     that.store_ = nullptr;
60     pagenos_ = std::move(that.pagenos_);
61     that.pagenos_.clear();
62     return *this;
63   }
64
65   std::size_t page_count()          const { return pagenos_.size(); }
66   std::size_t pageno(std::size_t i) const { return pagenos_[i]; }
67   const std::size_t* pagenos()      const { return pagenos_.data(); }
68   std::size_t*       pagenos()            { return pagenos_.data(); }
69
70   const void* page(std::size_t i) const
71   {
72     return store_->get_page(pagenos_[i]);
73   }
74
75   ChunkedData(PageStore& store, AddressSpace& as,
76     remote_ptr<void> addr, std::size_t page_count,
77     const std::size_t* ref_page_numbers, const std::uint64_t* pagemap);
78 };
79
80 }
81 }
82
83 #endif