HighMap library (C++)
Loading...
Searching...
No Matches
tile_storage.hpp
Go to the documentation of this file.
1/* Copyright (c) 2025 Otto Link. Distributed under the terms of the GNU General
2 Public License. The full license is in the file LICENSE, distributed with
3 this software. */
4
10#pragma once
11#include <filesystem>
12#include <fstream>
13#include <list>
14#include <mutex>
15#include <optional>
16
17#include "highmap/array.hpp"
19
20#include <unordered_map>
21
22namespace hmap
23{
24
25// =====================================
26// Peripheric classes
27// =====================================
28
29enum StorageMode : int
30{
33 VA_DISK_LRU_MIN, // 2 live tiles, min mem footprint
34 VA_DISK_SEQUENTIAL // sequential for/each, no smooth_overlap
35};
36
37inline std::string to_string(StorageMode m)
38{
39 switch (m)
40 {
41 case StorageMode::VA_RAM: return "VA_RAM";
42 case StorageMode::VA_DISK_LRU: return "VA_DISK_LRU";
43 case StorageMode::VA_DISK_LRU_MIN: return "VA_DISK_LRU_MIN";
44 case StorageMode::VA_DISK_SEQUENTIAL: return "VA_DISK_SEQUENTIAL";
45 }
46 return "UNKNOWN";
47}
48
50{
51 size_t operator()(const TileKey &k) const
52 {
53 return (static_cast<size_t>(k.tx) << 32) ^ static_cast<size_t>(k.ty);
54 }
55};
56
57// =====================================
58// Abstract class
59// =====================================
60
62{
63public:
64 virtual ~TileStorage() = default;
65 virtual Array &get_tile(const TileRegion &region) = 0;
66 virtual void release_tile(const TileRegion &region) = 0;
67 virtual size_t max_live_tiles() const = 0;
68 virtual std::unique_ptr<TileStorage> clone() const = 0;
69 virtual std::string info_string() const = 0;
70
71 // Live memory tracking
72 virtual size_t live_tile_count() const = 0;
73 virtual size_t live_memory_bytes() const = 0;
74
75 // Opportunistically free memory while keeping data persistent.
76 virtual void trim()
77 {
78 }
79};
80
81// =====================================
82// RAM storage
83// =====================================
84
86{
87public:
88 std::unique_ptr<TileStorage> clone() const override;
89
90 Array &get_tile(const TileRegion &region) override;
91 void release_tile(const TileRegion &region) override;
92 size_t max_live_tiles() const override;
93 size_t live_tile_count() const override;
94 size_t live_memory_bytes() const override;
95 std::string info_string() const override
96 {
97 return "RAM";
98 };
99
100private:
101 std::unordered_map<TileKey, Array, TileKeyHash> tiles;
102};
103
104// =====================================
105// LRU storage
106// =====================================
107
109{
111 std::list<TileKey>::iterator lru_it;
112};
113
115{
116public:
117 explicit LruTileStorage(size_t max_tiles);
118
119 std::unique_ptr<TileStorage> clone() const override;
120
121 Array &get_tile(const TileRegion &region) override;
122 void release_tile(const TileRegion &region) override;
123 size_t max_live_tiles() const override;
124 size_t live_tile_count() const override;
125 size_t live_memory_bytes() const override;
126 std::string info_string() const override;
127
128protected:
129 size_t max_tiles;
130 std::list<TileKey> lru;
131 std::unordered_map<TileKey, LruTileEntry, TileKeyHash> tiles;
132 mutable std::mutex mutex;
133
135 virtual void on_evict(const TileKey &key, Array &tile);
136};
137
138// =====================================
139// DISK-LRU storage
140// =====================================
141
143{
144public:
147
148 std::unique_ptr<TileStorage> clone() const override;
149
150 Array &get_tile(const TileRegion &region) override;
151 size_t max_live_tiles() const override;
152 void trim() override;
153
154protected:
155 void on_evict(const TileKey &key, Array &tile) override;
156
157private:
158 std::filesystem::path root_dir;
159
160 std::filesystem::path tile_path(const TileKey &key) const;
161 Array load_tile_from_disk(const TileRegion &region);
162};
163
164// =====================================
165// DISK-sequential storage
166// =====================================
167
169{
170public:
173
174 std::unique_ptr<TileStorage> clone() const override;
175
176 Array &get_tile(const TileRegion &region) override;
177 void release_tile(const TileRegion &region) override;
178 size_t max_live_tiles() const override;
179 size_t live_tile_count() const override;
180 size_t live_memory_bytes() const override;
181 void trim() override;
182 std::string info_string() const override
183 {
184 return "DiskSequential";
185 };
186
187private:
188 std::filesystem::path root_dir;
189 TileKey current_key{};
190 std::optional<Array> current_tile;
191
192 Array load_or_create(const TileRegion &region);
193 void save_tile(const TileKey &key, const Array &tile);
194 std::filesystem::path tile_path(const TileKey &key) const;
195};
196
197// =====================================
198// functions
199// =====================================
200
201std::unique_ptr<TileStorage> make_storage(glm::ivec2 shape,
202 glm::ivec2 tile_shape,
203 StorageMode storage_mode);
204
205} // namespace hmap
Declaration of the Array class for 2D floating-point arrays with various mathematical operations and ...
Array class, helper to manipulate 2D float array with "(i, j)" indexing.
Definition array.hpp:32
Definition tile_storage.hpp:143
void on_evict(const TileKey &key, Array &tile) override
Definition disk_lru_storage.cpp:105
~DiskLruTileStorage()
Definition disk_lru_storage.cpp:32
void trim() override
Definition disk_lru_storage.cpp:123
size_t max_live_tiles() const override
Definition disk_lru_storage.cpp:100
Array & get_tile(const TileRegion &region) override
Definition disk_lru_storage.cpp:43
std::unique_ptr< TileStorage > clone() const override
Definition disk_lru_storage.cpp:38
Definition tile_storage.hpp:169
size_t live_memory_bytes() const override
Definition disk_sequential_storage.cpp:80
~DiskSequentialTileStorage() override
Definition disk_sequential_storage.cpp:28
void trim() override
Definition disk_sequential_storage.cpp:119
std::unique_ptr< TileStorage > clone() const override
Definition disk_sequential_storage.cpp:34
Array & get_tile(const TileRegion &region) override
Definition disk_sequential_storage.cpp:39
size_t live_tile_count() const override
Definition disk_sequential_storage.cpp:75
void release_tile(const TileRegion &region) override
Definition disk_sequential_storage.cpp:87
size_t max_live_tiles() const override
Definition disk_sequential_storage.cpp:70
DiskSequentialTileStorage()
Definition disk_sequential_storage.cpp:23
std::string info_string() const override
Definition tile_storage.hpp:182
Definition tile_storage.hpp:115
size_t live_tile_count() const override
Definition lru_tile_storage.cpp:86
std::list< TileKey > lru
Definition tile_storage.hpp:130
size_t max_live_tiles() const override
Definition lru_tile_storage.cpp:81
std::string info_string() const override
Definition lru_tile_storage.cpp:76
std::unique_ptr< TileStorage > clone() const override
Definition lru_tile_storage.cpp:24
size_t max_tiles
Definition tile_storage.hpp:129
Array & get_tile_no_mutex_lock(const TileRegion &region)
Definition lru_tile_storage.cpp:35
void release_tile(const TileRegion &region) override
Definition lru_tile_storage.cpp:104
std::mutex mutex
Definition tile_storage.hpp:132
virtual void on_evict(const TileKey &key, Array &tile)
Definition lru_tile_storage.cpp:109
Array & get_tile(const TileRegion &region) override
Definition lru_tile_storage.cpp:29
size_t live_memory_bytes() const override
Definition lru_tile_storage.cpp:92
std::unordered_map< TileKey, LruTileEntry, TileKeyHash > tiles
Definition tile_storage.hpp:131
Definition tile_storage.hpp:86
size_t max_live_tiles() const override
Definition ram_tile_storage.cpp:34
size_t live_memory_bytes() const override
Definition ram_tile_storage.cpp:49
size_t live_tile_count() const override
Definition ram_tile_storage.cpp:44
void release_tile(const TileRegion &region) override
Definition ram_tile_storage.cpp:39
std::string info_string() const override
Definition tile_storage.hpp:95
Array & get_tile(const TileRegion &region) override
Definition ram_tile_storage.cpp:23
std::unique_ptr< TileStorage > clone() const override
Definition ram_tile_storage.cpp:18
Definition tile_storage.hpp:62
virtual void trim()
Definition tile_storage.hpp:76
virtual ~TileStorage()=default
virtual std::string info_string() const =0
virtual void release_tile(const TileRegion &region)=0
virtual std::unique_ptr< TileStorage > clone() const =0
virtual size_t live_memory_bytes() const =0
virtual size_t max_live_tiles() const =0
virtual size_t live_tile_count() const =0
virtual Array & get_tile(const TileRegion &region)=0
Definition algebra.hpp:23
std::string to_string(StorageMode m)
Definition tile_storage.hpp:37
std::unique_ptr< TileStorage > make_storage(glm::ivec2 shape, glm::ivec2 tile_shape, StorageMode storage_mode)
Definition tile_storage.cpp:13
StorageMode
Definition tile_storage.hpp:30
@ VA_DISK_LRU_MIN
Definition tile_storage.hpp:33
@ VA_DISK_LRU
Definition tile_storage.hpp:32
@ VA_DISK_SEQUENTIAL
Definition tile_storage.hpp:34
@ VA_RAM
Definition tile_storage.hpp:31
Definition tile_storage.hpp:109
std::list< TileKey >::iterator lru_it
Definition tile_storage.hpp:111
Array value
Definition tile_storage.hpp:110
Definition tile_storage.hpp:50
size_t operator()(const TileKey &k) const
Definition tile_storage.hpp:51
Definition tile_region.hpp:22
int ty
Definition tile_region.hpp:24
int tx
Definition tile_region.hpp:23
Definition tile_region.hpp:38