1 /**
2 Copyright: Copyright (c) 2017-2018 Andrey Penechko.
3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6 module voxelman.container.hash.keybucket;
7 
8 struct MetaKeyBucket(Key)
9 {
10 	enum BucketType : ubyte {
11 		empty,
12 		used,
13 		deleted
14 	}
15 
16 	BucketType type;
17 	Key key;
18 
19 	bool empty() const { return type == BucketType.empty; }
20 	bool used() const { return type == BucketType.used; }
21 	bool deleted() const { return type == BucketType.deleted; }
22 	bool corrupted() const { return type > cast(BucketType)2; }
23 
24 	bool canInsert(Key key) const {
25 		return type == BucketType.empty || this.key == key;
26 	}
27 
28 	void markAsDeleted() {
29 		type = BucketType.deleted;
30 	}
31 	void assignKey(Key key) {
32 		this.key = key;
33 		type = BucketType.used;
34 	}
35 
36 	static void clearBuckets(typeof(this)[] keyBuckets)
37 	{
38 		auto buf = cast(ubyte[])keyBuckets;
39 		buf[] = 0; // set KeyBucket.type to empty
40 	}
41 }
42 
43 /// Uses 2 special key values to mark empty and deleted buckets
44 struct KeyBucket(Key, Key emptyKey, Key deletedKey)
45 {
46 	Key key = emptyKey;
47 
48 	bool empty() const { return key == emptyKey; }
49 	bool used() const { return key != emptyKey && key != deletedKey; }
50 	bool deleted() const { return key == deletedKey; }
51 	bool corrupted() const { return false; }
52 
53 	bool canInsert(Key key) const {
54 		return this.key == emptyKey || this.key == key;
55 	}
56 
57 	void markAsDeleted() {
58 		key = deletedKey;
59 	}
60 	void assignKey(Key key) {
61 		this.key = key;
62 	}
63 
64 	static void clearBuckets(typeof(this)[] keyBuckets)
65 	{
66 		keyBuckets[] = typeof(this).init;
67 	}
68 }