Changeset - r25524:02dac61ae3ed
[Not reviewed]
master
0 2 0
rubidium42 - 3 years ago 2021-05-26 19:48:28
rubidium@openttd.org
Change: mark copy-assignment as deleted for classes with a copy-constructor that is not trivial

This to prevent the default copy-assignment getting used when during the assignment also some other memory needs to be allocated as that would otherwise be freed.
2 files changed with 9 insertions and 0 deletions:
0 comments (0 inline, 0 general)
src/error.h
Show inline comments
 
@@ -35,24 +35,27 @@ protected:
 
	uint textref_stack_size;        ///< Number of uint32 values to put on the #TextRefStack for the error message.
 
	uint32 textref_stack[16];       ///< Values to put on the #TextRefStack for the error message.
 
	StringID summary_msg;           ///< General error message showed in first line. Must be valid.
 
	StringID detailed_msg;          ///< Detailed error message showed in second line. Can be #INVALID_STRING_ID.
 
	Point position;                 ///< Position of the error message window.
 
	CompanyID face;                 ///< Company belonging to the face being shown. #INVALID_COMPANY if no face present.
 

	
 
public:
 
	ErrorMessageData(const ErrorMessageData &data);
 
	~ErrorMessageData();
 
	ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration = 0, int x = 0, int y = 0, const GRFFile *textref_stack_grffile = nullptr, uint textref_stack_size = 0, const uint32 *textref_stack = nullptr);
 

	
 
	/* Remove the copy assignment, as the default implementation will not do the right thing. */
 
	ErrorMessageData &operator=(ErrorMessageData &rhs) = delete;
 

	
 
	/** Check whether error window shall display a company manager face */
 
	bool HasFace() const { return face != INVALID_COMPANY; }
 

	
 
	void SetDParam(uint n, uint64 v);
 
	void SetDParamStr(uint n, const char *str);
 

	
 
	void CopyOutDParams();
 
};
 

	
 
void ScheduleErrorMessage(const ErrorMessageData &data);
 

	
 
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x = 0, int y = 0, const GRFFile *textref_stack_grffile = nullptr, uint textref_stack_size = 0, const uint32 *textref_stack = nullptr);
src/newgrf_config.h
Show inline comments
 
@@ -104,24 +104,27 @@ struct GRFIdentifier {
 
	{
 
		if (this->grfid != grfid) return false;
 
		if (md5sum == nullptr) return true;
 
		return memcmp(md5sum, this->md5sum, sizeof(this->md5sum)) == 0;
 
	}
 
};
 

	
 
/** Information about why GRF had problems during initialisation */
 
struct GRFError {
 
	GRFError(StringID severity, StringID message = 0);
 
	GRFError(const GRFError &error);
 

	
 
	/* Remove the copy assignment, as the default implementation will not do the right thing. */
 
	GRFError &operator=(GRFError &rhs) = delete;
 

	
 
	std::string custom_message; ///< Custom message (if present)
 
	std::string data;           ///< Additional data for message and custom_message
 
	StringID message;           ///< Default message
 
	StringID severity;          ///< Info / Warning / Error / Fatal
 
	uint32 param_value[2];      ///< Values of GRF parameters to show for message and custom_message
 
};
 

	
 
/** The possible types of a newgrf parameter. */
 
enum GRFParameterType {
 
	PTYPE_UINT_ENUM, ///< The parameter allows a range of numbers, each of which can have a special name
 
	PTYPE_BOOL,      ///< The parameter is either 0 or 1
 
	PTYPE_END,       ///< Invalid parameter type
 
@@ -145,24 +148,27 @@ struct GRFParameterInfo {
 

	
 
	uint32 GetValue(struct GRFConfig *config) const;
 
	void SetValue(struct GRFConfig *config, uint32 value);
 
	void Finalize();
 
};
 

	
 
/** Information about GRF, used in the game and (part of it) in savegames */
 
struct GRFConfig : ZeroedMemoryAllocator {
 
	GRFConfig(const char *filename = nullptr);
 
	GRFConfig(const GRFConfig &config);
 
	~GRFConfig();
 

	
 
	/* Remove the copy assignment, as the default implementation will not do the right thing. */
 
	GRFConfig &operator=(GRFConfig &rhs) = delete;
 

	
 
	GRFIdentifier ident;                        ///< grfid and md5sum to uniquely identify newgrfs
 
	uint8 original_md5sum[16];                  ///< MD5 checksum of original file if only a 'compatible' file was loaded
 
	char *filename;                             ///< Filename - either with or without full path
 
	GRFTextWrapper name;                        ///< NOSAVE: GRF name (Action 0x08)
 
	GRFTextWrapper info;                        ///< NOSAVE: GRF info (author, copyright, ...) (Action 0x08)
 
	GRFTextWrapper url;                         ///< NOSAVE: URL belonging to this GRF.
 
	GRFError *error;                            ///< NOSAVE: Error/Warning during GRF loading (Action 0x0B)
 

	
 
	uint32 version;                             ///< NOSAVE: Version a NewGRF can set so only the newest NewGRF is shown
 
	uint32 min_loadable_version;                ///< NOSAVE: Minimum compatible version a NewGRF can define
 
	uint8 flags;                                ///< NOSAVE: GCF_Flags, bitset
 
	GRFStatus status;                           ///< NOSAVE: GRFStatus, enum
0 comments (0 inline, 0 general)