Prechádzať zdrojové kódy

LibUnicode: Define traits for a vector of integral/enum types

Any generator which defines a unique storage instance for a list of
numbers will need this.
Timothy Flynn 3 rokov pred
rodič
commit
415763b1b3

+ 0 - 14
Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeNumberFormat.cpp

@@ -130,20 +130,6 @@ struct AK::Traits<NumberFormat> : public GenericTraits<NumberFormat> {
 };
 
 using NumberFormatList = Vector<NumberFormatIndexType>;
-
-template<>
-struct AK::Traits<NumberFormatList> : public GenericTraits<NumberFormatList> {
-    static unsigned hash(NumberFormatList const& formats)
-    {
-        auto hash = int_hash(static_cast<u32>(formats.size()));
-
-        for (auto format : formats)
-            hash = pair_int_hash(hash, format);
-
-        return hash;
-    }
-};
-
 using NumericSymbolList = Vector<StringIndexType>;
 
 struct NumberSystem {

+ 22 - 0
Meta/Lagom/Tools/CodeGenerators/LibUnicode/GeneratorUtil.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/Format.h>
+#include <AK/HashFunctions.h>
 #include <AK/HashMap.h>
 #include <AK/LexicalPath.h>
 #include <AK/Optional.h>
@@ -14,6 +15,7 @@
 #include <AK/SourceGenerator.h>
 #include <AK/String.h>
 #include <AK/StringView.h>
+#include <AK/Traits.h>
 #include <AK/Vector.h>
 #include <LibCore/DirIterator.h>
 #include <LibCore/File.h>
@@ -25,6 +27,26 @@ inline constexpr bool StorageTypeIsList = false;
 template<class T>
 inline constexpr bool StorageTypeIsList<Vector<T>> = true;
 
+template<typename T>
+concept IntegralOrEnum = Integral<T> || Enum<T>;
+
+template<IntegralOrEnum T>
+struct AK::Traits<Vector<T>> : public GenericTraits<Vector<T>> {
+    static unsigned hash(Vector<T> const& list)
+    {
+        auto hash = int_hash(static_cast<u32>(list.size()));
+
+        for (auto value : list) {
+            if constexpr (Enum<T>)
+                hash = pair_int_hash(hash, to_underlying(value));
+            else
+                hash = pair_int_hash(hash, value);
+        }
+
+        return hash;
+    }
+};
+
 template<typename StorageType, typename IndexType>
 class UniqueStorage {
 public: