yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Ellie Hermaszewskaformatf65d756bf

master
2.4 KiB88 linesraw
1#include "slang-perfect-hash-codegen.h"
2
3#include "../core/slang-io.h"
4
5namespace Slang
6{
7SlangResult writeHashFile(
8    String outCppPath,
9    String valueType,
10    const List<String> includes,
11    const HashParams& hashParams,
12    const List<String> values)
13{
14    StringBuilder sb;
15    StringWriter writer(&sb, WriterFlags(0));
16    WriterHelper w(&writer);
17
18    w.print("// Hash function for %s\n", valueType.getBuffer());
19    w.print("//\n");
20    w.print("// This file was thoughtfully generated by a machine,\n");
21    w.print("// don't even think about modifying it yourself!\n");
22    w.print("//\n");
23    w.print("\n");
24    for (const auto& i : includes)
25    {
26        if (i.getLength())
27            w.print("#include \"%s\"\n", i.getBuffer());
28    }
29    w.print("\n");
30    w.print("\n");
31    w.print("namespace Slang\n");
32    w.print("{\n");
33    w.print("\n");
34
35    w.put(perfectHashToEmbeddableCpp(
36              hashParams,
37              valueType.getUnownedSlice(),
38              (String("lookup") + valueType).getUnownedSlice(),
39              values)
40              .getBuffer());
41
42    w.print("}\n");
43
44    return File::writeAllTextIfChanged(outCppPath, sb.getUnownedSlice());
45}
46
47SlangResult writePerfectHashLookupCppFile(
48    String fileName,
49    List<String> opnames,
50    String enumName,
51    String enumerantPrefix,
52    String enumHeaderFile,
53    DiagnosticSink* sink)
54{
55    HashParams hashParams;
56    auto r = minimalPerfectHash(opnames, hashParams);
57    switch (r)
58    {
59    case HashFindResult::UnavoidableHashCollision:
60        {
61            sink->diagnoseRaw(
62                Severity::Error,
63                "Unable to find a non-overlapping hash function.\n"
64                "The hash function probably has a unavoidable "
65                "collision for some input words\n");
66            return SLANG_FAIL;
67        }
68    case HashFindResult::NonUniqueKeys:
69        {
70            sink->diagnoseRaw(Severity::Error, "Input word list has duplicates\n");
71            return SLANG_FAIL;
72        }
73    case HashFindResult::Success:;
74    }
75
76    List<String> values;
77    values.reserve(hashParams.destTable.getCount());
78    for (const auto& v : hashParams.destTable)
79        values.add(enumerantPrefix + v);
80    return writeHashFile(
81        fileName,
82        enumName,
83        {"core/slang-common.h", "core/slang-string.h", enumHeaderFile},
84        hashParams,
85        values);
86}
87
88} // namespace Slang