fixed missing tinyxml2 header path dependency for Win32
[mfgtools.git] / libuuu / bmap.h
blob89e7c1f4b36849f8a028e9f2f06f67204c0c1b90
1 #pragma once
3 #include <string>
4 #include <vector>
6 struct bmap_t {
7 using bmap_type = std::vector<std::pair<size_t, size_t>>;
9 bmap_t() = default;
10 // fully mapped image
11 bmap_t(size_t img_size, size_t blk_size = 4096)
12 : m_img_size(img_size),
13 m_blk_size(blk_size),
14 m_blk_count(default_blocks_count(img_size, blk_size))
16 set_mapped_range(0, m_blk_count - 1);
19 bmap_t& set_image_size(size_t size) {
20 m_img_size = size;
21 return *this;
24 bmap_t& set_block_size(size_t size = 4096) {
25 m_blk_size = size;
26 return *this;
29 bmap_t& set_blocks_count(size_t size = 0) {
30 if (size)
31 m_blk_count = size;
32 else
33 m_blk_count = default_blocks_count(m_img_size, m_blk_size);
34 return *this;
37 bmap_t& set_mapped_range(size_t begin, size_t end) {
38 m_blk_map.emplace_back(begin, end);
39 return *this;
42 static size_t default_blocks_count(size_t img_size, size_t blk_size) {
43 return img_size / blk_size + (img_size % blk_size ? 1 : 0);
46 size_t image_size() const { return m_img_size; }
47 size_t block_size() const { return m_blk_size; }
48 size_t blocks_count() const { return m_blk_count; }
50 const bmap_type& mapped_ranges() const { return m_blk_map; }
52 bool is_mapped_block(size_t index) const;
54 private:
55 size_t m_img_size = 0;
56 size_t m_blk_size = 4096;
57 size_t m_blk_count = 0;
58 bmap_type m_blk_map;
59 mutable bool m_gap_set = false;
60 mutable size_t m_gap_begin = 0;
61 mutable size_t m_gap_end = 0;
62 mutable size_t m_next_gap_begin = 0;
65 bool load_bmap(const std::string& filename, bmap_t& bmap);