# HG changeset patch # User frosch # Date 2012-05-25 20:54:54 # Node ID 172ad5e17c1b182a460f161b66172f2c55cda2e7 # Parent 2ad849e759c9f723c037a53222dab54609c48359 (svn r24276) -Codechange: Enhance GRFFile with constructor and destructor. diff --git a/src/newgrf.cpp b/src/newgrf.cpp --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -7898,12 +7898,7 @@ static void ResetNewGRF() { const GRFFile * const *end = _grf_files.End(); for (GRFFile **file = _grf_files.Begin(); file != end; file++) { - GRFFile *f = *file; - free(f->filename); - free(f->cargo_list); - free(f->railtype_list); - delete [] f->language_map; - free(f); + delete *file; } _grf_files.Clear(); @@ -8069,39 +8064,52 @@ static void InitNewGRFFile(const GRFConf return; } - newfile = CallocT(1); - - newfile->filename = strdup(config->filename); - newfile->grfid = config->ident.grfid; + newfile = new GRFFile(config); + *_grf_files.Append() = _cur.grffile = newfile; +} + +/** + * Constructor for GRFFile + * @param config GRFConfig to copy name, grfid and parameters from. + */ +GRFFile::GRFFile(const GRFConfig *config) +{ + this->filename = strdup(config->filename); + this->grfid = config->ident.grfid; /* Initialise local settings to defaults */ - newfile->traininfo_vehicle_pitch = 0; - newfile->traininfo_vehicle_width = TRAININFO_DEFAULT_VEHICLE_WIDTH; + this->traininfo_vehicle_pitch = 0; + this->traininfo_vehicle_width = TRAININFO_DEFAULT_VEHICLE_WIDTH; /* Mark price_base_multipliers as 'not set' */ for (Price i = PR_BEGIN; i < PR_END; i++) { - newfile->price_base_multipliers[i] = INVALID_PRICE_MODIFIER; + this->price_base_multipliers[i] = INVALID_PRICE_MODIFIER; } /* Initialise rail type map with default rail types */ - memset(newfile->railtype_map, INVALID_RAILTYPE, sizeof newfile->railtype_map); - newfile->railtype_map[0] = RAILTYPE_RAIL; - newfile->railtype_map[1] = RAILTYPE_ELECTRIC; - newfile->railtype_map[2] = RAILTYPE_MONO; - newfile->railtype_map[3] = RAILTYPE_MAGLEV; + memset(this->railtype_map, INVALID_RAILTYPE, sizeof(this->railtype_map)); + this->railtype_map[0] = RAILTYPE_RAIL; + this->railtype_map[1] = RAILTYPE_ELECTRIC; + this->railtype_map[2] = RAILTYPE_MONO; + this->railtype_map[3] = RAILTYPE_MAGLEV; /* Copy the initial parameter list * 'Uninitialised' parameters are zeroed as that is their default value when dynamically creating them. */ - assert_compile(lengthof(newfile->param) == lengthof(config->param) && lengthof(config->param) == 0x80); - memset(newfile->param, 0, sizeof(newfile->param)); + assert_compile(lengthof(this->param) == lengthof(config->param) && lengthof(this->param) == 0x80); assert(config->num_params <= lengthof(config->param)); - newfile->param_end = config->num_params; - if (newfile->param_end > 0) { - MemCpyT(newfile->param, config->param, newfile->param_end); - } - - *_grf_files.Append() = _cur.grffile = newfile; + this->param_end = config->num_params; + if (this->param_end > 0) { + MemCpyT(this->param, config->param, this->param_end); + } +} + +GRFFile::~GRFFile() +{ + free(this->filename); + free(this->cargo_list); + free(this->railtype_list); + delete[] this->language_map; } diff --git a/src/newgrf.h b/src/newgrf.h --- a/src/newgrf.h +++ b/src/newgrf.h @@ -16,6 +16,7 @@ #include "rail_type.h" #include "fileio_type.h" #include "core/bitmath_func.hpp" +#include "core/alloc_type.hpp" /** * List of different canal 'features'. @@ -98,7 +99,7 @@ struct GRFLabel { }; /** Dynamic data of a loaded NewGRF */ -struct GRFFile { +struct GRFFile : ZeroedMemoryAllocator { char *filename; bool is_ottdfile; uint32 grfid; @@ -138,6 +139,9 @@ struct GRFFile { uint32 grf_features; ///< Bitset of GrfSpecFeature the grf uses PriceMultipliers price_base_multipliers; ///< Price base multipliers as set by the grf. + GRFFile(const struct GRFConfig *config); + ~GRFFile(); + /** Get GRF Parameter with range checking */ uint32 GetParam(uint number) const {