53 "PrefilledPaletteId index out of range: " + std::to_string(
index) +
" > " +
58 [[nodiscard]] std::size_t
index()
const
101 using Id = std::variant<HintId, PrefilledPaletteId, RegularId, AnimId, PrimaryTileId>;
143 [[nodiscard]]
const Id &
id()
const
149 [[nodiscard]]
const std::string &
hint_name()
const;
159 return std::holds_alternative<HintId>(id_);
164 return std::holds_alternative<PrefilledPaletteId>(id_);
169 return std::holds_alternative<RegularId>(id_);
189 return id_ <=> other.id_;
198 return id_ == other.id_;
209 []<
typename IdVariant>(
const IdVariant &value) -> std::string {
210 using T = std::decay_t<IdVariant>;
211 if constexpr (std::is_same_v<T, PackableTile::HintId>) {
212 return "Hint(" + value.name +
")";
214 else if constexpr (std::is_same_v<T, PackableTile::PrefilledPaletteId>) {
215 return "Prefilled(" + std::to_string(value.index()) +
")";
217 else if constexpr (std::is_same_v<T, PackableTile::RegularId>) {
218 return "Regular(" + std::to_string(value.index) +
")";
220 else if constexpr (std::is_same_v<T, PackableTile::AnimId>) {
221 return "Anim(" + value.name +
", " + std::to_string(value.subtile_index) +
")";
223 else if constexpr (std::is_same_v<T, PackableTile::PrimaryTileId>) {
224 return "Primary(tile=" + std::to_string(value.tile_index) +
225 ", palette=" + std::to_string(value.palette_index) +
")";
228 static_assert(
sizeof(T) == 0,
"Unhandled PackableTile::Id variant alternative");
229 panic(
"Unhandled PackableTile::Id variant alternative");
242 return std::hash<std::string>{}(
id.name);
247struct std::hash<
porytiles::PackableTile::PrefilledPaletteId> {
250 return std::hash<std::size_t>{}(
id.index());
258 return std::hash<std::size_t>{}(
id.index);
268 std::size_t seed = std::hash<std::string>{}(
id.name);
269 seed ^= std::hash<std::size_t>{}(
id.subtile_index) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
275struct std::hash<
porytiles::PackableTile::PrimaryTileId> {
278 std::size_t seed = std::hash<std::size_t>{}(
id.tile_index);
279 seed ^= std::hash<std::size_t>{}(
id.palette_index) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
A set of colors represented as a bitset.
Identifies a tile created from a prefilled palette.
bool operator==(const PrefilledPaletteId &) const =default
std::size_t index() const
auto operator<=>(const PrefilledPaletteId &) const =default
static constexpr std::size_t max_index
PrefilledPaletteId(std::size_t index)
Wraps a ColorSet with a tile ID for tracking during palette packing.
auto operator<=>(const PackableTile &other) const
Three-way comparison operator.
std::size_t color_count() const
bool operator==(const PackableTile &other) const
Equality comparison operator.
bool is_prefilled_palette() const
std::size_t prefilled_index() const
std::size_t regular_index() const
const ColorSet & color_set() const
std::variant< HintId, PrefilledPaletteId, RegularId, AnimId, PrimaryTileId > Id
Variant type for tile identification.
const std::string & hint_name() const
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
std::string to_string(const PrimaryPairingMode m)
Converts a PrimaryPairingMode to its canonical string representation.
Identifies a tile created from an animation.
auto operator<=>(const AnimId &) const =default
std::size_t subtile_index
bool operator==(const AnimId &) const =default
Identifies a tile created from a palette hint.
bool operator==(const HintId &) const =default
auto operator<=>(const HintId &) const =default
Identifies a tile reconstructed from a compiled primary tileset.
auto operator<=>(const PrimaryTileId &) const =default
bool operator==(const PrimaryTileId &) const =default
std::size_t palette_index
Identifies a regular input tile.
bool operator==(const RegularId &) const =default
auto operator<=>(const RegularId &) const =default
std::size_t operator()(const porytiles::PackableTile::AnimId &id) const noexcept
std::size_t operator()(const porytiles::PackableTile::HintId &id) const noexcept
std::size_t operator()(const porytiles::PackableTile::PrefilledPaletteId &id) const noexcept
std::size_t operator()(const porytiles::PackableTile::PrimaryTileId &id) const noexcept
std::size_t operator()(const porytiles::PackableTile::RegularId &id) const noexcept