12 #include "table/strings.h"
18 #define DEFINE_NEWGRF_CLASS_METHOD(type) \
19 template <typename Tspec, typename Tid, Tid Tmax> \
20 type NewGRFClass<Tspec, Tid, Tmax>
23 template <
typename Tspec,
typename T
id, T
id Tmax>
30 this->name = STR_EMPTY;
41 for (Tid i = (Tid)0; i < Tmax; i++) {
42 classes[i].ResetClass();
57 for (Tid i = (Tid)0; i < Tmax; i++) {
58 if (classes[i].global_id == global_id) {
61 }
else if (classes[i].global_id == 0) {
63 classes[i].global_id = global_id;
68 grfmsg(2,
"ClassAllocate: already allocated %d classes, using default", Tmax);
78 uint i = this->count++;
79 this->spec =
ReallocT(this->spec, this->count);
83 if (this->IsUIAvailable(i)) this->ui_count++;
93 assert(spec->cls_id < Tmax);
94 Get(spec->cls_id)->Insert(spec);
102 template <
typename Tspec,
typename T
id, T
id Tmax>
105 assert(cls_id < Tmax);
106 return classes + cls_id;
116 for (i = 0; i < Tmax && classes[i].global_id != 0; i++) {}
127 for (uint i = 0; i < Tmax && classes[i].global_id != 0; i++) {
128 if (classes[i].GetUISpecCount() > 0) cnt++;
140 for (uint i = 0; i < Tmax && classes[i].global_id != 0; i++) {
141 if (classes[i].GetUISpecCount() == 0)
continue;
142 if (index-- == 0)
return (Tid)i;
155 return index < this->GetSpecCount() ? this->spec[index] :
nullptr;
165 if (ui_index < 0)
return -1;
166 for (uint i = 0; i < this->GetSpecCount(); i++) {
167 if (!this->IsUIAvailable(i))
continue;
168 if (ui_index-- == 0)
return i;
180 if ((uint)index >= this->GetSpecCount())
return -1;
182 for (
int i = 0; i < index; i++) {
183 if (this->IsUIAvailable(i)) ui_index++;
199 for (Tid i = (Tid)0; i < Tmax; i++) {
200 for (j = 0; j < classes[i].count; j++) {
201 const Tspec *spec = classes[i].spec[j];
202 if (spec ==
nullptr)
continue;
203 if (spec->grf_prop.grffile->grfid == grfid && spec->grf_prop.local_id == local_id) {
204 if (index !=
nullptr) *index = j;
213 #undef DEFINE_NEWGRF_CLASS_METHOD
216 #define INSTANTIATE_NEWGRF_CLASS_METHODS(name, Tspec, Tid, Tmax) \
217 template void name::ResetClass(); \
218 template void name::Reset(); \
219 template Tid name::Allocate(uint32 global_id); \
220 template void name::Insert(Tspec *spec); \
221 template void name::Assign(Tspec *spec); \
222 template NewGRFClass<Tspec, Tid, Tmax> *name::Get(Tid cls_id); \
223 template uint name::GetClassCount(); \
224 template uint name::GetUIClassCount(); \
225 template Tid name::GetUIClass(uint index); \
226 template const Tspec *name::GetSpec(uint index) const; \
227 template int name::GetUIFromIndex(int index) const; \
228 template int name::GetIndexFromUI(int ui_index) const; \
229 template const Tspec *name::GetByGrf(uint32 grfid, byte localidx, int *index);