14 #include "table/strings.h" 
   20 #define DEFINE_NEWGRF_CLASS_METHOD(type) \ 
   21   template <typename Tspec, typename Tid, Tid Tmax> \ 
   22   type NewGRFClass<Tspec, Tid, Tmax> 
   25 template <
typename Tspec, 
typename T
id, T
id Tmax>
 
   32   this->name      = STR_EMPTY;
 
   43   for (Tid i = (Tid)0; i < Tmax; i++) {
 
   44     classes[i].ResetClass();
 
   59   for (Tid i = (Tid)0; i < Tmax; i++) {
 
   60     if (classes[i].global_id == global_id) {
 
   63     } 
else if (classes[i].global_id == 0) {
 
   65       classes[i].global_id = global_id;
 
   70   grfmsg(2, 
"ClassAllocate: already allocated %d classes, using default", Tmax);
 
   80   uint i = this->count++;
 
   81   this->spec = 
ReallocT(this->spec, this->count);
 
   85   if (this->IsUIAvailable(i)) this->ui_count++;
 
   95   assert(spec->cls_id < Tmax);
 
   96   Get(spec->cls_id)->Insert(spec);
 
  104 template <
typename Tspec, 
typename T
id, T
id Tmax>
 
  107   assert(cls_id < Tmax);
 
  108   return classes + cls_id;
 
  118   for (i = 0; i < Tmax && classes[i].global_id != 0; i++) {}
 
  129   for (uint i = 0; i < Tmax && classes[i].global_id != 0; i++) {
 
  130     if (classes[i].GetUISpecCount() > 0) cnt++;
 
  142   for (uint i = 0; i < Tmax && classes[i].global_id != 0; i++) {
 
  143     if (classes[i].GetUISpecCount() == 0) 
continue;
 
  144     if (index-- == 0) 
return (Tid)i;
 
  157   return index < this->GetSpecCount() ? this->spec[index] : NULL;
 
  167   if (ui_index < 0) 
return -1;
 
  168   for (uint i = 0; i < this->GetSpecCount(); i++) {
 
  169     if (!this->IsUIAvailable(i)) 
continue;
 
  170     if (ui_index-- == 0) 
return i;
 
  182   if ((uint)index >= this->GetSpecCount()) 
return -1;
 
  184   for (
int i = 0; i < index; i++) {
 
  185     if (this->IsUIAvailable(i)) ui_index++;
 
  201   for (Tid i = (Tid)0; i < Tmax; i++) {
 
  202     for (j = 0; j < classes[i].count; j++) {
 
  203       const Tspec *spec = classes[i].spec[j];
 
  204       if (spec == NULL) 
continue;
 
  205       if (spec->grf_prop.grffile->grfid == grfid && spec->grf_prop.local_id == local_id) {
 
  206         if (index != NULL) *index = j;
 
  215 #undef DEFINE_NEWGRF_CLASS_METHOD 
  218 #define INSTANTIATE_NEWGRF_CLASS_METHODS(name, Tspec, Tid, Tmax) \ 
  219   template void name::ResetClass(); \ 
  220   template void name::Reset(); \ 
  221   template Tid name::Allocate(uint32 global_id); \ 
  222   template void name::Insert(Tspec *spec); \ 
  223   template void name::Assign(Tspec *spec); \ 
  224   template NewGRFClass<Tspec, Tid, Tmax> *name::Get(Tid cls_id); \ 
  225   template uint name::GetClassCount(); \ 
  226   template uint name::GetUIClassCount(); \ 
  227   template Tid name::GetUIClass(uint index); \ 
  228   template const Tspec *name::GetSpec(uint index) const; \ 
  229   template int name::GetUIFromIndex(int index) const; \ 
  230   template int name::GetIndexFromUI(int ui_index) const; \ 
  231   template const Tspec *name::GetByGrf(uint32 grfid, byte localidx, int *index);