changeset 19375:c890215c5f1f draft

(svn r24276) -Codechange: Enhance GRFFile with constructor and destructor.
author frosch <frosch@openttd.org>
date Fri, 25 May 2012 20:54:54 +0000
parents 770689bd7730
children 091acbb3fc45
files src/newgrf.cpp src/newgrf.h
diffstat 2 files changed, 39 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -7898,12 +7898,7 @@
 {
 	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 @@
 		return;
 	}
 
-	newfile = CallocT<GRFFile>(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;
 }
 
 
--- 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 @@
 };
 
 /** Dynamic data of a loaded NewGRF */
-struct GRFFile {
+struct GRFFile : ZeroedMemoryAllocator {
 	char *filename;
 	bool is_ottdfile;
 	uint32 grfid;
@@ -138,6 +139,9 @@
 	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
 	{