Codechange: Use template specialisation and instantiation for BaseMedia methods.

Specialisations seem to be the correct way to specialise, rather than redefining the base template.

This removes a macro which instantiated methods individually.
This commit is contained in:
Peter Nelson
2025-03-26 18:11:55 +00:00
committed by Peter Nelson
parent 3375dc3095
commit 529fb88325
7 changed files with 78 additions and 96 deletions

View File

@@ -66,10 +66,8 @@ std::optional<std::vector<uint8_t>> GetMusicCatEntryData(const std::string &file
return data;
}
INSTANTIATE_BASE_MEDIA_METHODS(BaseMedia<MusicSet>, MusicSet)
/** Names corresponding to the music set's files */
static const char * const _music_file_names[] = {
static const std::string_view _music_file_names[] = {
"theme",
"old_0", "old_1", "old_2", "old_3", "old_4", "old_5", "old_6", "old_7", "old_8", "old_9",
"new_0", "new_1", "new_2", "new_3", "new_4", "new_5", "new_6", "new_7", "new_8", "new_9",
@@ -78,22 +76,25 @@ static const char * const _music_file_names[] = {
/** Make sure we aren't messing things up. */
static_assert(lengthof(_music_file_names) == NUM_SONGS_AVAILABLE);
template <class T>
/* static */ const char * const *BaseSet<T>::file_names = _music_file_names;
template <>
/* static */ std::span<const std::string_view> BaseSet<MusicSet>::GetFilenames()
{
return _music_file_names;
}
template <class Tbase_set>
/* static */ const char *BaseMedia<Tbase_set>::GetExtension()
template <>
/* static */ const char *BaseMedia<MusicSet>::GetExtension()
{
return ".obm"; // OpenTTD Base Music
}
template <class Tbase_set>
/* static */ bool BaseMedia<Tbase_set>::DetermineBestSet()
template <>
/* static */ bool BaseMedia<MusicSet>::DetermineBestSet()
{
if (BaseMedia<Tbase_set>::used_set != nullptr) return true;
if (BaseMedia<MusicSet>::used_set != nullptr) return true;
const Tbase_set *best = nullptr;
for (const Tbase_set *c = BaseMedia<Tbase_set>::available_sets; c != nullptr; c = c->next) {
const MusicSet *best = nullptr;
for (const MusicSet *c = BaseMedia<MusicSet>::available_sets; c != nullptr; c = c->next) {
if (c->GetNumMissing() != 0) continue;
if (best == nullptr ||
@@ -105,10 +106,12 @@ template <class Tbase_set>
}
}
BaseMedia<Tbase_set>::used_set = best;
return BaseMedia<Tbase_set>::used_set != nullptr;
BaseMedia<MusicSet>::used_set = best;
return BaseMedia<MusicSet>::used_set != nullptr;
}
template class BaseMedia<MusicSet>;
bool MusicSet::FillSetDetails(const IniFile &ini, const std::string &path, const std::string &full_filename)
{
bool ret = this->BaseSet<MusicSet>::FillSetDetails(ini, path, full_filename);