Porytiles
Loading...
Searching...
No Matches
packing_strategy_type.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <cctype>
5#include <format>
6#include <optional>
7#include <ostream>
8#include <string>
9
11
12/*
13 * NOTE: DO NOT EDIT THIS FILE DIRECTLY. It is AUTO-GENERATED from config_schema.yaml.
14 * To add new config values or make other changes, edit config_schema.yaml and regenerate via:
15 *
16 * uv run scripts/generate_config.py
17 */
18
19namespace porytiles {
20
44};
45
61[[nodiscard]] inline std::optional<PackingStrategyType> packing_strategy_type_from_str(const std::string &str)
62{
63 // Phase 1: Exact match against C++ constant names
64 if (str == "best_fusion") {
65 return std::optional{ PackingStrategyType::best_fusion };
66 }
67 if (str == "backtracking") {
68 return std::optional{ PackingStrategyType::backtracking };
69 }
70 if (str == "overload_and_remove") {
71 return std::optional{ PackingStrategyType::overload_and_remove };
72 }
73
74 // Phase 2: Case-insensitive fuzzy match
75 std::string lower_str = str;
76 std::ranges::transform(
77 lower_str, lower_str.begin(), [](unsigned char c) { return static_cast<char>(std::tolower(c)); });
78
79 // Fuzzy names for best_fusion
80 if (lower_str == "best-fusion") {
81 return std::optional{ PackingStrategyType::best_fusion };
82 }
83 if (lower_str == "best_fusion") {
84 return std::optional{ PackingStrategyType::best_fusion };
85 }
86 if (lower_str == "bestfusion") {
87 return std::optional{ PackingStrategyType::best_fusion };
88 }
89 // Fuzzy names for backtracking
90 if (lower_str == "backtracking") {
91 return std::optional{ PackingStrategyType::backtracking };
92 }
93 // Fuzzy names for overload_and_remove
94 if (lower_str == "overload-and-remove") {
95 return std::optional{ PackingStrategyType::overload_and_remove };
96 }
97 if (lower_str == "overload_and_remove") {
98 return std::optional{ PackingStrategyType::overload_and_remove };
99 }
100 if (lower_str == "overloadandremove") {
101 return std::optional{ PackingStrategyType::overload_and_remove };
102 }
103
104 return std::nullopt;
105}
106
117[[nodiscard]] inline std::string to_string(const PackingStrategyType m)
118{
119 switch (m) {
121 return "best_fusion";
123 return "backtracking";
125 return "overload_and_remove";
126 }
127 panic("unhandled PackingStrategyType value");
128}
129
137inline std::ostream &operator<<(std::ostream &os, const PackingStrategyType m)
138{
139 return os << to_string(m);
140}
141
142} // namespace porytiles
143
144template <>
145struct std::formatter<porytiles::PackingStrategyType> {
146 constexpr auto parse(std::format_parse_context &ctx)
147 {
148 return ctx.begin();
149 }
150
151 auto format(const porytiles::PackingStrategyType &value, auto &ctx) const
152 {
153 return std::format_to(ctx.out(), "{}", porytiles::to_string(value));
154 }
155};
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
Definition panic.cpp:43
std::optional< PackingStrategyType > packing_strategy_type_from_str(const std::string &str)
Parses a string into a PackingStrategyType with fuzzy matching.
std::ostream & operator<<(std::ostream &os, const PrimaryPairingMode m)
Stream insertion operator for PrimaryPairingMode.
std::string to_string(const PrimaryPairingMode m)
Converts a PrimaryPairingMode to its canonical string representation.
PackingStrategyType
Selects the palette packing algorithm to use during tileset compilation.
@ backtracking
DFS/BFS backtracking search (default).
@ best_fusion
Greedy weighted-cost packing (fast, no retries).
@ overload_and_remove
Greedy with overload-and-remove multi-start retries.
constexpr auto parse(std::format_parse_context &ctx)
auto format(const porytiles::PackingStrategyType &value, auto &ctx) const