Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
ae6efb13e5d0966e8373d04fdfc61f4fccc6083e
[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 <utility>
14 #include <vector>
15
16 #include "src/mc/mc_forward.hpp"
17 #include "src/mc/PageStore.hpp"
18
19 namespace simgrid {
20 namespace mc {
21
22 /** A byte-string represented as a sequence of chunks from a PageStor */
23 class ChunkedData {
24   PageStore* store_ = nullptr;
25   /** Indices of the chunks */
26   std::vector<std::size_t> pagenos_;
27 public:
28
29   ChunkedData() {}
30   void clear()
31   {
32     for (std::size_t pageno : pagenos_)
33       store_->unref_page(pageno);
34     pagenos_.clear();
35   }
36   ~ChunkedData()
37   {
38     clear();
39   }
40
41   // Copy and move
42   ChunkedData(ChunkedData const& that)
43   {
44     store_ = that.store_;
45     pagenos_ = that.pagenos_;
46     for (std::size_t pageno : pagenos_)
47       store_->ref_page(pageno);
48   }
49   ChunkedData(ChunkedData&& that)
50   {
51     store_ = that.store_;
52     that.store_ = nullptr;
53     pagenos_ = std::move(that.pagenos_);
54     that.pagenos_.clear();
55   }
56   ChunkedData& operator=(ChunkedData const& that)
57   {
58     this->clear();
59     store_ = that.store_;
60     pagenos_ = that.pagenos_;
61     for (std::size_t pageno : pagenos_)
62       store_->ref_page(pageno);
63     return *this;
64   }
65   ChunkedData& operator=(ChunkedData && that)
66   {
67     this->clear();
68     store_ = that.store_;
69     that.store_ = nullptr;
70     pagenos_ = std::move(that.pagenos_);
71     that.pagenos_.clear();
72     return *this;
73   }
74
75   std::size_t page_count()          const { return pagenos_.size(); }
76   std::size_t pageno(std::size_t i) const { return pagenos_[i]; }
77   const std::size_t* pagenos()      const { return pagenos_.data(); }
78
79   const void* page(std::size_t i) const
80   {
81     return store_->get_page(pagenos_[i]);
82   }
83
84   ChunkedData(PageStore& store, AddressSpace& as,
85     RemotePtr<void> addr, std::size_t page_count);
86 };
87
88 }
89 }
90
91 #endif