1 /**
2 Copyright: Copyright (c) 2016-2018 Andrey Penechko.
3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6 module voxelman.world.storage.chunk.activechunks;
7 
8 import voxelman.log;
9 import std.array : empty;
10 import cbor;
11 import voxelman.container.hash.set;
12 
13 import voxelman.world.storage;
14 
15 struct ActiveChunks
16 {
17 	private auto dbKey = IoKey("voxelman.world.active_chunks");
18 	HashSet!ChunkWorldPos chunks;
19 	void delegate(ChunkWorldPos cwp) loadChunk;
20 	void delegate(ChunkWorldPos cwp) unloadChunk;
21 
22 	void add(ChunkWorldPos cwp) {
23 		chunks.put(cwp);
24 		loadChunk(cwp);
25 	}
26 
27 	void remove(ChunkWorldPos cwp) {
28 		if (chunks.remove(cwp))
29 			unloadChunk(cwp);
30 	}
31 
32 	void loadActiveChunks() {
33 		foreach(cwp; chunks) {
34 			loadChunk(cwp);
35 			infof("load active: %s", cwp);
36 		}
37 	}
38 
39 	package(voxelman.world) void read(ref PluginDataLoader loader) {
40 		ubyte[] data = loader.readEntryRaw(dbKey);
41 		if (!data.empty) {
42 			auto token = decodeCborToken(data);
43 			assert(token.type == CborTokenType.arrayHeader);
44 			foreach(_; 0..token.uinteger)
45 				chunks.put(decodeCborSingle!ChunkWorldPos(data));
46 			assert(data.empty);
47 		}
48 	}
49 
50 	package(voxelman.world) void write(ref PluginDataSaver saver) {
51 		auto sink = saver.beginWrite();
52 		encodeCborArrayHeader(sink, chunks.length);
53 		foreach(cwp; chunks)
54 			encodeCbor(sink, cwp);
55 		saver.endWrite(dbKey);
56 	}
57 }