54 NvFlowUint64 keyCount = 0llu;
56 NvFlowUint64 find(
const char* path, NvFlowUint hash)
58 path = path ? path :
"";
59 NvFlowUint64 beginIdx = hash & (hashs.size - 1u);
60 for (NvFlowUint64 iterIdx = 0u; iterIdx < hashs.size; iterIdx++)
62 NvFlowUint64 idx = (iterIdx + beginIdx) & (hashs.size - 1u);
63 if (hashs[idx] == hash &&
64 keys[idx].size > 0u &&
65 strcmp(keys[idx].data, path) == 0)
73 NvFlowUint64 insertNoResize(
const char* path, NvFlowUint hash,
const T& value, NvFlowBool32* pSuccess =
nullptr)
75 path = path ? path :
"";
78 *pSuccess = NV_FLOW_FALSE;
80 NvFlowUint64 beginIdx = hash & (hashs.size - 1u);
81 for (NvFlowUint64 iterIdx = 0u; iterIdx < hashs.size; iterIdx++)
83 NvFlowUint64 idx = (iterIdx + beginIdx) & (hashs.size - 1u);
84 if (keys[idx].size == 0u)
88 for (NvFlowUint64 strIdx = 0u; path[strIdx]; strIdx++)
90 keys[idx].pushBack(path[strIdx]);
92 keys[idx].pushBack(
'\0');
96 *pSuccess = NV_FLOW_TRUE;
100 else if (hashs[idx] == hash &&
101 keys[idx].size > 0u &&
102 strcmp(keys[idx].data, path) == 0)
110 NvFlowUint64 insert(
const char* path, NvFlowUint hash,
const T& value, NvFlowBool32* pSuccess =
nullptr)
113 if (2u * (keyCount + 1u) >= hashs.size)
118 NvFlowUint64 newSize = 1u;
119 while (newSize <= hashs_old.size)
123 hashs.reserve(newSize);
124 keys.reserve(newSize);
125 values.reserve(newSize);
126 hashs.size = newSize;
128 values.size = newSize;
130 for (NvFlowUint64 idx = 0u; idx < hashs_old.size; idx++)
132 if (keys_old[idx].size > 0u)
134 insertNoResize(keys_old[idx].data, hashs_old[idx], values_old[idx],
nullptr);
138 return insertNoResize(path, hash, value, pSuccess);
141 NvFlowBool32 erase(
const char* path, NvFlowUint hash)
143 NvFlowUint64 findIdx = find(path, hash);
144 if (findIdx != ~0llu)
148 keys[findIdx].size = 0u;
149 values[findIdx] = T();
152 return NV_FLOW_FALSE;