summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2023-09-29 19:10:22 -0400
committerGitHub <noreply@github.com>2023-09-29 16:10:22 -0700
commit6138de5f084cafdc98381237c2d8bed7c8804f1c (patch)
treeed6530954c9f4a19447b094ce62a237c3eb19978 /source
parentf20f4e2b39142dfab55be05eea064033719665ad (diff)
Fix for problem with OrderedHashSet causing crash (#3251)
* Fix for problem with OrderedHashSet causing crashes during running tests on on g++ 7.3 * Fix typo
Diffstat (limited to 'source')
-rw-r--r--source/core/slang-dictionary.h33
1 files changed, 29 insertions, 4 deletions
diff --git a/source/core/slang-dictionary.h b/source/core/slang-dictionary.h
index ff7e201bf..ba4672740 100644
--- a/source/core/slang-dictionary.h
+++ b/source/core/slang-dictionary.h
@@ -75,6 +75,32 @@ namespace Slang
return KeyValuePair<TKey, TValue>(k, v);
}
+ namespace KeyValueDetail {
+
+ template <typename KEY, typename VALUE>
+ SLANG_FORCE_INLINE const KEY* getKey(const std::pair<KEY, VALUE>* in)
+ {
+ return &in->first;
+ }
+ template <typename KEY, typename VALUE>
+ SLANG_FORCE_INLINE const KEY* getKey(const KeyValuePair<KEY, VALUE>* in)
+ {
+ return &in->key;
+ }
+
+ template <typename KEY, typename VALUE>
+ SLANG_FORCE_INLINE const VALUE* getValue(const std::pair<KEY, VALUE>* in)
+ {
+ return &in->second;
+ }
+ template <typename KEY, typename VALUE>
+ SLANG_FORCE_INLINE const VALUE* getValue(const KeyValuePair<KEY, VALUE>* in)
+ {
+ return &in->value;
+ }
+
+ } // namespace KeyValueDetail
+
const float kMaxLoadFactor = 0.7f;
template<typename TKey, typename TValue, typename Hash = Slang::Hash<TKey>, typename KeyEqual = std::equal_to<TKey>>
@@ -321,14 +347,13 @@ namespace Slang
Iterator() = default;
const T& operator*() const
{
- const auto& [k, v] = *iter;
- return k;
+ return *KeyValueDetail::getKey(std::addressof(*iter));
}
const T* operator->() const
{
- const auto& [k, v] = *iter;
- return &k;
+ return KeyValueDetail::getKey(std::addressof(*iter));
}
+
Iterator& operator++()
{
++iter;