(svn r5907) Remove more indirection by using pointers instead of IDs. Also fix some bogus warnings on MSVC by using (void*) casts

This commit is contained in:
tron 2006-08-15 07:07:17 +00:00
parent d84a1dcf50
commit 4ad8d1c7a2
7 changed files with 51 additions and 53 deletions

View File

@ -96,7 +96,7 @@ static inline uint16 GetIndustryPoolSize(void)
VARDEF int _total_industries; // For the AI: the amount of industries active VARDEF int _total_industries; // For the AI: the amount of industries active
VARDEF uint16 *_industry_sort; VARDEF const Industry** _industry_sort;
VARDEF bool _industry_sort_dirty; VARDEF bool _industry_sort_dirty;

View File

@ -470,16 +470,15 @@ static const Widget _industry_directory_widgets[] = {
static uint _num_industry_sort; static uint _num_industry_sort;
static char _bufcache[96]; static char _bufcache[96];
static uint16 _last_industry_idx; static const Industry* _last_industry;
static byte _industry_sort_order; static byte _industry_sort_order;
static int CDECL GeneralIndustrySorter(const void *a, const void *b) static int CDECL GeneralIndustrySorter(const void *a, const void *b)
{ {
const Industry* i = *(const Industry**)a;
const Industry* j = *(const Industry**)b;
char buf1[96]; char buf1[96];
uint16 val;
Industry *i = GetIndustry(*(const uint16*)a);
Industry *j = GetIndustry(*(const uint16*)b);
int r = 0; int r = 0;
switch (_industry_sort_order >> 1) { switch (_industry_sort_order >> 1) {
@ -523,8 +522,8 @@ static int CDECL GeneralIndustrySorter(const void *a, const void *b)
SetDParam(0, i->town->index); SetDParam(0, i->town->index);
GetString(buf1, STR_TOWN); GetString(buf1, STR_TOWN);
if ( (val=*(const uint16*)b) != _last_industry_idx) { if (j != _last_industry) {
_last_industry_idx = val; _last_industry = j;
SetDParam(0, j->town->index); SetDParam(0, j->town->index);
GetString(_bufcache, STR_TOWN); GetString(_bufcache, STR_TOWN);
} }
@ -537,21 +536,21 @@ static int CDECL GeneralIndustrySorter(const void *a, const void *b)
static void MakeSortedIndustryList(void) static void MakeSortedIndustryList(void)
{ {
Industry *i; const Industry* i;
int n = 0; int n = 0;
/* Create array for sorting */ /* Create array for sorting */
_industry_sort = realloc(_industry_sort, GetIndustryPoolSize() * sizeof(_industry_sort[0])); _industry_sort = realloc((void*)_industry_sort, GetIndustryPoolSize() * sizeof(_industry_sort[0]));
if (_industry_sort == NULL) if (_industry_sort == NULL)
error("Could not allocate memory for the industry-sorting-list"); error("Could not allocate memory for the industry-sorting-list");
FOR_ALL_INDUSTRIES(i) { FOR_ALL_INDUSTRIES(i) {
if (i->xy != 0) _industry_sort[n++] = i->index; if (i->xy != 0) _industry_sort[n++] = i;
} }
_num_industry_sort = n; _num_industry_sort = n;
_last_industry_idx = 0xFFFF; // used for "cache" _last_industry = NULL; // used for "cache"
qsort(_industry_sort, n, sizeof(_industry_sort[0]), GeneralIndustrySorter); qsort((void*)_industry_sort, n, sizeof(_industry_sort[0]), GeneralIndustrySorter);
DEBUG(misc, 1) ("Resorting Industries list..."); DEBUG(misc, 1) ("Resorting Industries list...");
} }
@ -579,7 +578,7 @@ static void IndustryDirectoryWndProc(Window *w, WindowEvent *e)
n = 0; n = 0;
while (p < _num_industry_sort) { while (p < _num_industry_sort) {
const Industry *i = GetIndustry(_industry_sort[p]); const Industry* i = _industry_sort[p];
SetDParam(0, i->index); SetDParam(0, i->index);
if (i->produced_cargo[0] != CT_INVALID) { if (i->produced_cargo[0] != CT_INVALID) {
@ -637,7 +636,7 @@ static void IndustryDirectoryWndProc(Window *w, WindowEvent *e)
if (!IS_INT_INSIDE(y, 0, w->vscroll.cap)) return; if (!IS_INT_INSIDE(y, 0, w->vscroll.cap)) return;
p = y + w->vscroll.pos; p = y + w->vscroll.pos;
if (p < _num_industry_sort) { if (p < _num_industry_sort) {
ScrollMainWindowToTile(GetIndustry(_industry_sort[p])->xy); ScrollMainWindowToTile(_industry_sort[p]->xy);
} }
} break; } break;
} }

View File

@ -260,8 +260,8 @@ static void UnInitializeDynamicVariables(void)
CleanPool(&_sign_pool); CleanPool(&_sign_pool);
CleanPool(&_order_pool); CleanPool(&_order_pool);
free(_town_sort); free((void*)_town_sort);
free(_industry_sort); free((void*)_industry_sort);
} }
static void UnInitializeGame(void) static void UnInitializeGame(void)

View File

@ -69,7 +69,7 @@ const StringID _station_sort_listing[] = {
}; };
static char _bufcache[64]; static char _bufcache[64];
static uint16 _last_station_idx; static const Station* _last_station;
static int _internal_sort_order; static int _internal_sort_order;
static int CDECL StationNameSorter(const void *a, const void *b) static int CDECL StationNameSorter(const void *a, const void *b)
@ -83,8 +83,8 @@ static int CDECL StationNameSorter(const void *a, const void *b)
argv[0] = st1->index; argv[0] = st1->index;
GetStringWithArgs(buf1, STR_STATION, argv); GetStringWithArgs(buf1, STR_STATION, argv);
if (st2->index != _last_station_idx) { if (st2 != _last_station) {
_last_station_idx = st2->index; _last_station = st2;
argv[0] = st2->index; argv[0] = st2->index;
GetStringWithArgs(_bufcache, STR_STATION, argv); GetStringWithArgs(_bufcache, STR_STATION, argv);
} }
@ -207,7 +207,7 @@ static void BuildStationsList(plstations_d* sl, PlayerID owner, byte facilities,
} }
} }
free(sl->sort_list); free((void*)sl->sort_list);
sl->sort_list = malloc(n * sizeof(sl->sort_list[0])); sl->sort_list = malloc(n * sizeof(sl->sort_list[0]));
if (n != 0 && sl->sort_list == NULL) error("Could not allocate memory for the station-sorting-list"); if (n != 0 && sl->sort_list == NULL) error("Could not allocate memory for the station-sorting-list");
sl->list_length = n; sl->list_length = n;
@ -216,7 +216,7 @@ static void BuildStationsList(plstations_d* sl, PlayerID owner, byte facilities,
sl->flags &= ~SL_REBUILD; sl->flags &= ~SL_REBUILD;
sl->flags |= SL_RESORT; sl->flags |= SL_RESORT;
free(station_sort); free((void*)station_sort);
} }
static void SortStationsList(plstations_d *sl) static void SortStationsList(plstations_d *sl)
@ -231,7 +231,7 @@ static void SortStationsList(plstations_d *sl)
if (!(sl->flags & SL_RESORT)) return; if (!(sl->flags & SL_RESORT)) return;
_internal_sort_order = sl->flags & SL_ORDER; _internal_sort_order = sl->flags & SL_ORDER;
_last_station_idx = 0; // used for "cache" in namesorting _last_station = NULL; // used for "cache" in namesorting
qsort(sl->sort_list, sl->list_length, sizeof(sl->sort_list[0]), _station_sorter[sl->sort_type]); qsort(sl->sort_list, sl->list_length, sizeof(sl->sort_list[0]), _station_sorter[sl->sort_type]);
sl->resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS; sl->resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;

2
town.h
View File

@ -151,7 +151,7 @@ enum {
bool CheckforTownRating(uint32 flags, Town *t, byte type); bool CheckforTownRating(uint32 flags, Town *t, byte type);
VARDEF TownID *_town_sort; VARDEF const Town** _town_sort;
extern MemoryPool _town_pool; extern MemoryPool _town_pool;

View File

@ -368,25 +368,25 @@ static const Widget _town_directory_widgets[] = {
static uint _num_town_sort; static uint _num_town_sort;
static char _bufcache[64]; static char _bufcache[64];
static uint16 _last_town_idx; static const Town* _last_town;
static int CDECL TownNameSorter(const void *a, const void *b) static int CDECL TownNameSorter(const void *a, const void *b)
{ {
const Town* ta = *(const Town**)a;
const Town* tb = *(const Town**)b;
char buf1[64]; char buf1[64];
uint16 val;
int r; int r;
int32 argv[1]; int32 argv[1];
argv[0] = *(const uint16*)a; argv[0] = ta->index;
GetStringWithArgs(buf1, STR_TOWN, argv); GetStringWithArgs(buf1, STR_TOWN, argv);
/* If 'b' is the same town as in the last round, use the cached value /* If 'b' is the same town as in the last round, use the cached value
* We do this to speed stuff up ('b' is called with the same value a lot of * We do this to speed stuff up ('b' is called with the same value a lot of
* times after eachother) */ * times after eachother) */
val = *(const uint16*)b; if (tb != _last_town) {
if (val != _last_town_idx) { _last_town = tb;
_last_town_idx = val; argv[0] = tb->index;
argv[0] = val;
GetStringWithArgs(_bufcache, STR_TOWN, argv); GetStringWithArgs(_bufcache, STR_TOWN, argv);
} }
@ -397,8 +397,8 @@ static int CDECL TownNameSorter(const void *a, const void *b)
static int CDECL TownPopSorter(const void *a, const void *b) static int CDECL TownPopSorter(const void *a, const void *b)
{ {
const Town *ta = GetTown(*(const uint16*)a); const Town* ta = *(const Town**)a;
const Town *tb = GetTown(*(const uint16*)b); const Town* tb = *(const Town**)b;
int r = ta->population - tb->population; int r = ta->population - tb->population;
if (_town_sort_order & 1) r = -r; if (_town_sort_order & 1) r = -r;
return r; return r;
@ -410,18 +410,18 @@ static void MakeSortedTownList(void)
uint n = 0; uint n = 0;
/* Create array for sorting */ /* Create array for sorting */
_town_sort = realloc(_town_sort, GetTownPoolSize() * sizeof(_town_sort[0])); _town_sort = realloc((void*)_town_sort, GetTownPoolSize() * sizeof(_town_sort[0]));
if (_town_sort == NULL) if (_town_sort == NULL)
error("Could not allocate memory for the town-sorting-list"); error("Could not allocate memory for the town-sorting-list");
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
if (t->xy != 0) _town_sort[n++] = t->index; if (t->xy != 0) _town_sort[n++] = t;
} }
_num_town_sort = n; _num_town_sort = n;
_last_town_idx = 0; // used for "cache" _last_town = NULL; // used for "cache"
qsort(_town_sort, n, sizeof(_town_sort[0]), _town_sort_order & 2 ? TownPopSorter : TownNameSorter); qsort((void*)_town_sort, n, sizeof(_town_sort[0]), _town_sort_order & 2 ? TownPopSorter : TownNameSorter);
DEBUG(misc, 1) ("Resorting Towns list..."); DEBUG(misc, 1) ("Resorting Towns list...");
} }
@ -442,13 +442,12 @@ static void TownDirectoryWndProc(Window *w, WindowEvent *e)
DoDrawString(_town_sort_order & 1 ? DOWNARROW : UPARROW, (_town_sort_order <= 1) ? 88 : 187, 15, 0x10); DoDrawString(_town_sort_order & 1 ? DOWNARROW : UPARROW, (_town_sort_order <= 1) ? 88 : 187, 15, 0x10);
{ {
const Town *t;
int n = 0; int n = 0;
uint16 i = w->vscroll.pos; uint16 i = w->vscroll.pos;
int y = 28; int y = 28;
while (i < _num_town_sort) { while (i < _num_town_sort) {
t = GetTown(_town_sort[i]); const Town* t = _town_sort[i];
assert(t->xy); assert(t->xy);
@ -480,6 +479,8 @@ static void TownDirectoryWndProc(Window *w, WindowEvent *e)
} break; } break;
case 5: { /* Click on Town Matrix */ case 5: { /* Click on Town Matrix */
const Town* t;
uint16 id_v = (e->click.pt.y - 28) / 10; uint16 id_v = (e->click.pt.y - 28) / 10;
if (id_v >= w->vscroll.cap) return; // click out of bounds if (id_v >= w->vscroll.cap) return; // click out of bounds
@ -488,13 +489,11 @@ static void TownDirectoryWndProc(Window *w, WindowEvent *e)
if (id_v >= _num_town_sort) return; // click out of town bounds if (id_v >= _num_town_sort) return; // click out of town bounds
{ t = _town_sort[id_v];
const Town *t = GetTown(_town_sort[id_v]); assert(t->xy);
assert(t->xy); ScrollMainWindowToTile(t->xy);
break;
ScrollMainWindowToTile(t->xy); }
}
} break;
} }
break; break;

View File

@ -27,7 +27,7 @@
Sorting _sorting; Sorting _sorting;
static uint32 _internal_name_sorter_id; // internal StringID for default vehicle-names static uint32 _internal_name_sorter_id; // internal StringID for default vehicle-names
static uint32 _last_vehicle_idx; // cached index to hopefully speed up name-sorting static const Vehicle* _last_vehicle; // cached vehicle to hopefully speed up name-sorting
static bool _internal_sort_order; // descending/ascending static bool _internal_sort_order; // descending/ascending
static uint16 _player_num_engines[TOTAL_NUM_ENGINES]; static uint16 _player_num_engines[TOTAL_NUM_ENGINES];
@ -161,7 +161,7 @@ void BuildVehicleList(vehiclelist_d* vl, int type, PlayerID owner, StationID sta
} }
} }
free(vl->sort_list); free((void*)vl->sort_list);
vl->sort_list = malloc(n * sizeof(vl->sort_list[0])); vl->sort_list = malloc(n * sizeof(vl->sort_list[0]));
if (n != 0 && vl->sort_list == NULL) { if (n != 0 && vl->sort_list == NULL) {
error("Could not allocate memory for the vehicle-sorting-list"); error("Could not allocate memory for the vehicle-sorting-list");
@ -169,7 +169,7 @@ void BuildVehicleList(vehiclelist_d* vl, int type, PlayerID owner, StationID sta
vl->list_length = n; vl->list_length = n;
for (i = 0; i < n; ++i) vl->sort_list[i] = sort_list[i]; for (i = 0; i < n; ++i) vl->sort_list[i] = sort_list[i];
free(sort_list); free((void*)sort_list);
vl->flags &= ~VL_REBUILD; vl->flags &= ~VL_REBUILD;
vl->flags |= VL_RESORT; vl->flags |= VL_RESORT;
@ -181,7 +181,7 @@ void SortVehicleList(vehiclelist_d *vl)
_internal_sort_order = vl->flags & VL_DESC; _internal_sort_order = vl->flags & VL_DESC;
_internal_name_sorter_id = STR_SV_TRAIN_NAME; _internal_name_sorter_id = STR_SV_TRAIN_NAME;
_last_vehicle_idx = 0; // used for "cache" in namesorting _last_vehicle = NULL; // used for "cache" in namesorting
qsort(vl->sort_list, vl->list_length, sizeof(vl->sort_list[0]), qsort(vl->sort_list, vl->list_length, sizeof(vl->sort_list[0]),
_vehicle_sorter[vl->sort_type]); _vehicle_sorter[vl->sort_type]);
@ -289,7 +289,7 @@ static int CDECL VehicleNumberSorter(const void *a, const void *b)
return (_internal_sort_order & 1) ? -r : r; return (_internal_sort_order & 1) ? -r : r;
} }
static char _bufcache[64]; // used together with _last_vehicle_idx to hopefully speed up stringsorting static char _bufcache[64]; // used together with _last_vehicle to hopefully speed up stringsorting
static int CDECL VehicleNameSorter(const void *a, const void *b) static int CDECL VehicleNameSorter(const void *a, const void *b)
{ {
const Vehicle* va = *(const Vehicle**)a; const Vehicle* va = *(const Vehicle**)a;
@ -302,8 +302,8 @@ static int CDECL VehicleNameSorter(const void *a, const void *b)
GetString(buf1, STR_JUST_STRING); GetString(buf1, STR_JUST_STRING);
} }
if (vb->index != _last_vehicle_idx) { if (vb != _last_vehicle) {
_last_vehicle_idx = vb->index; _last_vehicle = vb;
_bufcache[0] = '\0'; _bufcache[0] = '\0';
if (vb->string_id != _internal_name_sorter_id) { if (vb->string_id != _internal_name_sorter_id) {
SetDParam(0, vb->string_id); SetDParam(0, vb->string_id);