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#include <unordered_map>
17
18#include "highmap/array.hpp"
20
21namespace hmap
22{
23
24// =====================================
25// Peripheric classes
26// =====================================
27
28enum StorageMode : int
29{
32 VA_DISK_LRU_MIN, // 2 live tiles, min mem footprint
33 VA_DISK_SEQUENTIAL // sequential for/each, no smooth_overlap
34};
35
36inline std::string to_string(StorageMode m)
37{
38 switch (m)
39 {
40 case StorageMode::VA_RAM: return "VA_RAM";
41 case StorageMode::VA_DISK_LRU: return "VA_DISK_LRU";
42 case StorageMode::VA_DISK_LRU_MIN: return "VA_DISK_LRU_MIN";
43 case StorageMode::VA_DISK_SEQUENTIAL: return "VA_DISK_SEQUENTIAL";
44 }
45 return "UNKNOWN";
46}
47
49{
50 size_t operator()(const TileKey &k) const
51 {
52 return (static_cast<size_t>(k.tx) << 32) ^ static_cast<size_t>(k.ty);
53 }
54};
55
56// =====================================
57// Abstract class
58// =====================================
59
61{
62public:
63 virtual ~TileStorage() = default;
64 virtual Array &get_tile(const TileRegion &region) = 0;
65 virtual void release_tile(const TileRegion &region) = 0;
66 virtual size_t max_live_tiles() const = 0;
67 virtual std::unique_ptr<TileStorage> clone() const = 0;
68 virtual std::string info_string() const = 0;
69
70 // Opportunistically free memory while keeping data persistent.
71 virtual void trim()
72 {
73 }
74};
75
76// =====================================
77// RAM storage
78// =====================================
79
81{
82public:
83 std::unique_ptr<TileStorage> clone() const override;
84
85 Array &get_tile(const TileRegion &region) override;
86 void release_tile(const TileRegion &region) override;
87 size_t max_live_tiles() const override;
88 std::string info_string() const override
89 {
90 return "RAM";
91 };
92
93private:
94 std::unordered_map<TileKey, Array, TileKeyHash> tiles;
95};
96
97// =====================================
98// LRU storage
99// =====================================
100
102{
104 std::list<TileKey>::iterator lru_it;
105};
106
108{
109public:
110 explicit LruTileStorage(size_t max_tiles);
111
112 std::unique_ptr<TileStorage> clone() const override;
113
114 Array &get_tile(const TileRegion &region) override;
115 void release_tile(const TileRegion &region) override;
116 size_t max_live_tiles() const override;
117 std::string info_string() const override;
118
119protected:
120 size_t max_tiles;
121 std::list<TileKey> lru;
122 std::unordered_map<TileKey, LruTileEntry, TileKeyHash> tiles;
123 std::mutex mutex;
124
126 virtual void on_evict(const TileKey &key, Array &tile);
127};
128
129// =====================================
130// DISK-LRU storage
131// =====================================
132
134{
135public:
138
139 std::unique_ptr<TileStorage> clone() const override;
140
141 Array &get_tile(const TileRegion &region) override;
142 size_t max_live_tiles() const override;
143 void trim() override;
144
145protected:
146 void on_evict(const TileKey &key, Array &tile) override;
147
148private:
149 std::filesystem::path root_dir;
150
151 std::filesystem::path tile_path(const TileKey &key) const;
152 Array load_tile_from_disk(const TileRegion &region);
153};
154
155// =====================================
156// DISK-sequential storage
157// =====================================
158
160{
161public:
164
165 std::unique_ptr<TileStorage> clone() const override;
166
167 Array &get_tile(const TileRegion &region) override;
168 void release_tile(const TileRegion &region) override;
169 size_t max_live_tiles() const override;
170 void trim() override;
171 std::string info_string() const override
172 {
173 return "DiskSequential";
174 };
175
176private:
177 std::filesystem::path root_dir;
178 TileKey current_key{};
179 std::optional<Array> current_tile;
180
181 Array load_or_create(const TileRegion &region);
182 void save_tile(const TileKey &key, const Array &tile);
183 std::filesystem::path tile_path(const TileKey &key) const;
184};
185
186// =====================================
187// functions
188// =====================================
189
190std::unique_ptr<TileStorage> make_storage(glm::ivec2 shape,
191 glm::ivec2 tile_shape,
192 StorageMode storage_mode);
193
194} // 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:134
void on_evict(const TileKey &key, Array &tile) override
Definition disk_lru_storage.cpp:91
~DiskLruTileStorage()
Definition disk_lru_storage.cpp:18
void trim() override
Definition disk_lru_storage.cpp:109
size_t max_live_tiles() const override
Definition disk_lru_storage.cpp:86
Array & get_tile(const TileRegion &region) override
Definition disk_lru_storage.cpp:29
std::unique_ptr< TileStorage > clone() const override
Definition disk_lru_storage.cpp:24
Definition tile_storage.hpp:160
~DiskSequentialTileStorage() override
Definition disk_sequential_storage.cpp:17
void trim() override
Definition disk_sequential_storage.cpp:97
std::unique_ptr< TileStorage > clone() const override
Definition disk_sequential_storage.cpp:23
Array & get_tile(const TileRegion &region) override
Definition disk_sequential_storage.cpp:28
void release_tile(const TileRegion &region) override
Definition disk_sequential_storage.cpp:64
size_t max_live_tiles() const override
Definition disk_sequential_storage.cpp:59
DiskSequentialTileStorage()
Definition disk_sequential_storage.cpp:12
std::string info_string() const override
Definition tile_storage.hpp:171
Definition tile_storage.hpp:108
std::list< TileKey > lru
Definition tile_storage.hpp:121
size_t max_live_tiles() const override
Definition lru_tile_storage.cpp:72
std::string info_string() const override
Definition lru_tile_storage.cpp:67
std::unique_ptr< TileStorage > clone() const override
Definition lru_tile_storage.cpp:15
size_t max_tiles
Definition tile_storage.hpp:120
Array & get_tile_no_mutex_lock(const TileRegion &region)
Definition lru_tile_storage.cpp:26
void release_tile(const TileRegion &region) override
Definition lru_tile_storage.cpp:77
std::mutex mutex
Definition tile_storage.hpp:123
virtual void on_evict(const TileKey &key, Array &tile)
Definition lru_tile_storage.cpp:82
Array & get_tile(const TileRegion &region) override
Definition lru_tile_storage.cpp:20
std::unordered_map< TileKey, LruTileEntry, TileKeyHash > tiles
Definition tile_storage.hpp:122
Definition tile_storage.hpp:81
size_t max_live_tiles() const override
Definition ram_tile_storage.cpp:29
void release_tile(const TileRegion &region) override
Definition ram_tile_storage.cpp:34
std::string info_string() const override
Definition tile_storage.hpp:88
Array & get_tile(const TileRegion &region) override
Definition ram_tile_storage.cpp:18
std::unique_ptr< TileStorage > clone() const override
Definition ram_tile_storage.cpp:13
Definition tile_storage.hpp:61
virtual void trim()
Definition tile_storage.hpp:71
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 max_live_tiles() const =0
virtual Array & get_tile(const TileRegion &region)=0
Definition algebra.hpp:22
std::string to_string(StorageMode m)
Definition tile_storage.hpp:36
std::unique_ptr< TileStorage > make_storage(glm::ivec2 shape, glm::ivec2 tile_shape, StorageMode storage_mode)
Definition tile_storage.cpp:12
StorageMode
Definition tile_storage.hpp:29
@ VA_DISK_LRU_MIN
Definition tile_storage.hpp:32
@ VA_DISK_LRU
Definition tile_storage.hpp:31
@ VA_DISK_SEQUENTIAL
Definition tile_storage.hpp:33
@ VA_RAM
Definition tile_storage.hpp:30
Definition tile_storage.hpp:102
std::list< TileKey >::iterator lru_it
Definition tile_storage.hpp:104
Array value
Definition tile_storage.hpp:103
Definition tile_storage.hpp:49
size_t operator()(const TileKey &k) const
Definition tile_storage.hpp:50
Definition tile_region.hpp:22
int ty
Definition tile_region.hpp:24
int tx
Definition tile_region.hpp:23
Definition tile_region.hpp:38