-
Notifications
You must be signed in to change notification settings - Fork 90
/
Copy pathpalHashMap.h
143 lines (130 loc) · 6.58 KB
/
palHashMap.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
***********************************************************************************************************************
*
* Copyright (c) 2014-2025 Advanced Micro Devices, Inc. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
**********************************************************************************************************************/
/**
***********************************************************************************************************************
* @file palHashMap.h
* @brief PAL utility collection HashMap class declaration.
***********************************************************************************************************************
*/
#pragma once
#include "palHashBase.h"
namespace Util
{
/// Encapsulates one key/value pair in a hash map.
template<typename Key, typename Value>
struct HashMapEntry
{
Key key; ///< Hash map entry key.
Value value; ///< Hash map entry value.
};
/**
***********************************************************************************************************************
* @brief Templated hash map container.
*
* This container is meant for storing elements of an arbitrary (but uniform) key/value type. Supported operations:
*
* - Searching
* - Insertion
* - Deletion
* - Iteration
*
* HashFunc is a functor for hashing keys. Built-in choices for HashFunc are:
*
* - DefaultHashFunc: Good choice when the key is a pointer.
* - JenkinsHashFunc: Good choice when the key is arbitrary binary data.
* - StringJenkinsHashFunc: Good choice when the key is a C-style string.
*
* EqualFunc is a functor for comparing keys. Built-in choices for EqualFunc are:
*
* - DefaultEqualFunc: Determines keys are equal by bitwise comparison.
* - StringEqualFunc: Treats keys as a char* and compares them as C-style strings.
*
* @warning This class is not thread-safe for Insert, FindAllocate, Erase, or iteration!
* @warning Init() must be called before using this container. Begin() and Reset() can be safely called before
* initialization and Begin() will always return an iterator that points to null.
*
* For more details please refer to @ref HashBase.
***********************************************************************************************************************
*/
template<typename Key,
typename Value,
typename Allocator,
template<typename> class HashFunc = DefaultHashFunc,
template<typename> class EqualFunc = DefaultEqualFunc,
typename AllocFunc = HashAllocator<Allocator>,
size_t GroupSize = PAL_CACHE_LINE_BYTES * 2>
class HashMap : public HashBase<Key, HashMapEntry<Key, Value>, Allocator, HashFunc<Key>, EqualFunc<Key>, AllocFunc, GroupSize>
{
public:
/// Convenience typedef for a templated entry of this hash map.
typedef HashMapEntry<Key, Value> Entry;
/// @internal Constructor
///
/// @param [in] numBuckets Number of buckets to allocate for this hash container. The initial hash container will
/// take (buckets * GroupSize) bytes.
/// @param [in] pAllocator Pointer to an allocator that will create system memory requested by this hash container.
explicit HashMap(uint32 numBuckets, Allocator*const pAllocator): Base::HashBase(numBuckets, pAllocator) { }
virtual ~HashMap() { }
/// Finds a given entry; if no entry was found, allocate it.
///
/// @param [in] key Key to search for.
/// @param [out] pExisted True if an entry for the specified key existed before this call was made. False indicates
/// that a new entry was allocated as a result of this call.
/// @param [out] ppValue Readable/writeable value in the hash map corresponding to the specified key.
///
/// @returns @ref Success if the operation completed successfully, or @ref ErrorOutOfMemory if the operation failed
/// because an internal memory allocation failed.
Result FindAllocate(const Key& key, bool* pExisted, Value** ppValue);
/// Gets a pointer to the value that matches the specified key.
///
/// @param [in] key Key to search for.
///
/// @returns A pointer to the value that matches the specified key or null if an entry for the key does not exist.
Value* FindKey(const Key& key) const;
/// Inserts a key/value pair entry if the key doesn't already exist in the hash map.
///
/// @warning No action will be taken if an entry matching this key already exists, even if the specified value
/// differs from the current value stored in the entry matching the specified key.
///
/// @param [in] key Key of the new entry to insert.
/// @param [in] value Value of the new entry to insert.
///
/// @returns @ref Success if the operation completed successfully, or @ref ErrorOutOfMemory if the operation failed
/// because an internal memory allocation failed.
Result Insert(const Key& key, const Value& value);
/// Removes an entry that matches the specified key.
///
/// @param [in] key Key of the entry to erase.
///
/// @returns True if the erase completed successfully, false if an entry for this key did not exist.
bool Erase(const Key& key);
private:
// Typedef for the specialized 'HashBase' object we're inheriting from so we can use properly qualified names when
// accessing members of HashBase.
typedef HashBase<Key, HashMapEntry<Key, Value>, Allocator, HashFunc<Key>, EqualFunc<Key>, AllocFunc, GroupSize> Base;
PAL_DISALLOW_DEFAULT_CTOR(HashMap);
PAL_DISALLOW_COPY_AND_ASSIGN(HashMap);
};
} // Util