+ void *permanent_addr_;
+
+ std::vector<char> flat_data_;
+ PerPageCopy page_numbers_;
+ std::vector<std::unique_ptr<RegionSnapshot>> privatized_regions_;
+public:
+ RegionSnapshot() :
+ region_type_(MC_REGION_TYPE_UNKNOWN),
+ storage_type_(MC_REGION_STORAGE_TYPE_NONE),
+ object_info_(nullptr),
+ start_addr_(nullptr),
+ size_(0),
+ permanent_addr_(nullptr)
+ {}
+ RegionSnapshot(mc_region_type_t type, void *start_addr, void* permanent_addr, size_t size) :
+ region_type_(type),
+ storage_type_(MC_REGION_STORAGE_TYPE_NONE),
+ object_info_(nullptr),
+ start_addr_(start_addr),
+ size_(size),
+ permanent_addr_(permanent_addr)
+ {}
+ ~RegionSnapshot();
+ RegionSnapshot(RegionSnapshot const&) = delete;
+ RegionSnapshot& operator=(RegionSnapshot const&) = delete;
+
+ // Data
+
+ void clear_data()
+ {
+ storage_type_ = MC_REGION_STORAGE_TYPE_NONE;
+ flat_data_.clear();
+ page_numbers_.clear();
+ privatized_regions_.clear();
+ }
+
+ void flat_data(std::vector<char> data)
+ {
+ storage_type_ = MC_REGION_STORAGE_TYPE_FLAT;
+ flat_data_ = std::move(data);
+ page_numbers_.clear();
+ privatized_regions_.clear();
+ }
+ std::vector<char> const& flat_data() const { return flat_data_; }
+
+ void page_data(PerPageCopy page_data)
+ {
+ storage_type_ = MC_REGION_STORAGE_TYPE_CHUNKED;
+ flat_data_.clear();
+ page_numbers_ = std::move(page_data);
+ privatized_regions_.clear();
+ }
+ PerPageCopy const& page_data() const { return page_numbers_; }
+
+ void privatized_data(std::vector<std::unique_ptr<RegionSnapshot>> data)
+ {
+ storage_type_ = MC_REGION_STORAGE_TYPE_PRIVATIZED;
+ flat_data_.clear();
+ page_numbers_.clear();
+ privatized_regions_ = std::move(data);
+ }
+ std::vector<std::unique_ptr<RegionSnapshot>> const& privatized_data() const
+ {
+ return privatized_regions_;
+ }