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 // Opportunistically free memory while keeping data persistent.
72 virtual void trim()
73 {
74 }
75};
76
77// =====================================
78// RAM storage
79// =====================================
80
82{
83public:
84 std::unique_ptr<TileStorage> clone() const override;
85
86 Array &get_tile(const TileRegion &region) override;
87 void release_tile(const TileRegion &region) override;
88 size_t max_live_tiles() const override;
89 std::string info_string() const override
90 {
91 return "RAM";
92 };
93
94private:
95 std::unordered_map<TileKey, Array, TileKeyHash> tiles;
96};
97
98// =====================================
99// LRU storage
100// =====================================
101
103{
105 std::list<TileKey>::iterator lru_it;
106};
107
109{
110public:
111 explicit LruTileStorage(size_t max_tiles);
112
113 std::unique_ptr<TileStorage> clone() const override;
114
115 Array &get_tile(const TileRegion &region) override;
116 void release_tile(const TileRegion &region) override;
117 size_t max_live_tiles() const override;
118 std::string info_string() const override;
119
120protected:
121 size_t max_tiles;
122 std::list<TileKey> lru;
123 std::unordered_map<TileKey, LruTileEntry, TileKeyHash> tiles;
124 std::mutex mutex;
125
127 virtual void on_evict(const TileKey &key, Array &tile);
128};
129
130// =====================================
131// DISK-LRU storage
132// =====================================
133
135{
136public:
139
140 std::unique_ptr<TileStorage> clone() const override;
141
142 Array &get_tile(const TileRegion &region) override;
143 size_t max_live_tiles() const override;
144 void trim() override;
145
146protected:
147 void on_evict(const TileKey &key, Array &tile) override;
148
149private:
150 std::filesystem::path root_dir;
151
152 std::filesystem::path tile_path(const TileKey &key) const;
153 Array load_tile_from_disk(const TileRegion &region);
154};
155
156// =====================================
157// DISK-sequential storage
158// =====================================
159
161{
162public:
165
166 std::unique_ptr<TileStorage> clone() const override;
167
168 Array &get_tile(const TileRegion &region) override;
169 void release_tile(const TileRegion &region) override;
170 size_t max_live_tiles() const override;
171 void trim() override;
172 std::string info_string() const override
173 {
174 return "DiskSequential";
175 };
176
177private:
178 std::filesystem::path root_dir;
179 TileKey current_key{};
180 std::optional<Array> current_tile;
181
182 Array load_or_create(const TileRegion &region);
183 void save_tile(const TileKey &key, const Array &tile);
184 std::filesystem::path tile_path(const TileKey &key) const;
185};
186
187// =====================================
188// functions
189// =====================================
190
191std::unique_ptr<TileStorage> make_storage(glm::ivec2 shape,
192 glm::ivec2 tile_shape,
193 StorageMode storage_mode);
194
195} // 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:135
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:161
~DiskSequentialTileStorage() override
Definition disk_sequential_storage.cpp:29
void trim() override
Definition disk_sequential_storage.cpp:109
std::unique_ptr< TileStorage > clone() const override
Definition disk_sequential_storage.cpp:35
Array & get_tile(const TileRegion &region) override
Definition disk_sequential_storage.cpp:40
void release_tile(const TileRegion &region) override
Definition disk_sequential_storage.cpp:76
size_t max_live_tiles() const override
Definition disk_sequential_storage.cpp:71
DiskSequentialTileStorage()
Definition disk_sequential_storage.cpp:24
std::string info_string() const override
Definition tile_storage.hpp:172
Definition tile_storage.hpp:109
std::list< TileKey > lru
Definition tile_storage.hpp:122
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:121
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:86
std::mutex mutex
Definition tile_storage.hpp:124
virtual void on_evict(const TileKey &key, Array &tile)
Definition lru_tile_storage.cpp:91
Array & get_tile(const TileRegion &region) override
Definition lru_tile_storage.cpp:29
std::unordered_map< TileKey, LruTileEntry, TileKeyHash > tiles
Definition tile_storage.hpp:123
Definition tile_storage.hpp:82
size_t max_live_tiles() const override
Definition ram_tile_storage.cpp:34
void release_tile(const TileRegion &region) override
Definition ram_tile_storage.cpp:39
std::string info_string() const override
Definition tile_storage.hpp:89
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:72
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: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:14
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:103
std::list< TileKey >::iterator lru_it
Definition tile_storage.hpp:105
Array value
Definition tile_storage.hpp:104
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