Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Add missing copyright notices
[simgrid.git] / src / mc / ChunkedData.hpp
1 /* Copyright (c) 2014-2015. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #ifndef SIMGRID_MC_CHUNKED_DATA_HPP
8 #define SIMGRID_MC_CHUNKED_DATA_HPP
9
10 #include <cstddef>
11 #include <cstdint>
12
13 #include <vector>
14
15 #include "src/mc/mc_forward.hpp"
16 #include "src/mc/AddressSpace.hpp"
17 #include "src/mc/PageStore.hpp"
18
19 namespace simgrid {
20 namespace mc {
21
22 class ChunkedData {
23   PageStore* store_;
24   std::vector<std::size_t> pagenos_;
25 public:
26   ChunkedData() : store_(nullptr) {}
27   ChunkedData(ChunkedData const& that)
28   {
29     store_ = that.store_;
30     pagenos_ = that.pagenos_;
31     for (std::size_t pageno : pagenos_)
32       store_->ref_page(pageno);
33   }
34   void clear()
35   {
36     for (std::size_t pageno : pagenos_)
37       store_->unref_page(pageno);
38     pagenos_.clear();
39   }
40   ~ChunkedData()
41   {
42     clear();
43   }
44
45   ChunkedData(ChunkedData&& that)
46   {
47     store_ = that.store_;
48     that.store_ = nullptr;
49     pagenos_ = std::move(that.pagenos_);
50     that.pagenos_.clear();
51   }
52   ChunkedData& operator=(ChunkedData const& that)
53   {
54     this->clear();
55     store_ = that.store_;
56     pagenos_ = that.pagenos_;
57     for (std::size_t pageno : pagenos_)
58       store_->ref_page(pageno);
59     return *this;
60   }
61   ChunkedData& operator=(ChunkedData && that)
62   {
63     this->clear();
64     store_ = that.store_;
65     that.store_ = nullptr;
66     pagenos_ = std::move(that.pagenos_);
67     that.pagenos_.clear();
68     return *this;
69   }
70
71   std::size_t page_count()          const { return pagenos_.size(); }
72   std::size_t pageno(std::size_t i) const { return pagenos_[i]; }
73   const std::size_t* pagenos()      const { return pagenos_.data(); }
74   std::size_t*       pagenos()            { return pagenos_.data(); }
75
76   const void* page(std::size_t i) const
77   {
78     return store_->get_page(pagenos_[i]);
79   }
80
81   ChunkedData(PageStore& store, AddressSpace& as,
82     remote_ptr<void> addr, std::size_t page_count,
83     const std::size_t* ref_page_numbers, const std::uint64_t* pagemap);
84 };
85
86 }
87 }
88
89 #endif