OpenTTD Source 20260311-master-g511d3794ce
newgrf_class_func.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#include "newgrf_class.h"
11
12#include "table/strings.h"
13
15template <typename Tspec, typename Tindex>
23
31template <typename Tspec, typename Tindex>
33{
34 auto found = std::ranges::find(NewGRFClass::classes, global_id, &NewGRFClass::global_id);
35
36 /* Id is already allocated, so reuse it. */
37 if (found != std::end(NewGRFClass::classes)) return found->Index();
38
39 /* More slots available, allocate a slot to the global id. */
40 if (NewGRFClass::classes.size() < Tindex::End().base()) {
41 auto it = NewGRFClass::classes.emplace(std::end(NewGRFClass::classes), global_id, STR_EMPTY);
42 it->index = static_cast<Tindex>(std::distance(std::begin(NewGRFClass::classes), it));
43 return it->Index();
44 }
45
46 GrfMsg(2, "ClassAllocate: already allocated {} classes, using default", Tindex::End().base());
47 return static_cast<Tindex>(0);
48}
49
54template <typename Tspec, typename Tindex>
56{
57 auto it = this->spec.insert(std::end(this->spec), spec);
58 uint16_t index = static_cast<uint16_t>(std::distance(std::begin(this->spec), it));
59 if (spec != nullptr) (*it)->index = index;
60
61 if (this->IsUIAvailable(index)) this->ui_count++;
62}
63
69template <typename Tspec, typename Tindex>
71{
72 assert(spec->class_index.base() < NewGRFClass::classes.size());
73 Get(spec->class_index)->Insert(spec);
74}
75
82template <typename Tspec, typename Tindex>
83NewGRFClass<Tspec, Tindex> *NewGRFClass<Tspec, Tindex>::Get(Tindex class_index)
84{
85 assert(class_index.base() < NewGRFClass::classes.size());
86 return &NewGRFClass::classes[class_index.base()];
87}
88
93template <typename Tspec, typename Tindex>
95{
96 return static_cast<uint>(NewGRFClass::classes.size());
97}
98
103template <typename Tspec, typename Tindex>
105{
106 return std::ranges::count_if(NewGRFClass::classes, [](const auto &cls) { return cls.GetUISpecCount() > 0; });
107}
108
114template <typename Tspec, typename Tindex>
116{
117 /* If the custom spec isn't defined any more, then the GRF file probably was not loaded. */
118 return index < this->GetSpecCount() ? this->spec[index] : nullptr;
119}
120
127template <typename Tspec, typename Tindex>
128const Tspec *NewGRFClass<Tspec, Tindex>::GetByGrf(uint32_t grfid, uint16_t local_id)
129{
130 for (const auto &cls : NewGRFClass::classes) {
131 for (const auto &spec : cls.spec) {
132 if (spec == nullptr) continue;
133 if (spec->grf_prop.local_id != local_id) continue;
134 if (spec->grf_prop.grfid == grfid) return spec;
135 }
136 }
137
138 return nullptr;
139}
static Tindex Allocate(uint32_t global_id)
Allocate a class with a given global class ID.
Tindex index
Index of class within the list of classes.
const Tspec * GetSpec(uint index) const
Get a spec from the class at a given index.
bool IsUIAvailable(uint index) const
Check whether the spec will be available to the user at some point in time.
static void Reset()
Reset the classes, i.e.
static void InsertDefaults()
Initialise the defaults.
uint GetSpecCount() const
Get the number of allocated specs within the class.
void Insert(Tspec *spec)
Insert a spec into the class, and update its index.
std::vector< Tspec * > spec
List of specifications.
static uint GetUIClassCount()
Get the number of classes available to the user.
static std::vector< NewGRFClass< Tspec, Tindex > > classes
The actual classes.
static void Assign(Tspec *spec)
Assign a spec to one of the classes.
static NewGRFClass * Get(Tindex class_index)
Get a particular class.
static uint GetClassCount()
Get the number of allocated classes.
uint ui_count
Number of specs in this class potentially available to the user.
static const Tspec * GetByGrf(uint32_t grfid, uint16_t local_id)
Retrieve a spec by GRF location.
uint32_t global_id
Global ID for class, e.g. 'DFLT', 'WAYP', etc.
Header file for classes to be used by for example, NewGRF stations and airports.