diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2024-12-06 17:33:40 -0500 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2024-12-06 17:35:35 -0500 |
commit | d1024b559c44a143eca214fb8732001080e8b037 (patch) | |
tree | 1c6ad799195b9f917047aa11b72e1f7dc0ecb013 /generator/godot_variant.cpp | |
parent | ad8243c74c1d718b94a2a4bf4f0fa56d4c9dbb45 (diff) | |
download | lingo-randomizer-d1024b559c44a143eca214fb8732001080e8b037.tar.gz lingo-randomizer-d1024b559c44a143eca214fb8732001080e8b037.tar.bz2 lingo-randomizer-d1024b559c44a143eca214fb8732001080e8b037.zip |
Change output format to zstd compressed Godot serialized variant
Diffstat (limited to 'generator/godot_variant.cpp')
-rw-r--r-- | generator/godot_variant.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/generator/godot_variant.cpp b/generator/godot_variant.cpp new file mode 100644 index 0000000..dd1ad33 --- /dev/null +++ b/generator/godot_variant.cpp | |||
@@ -0,0 +1,69 @@ | |||
1 | #include "godot_variant.h" | ||
2 | |||
3 | #include <stdexcept> | ||
4 | |||
5 | bool GodotVariant::operator<(const GodotVariant& rhs) const { | ||
6 | if (value.index() != rhs.value.index()) { | ||
7 | return value.index() < rhs.value.index(); | ||
8 | } | ||
9 | |||
10 | if (const int32_t* pval = std::get_if<int32_t>(&value)) { | ||
11 | return *pval < std::get<int32_t>(rhs.value); | ||
12 | } else if (const std::string* pval = std::get_if<std::string>(&value)) { | ||
13 | return *pval < std::get<std::string>(rhs.value); | ||
14 | } else if (const std::map<GodotVariant, GodotVariant>* pval = | ||
15 | std::get_if<std::map<GodotVariant, GodotVariant>>(&value)) { | ||
16 | return *pval < std::get<std::map<GodotVariant, GodotVariant>>(rhs.value); | ||
17 | } else if (const std::vector<GodotVariant>* pval = | ||
18 | std::get_if<std::vector<GodotVariant>>(&value)) { | ||
19 | return *pval < std::get<std::vector<GodotVariant>>(rhs.value); | ||
20 | } | ||
21 | |||
22 | throw std::invalid_argument("Incomparable variants."); | ||
23 | } | ||
24 | |||
25 | void GodotVariant::Serialize(std::basic_ostream<char>& output) const { | ||
26 | if (const int32_t* pval = std::get_if<int32_t>(&value)) { | ||
27 | uint32_t typebits = 2; | ||
28 | output.write(reinterpret_cast<char*>(&typebits), 4); | ||
29 | output.write(reinterpret_cast<const char*>(pval), 4); | ||
30 | } else if (const std::string* pval = std::get_if<std::string>(&value)) { | ||
31 | uint32_t typebits = 4; | ||
32 | output.write(reinterpret_cast<char*>(&typebits), 4); | ||
33 | |||
34 | uint32_t lengthbits = pval->length(); | ||
35 | output.write(reinterpret_cast<char*>(&lengthbits), 4); | ||
36 | |||
37 | output.write(pval->data(), pval->length()); | ||
38 | |||
39 | if (pval->length() % 4 != 0) { | ||
40 | int padding = 4 - (pval->length() % 4); | ||
41 | for (int i = 0; i < padding; i++) { | ||
42 | output.put(0); | ||
43 | } | ||
44 | } | ||
45 | } else if (const std::map<GodotVariant, GodotVariant>* pval = | ||
46 | std::get_if<std::map<GodotVariant, GodotVariant>>(&value)) { | ||
47 | uint32_t typebits = 18; | ||
48 | output.write(reinterpret_cast<char*>(&typebits), 4); | ||
49 | |||
50 | uint32_t lengthbits = pval->size() & 0x7fffffff; | ||
51 | output.write(reinterpret_cast<char*>(&lengthbits), 4); | ||
52 | |||
53 | for (const auto& mapping : *pval) { | ||
54 | mapping.first.Serialize(output); | ||
55 | mapping.second.Serialize(output); | ||
56 | } | ||
57 | } else if (const std::vector<GodotVariant>* pval = | ||
58 | std::get_if<std::vector<GodotVariant>>(&value)) { | ||
59 | uint32_t typebits = 19; | ||
60 | output.write(reinterpret_cast<char*>(&typebits), 4); | ||
61 | |||
62 | uint32_t lengthbits = pval->size() & 0x7fffffff; | ||
63 | output.write(reinterpret_cast<char*>(&lengthbits), 4); | ||
64 | |||
65 | for (const auto& entry : *pval) { | ||
66 | entry.Serialize(output); | ||
67 | } | ||
68 | } | ||
69 | } | ||