changeset 11933:6734ebc1fa61 draft

(svn r16336) -Codechange: make the SpriteGroup pool more like the 'normal' pools
author rubidium <rubidium@openttd.org>
date Sun, 17 May 2009 14:32:13 +0000
parents 5878eda02d59
children f65c82141aa9
files src/newgrf.cpp src/newgrf_spritegroup.cpp src/newgrf_spritegroup.h
diffstat 3 files changed, 35 insertions(+), 63 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -2595,9 +2595,7 @@
  */
 static const SpriteGroup *NewCallBackResultSpriteGroup(uint16 value)
 {
-	SpriteGroup *group = AllocateSpriteGroup();
-
-	group->type = SGT_CALLBACK;
+	SpriteGroup *group = new SpriteGroup(SGT_CALLBACK);
 
 	/* Old style callback results have the highest byte 0xFF so signify it is a callback result
 	 * New style ones only have the highest bit set (allows 15-bit results, instead of just 8) */
@@ -2620,8 +2618,7 @@
  */
 static const SpriteGroup *NewResultSpriteGroup(SpriteID sprite, byte num_sprites)
 {
-	SpriteGroup *group = AllocateSpriteGroup();
-	group->type = SGT_RESULT;
+	SpriteGroup *group = new SpriteGroup(SGT_RESULT);
 	group->g.result.sprite = sprite;
 	group->g.result.num_sprites = num_sprites;
 	return group;
@@ -2768,8 +2765,7 @@
 			/* Check we can load the var size parameter */
 			if (!check_length(bufend - buf, 1, "NewSpriteGroup (Deterministic) (1)")) return;
 
-			group = AllocateSpriteGroup();
-			group->type = SGT_DETERMINISTIC;
+			group = new SpriteGroup(SGT_DETERMINISTIC);
 			group->g.determ.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
 
 			switch (GB(type, 2, 2)) {
@@ -2843,8 +2839,7 @@
 		{
 			if (!check_length(bufend - buf, HasBit(type, 2) ? 8 : 7, "NewSpriteGroup (Randomized) (1)")) return;
 
-			group = AllocateSpriteGroup();
-			group->type = SGT_RANDOMIZED;
+			group = new SpriteGroup(SGT_RANDOMIZED);
 			group->g.random.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
 
 			if (HasBit(type, 2)) {
@@ -2893,8 +2888,7 @@
 
 					if (!check_length(bufend - buf, 2 * num_loaded + 2 * num_loading, "NewSpriteGroup (Real) (1)")) return;
 
-					group = AllocateSpriteGroup();
-					group->type = SGT_REAL;
+					group = new SpriteGroup(SGT_REAL);
 
 					group->g.real.num_loaded  = num_loaded;
 					group->g.real.num_loading = num_loading;
@@ -2925,8 +2919,7 @@
 					byte num_sprites = max((uint8)1, type);
 					uint i;
 
-					group = AllocateSpriteGroup();
-					group->type = SGT_TILELAYOUT;
+					group = new SpriteGroup(SGT_TILELAYOUT);
 					group->g.layout.num_sprites = sprites;
 					group->g.layout.dts = CallocT<DrawTileSprites>(1);
 
@@ -2987,8 +2980,7 @@
 						break;
 					}
 
-					group = AllocateSpriteGroup();
-					group->type = SGT_INDUSTRY_PRODUCTION;
+					group = new SpriteGroup(SGT_INDUSTRY_PRODUCTION);
 					group->g.indprod.version = type;
 					if (type == 0) {
 						for (uint i = 0; i < 3; i++) {
@@ -5631,7 +5623,8 @@
 	_grf_id_overrides.clear();
 
 	InitializeSoundPool();
-	InitializeSpriteGroupPool();
+	_SpriteGroup_pool.CleanPool();
+	_SpriteGroup_pool.AddBlockToPool();
 }
 
 static void BuildCargoTranslationMap()
--- a/src/newgrf_spritegroup.cpp
+++ b/src/newgrf_spritegroup.cpp
@@ -7,68 +7,38 @@
 #include "newgrf.h"
 #include "newgrf_spritegroup.h"
 #include "sprite.h"
-
-static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item);
+#include "oldpool_func.h"
 
-static uint _spritegroup_count = 0;
-STATIC_OLD_POOL(SpriteGroup, SpriteGroup, 9, 250, NULL, SpriteGroupPoolCleanBlock)
+DEFINE_OLD_POOL_GENERIC(SpriteGroup, SpriteGroup)
 
-static void DestroySpriteGroup(SpriteGroup *group)
+SpriteGroup::~SpriteGroup()
 {
 	/* Free dynamically allocated memory */
-	/* XXX Cast away the consts due to MSVC being buggy... */
-	switch (group->type) {
+	switch (this->type) {
 		case SGT_REAL:
-			free((SpriteGroup**)group->g.real.loaded);
-			free((SpriteGroup**)group->g.real.loading);
+			free((SpriteGroup**)this->g.real.loaded);
+			free((SpriteGroup**)this->g.real.loading);
 			break;
 
 		case SGT_DETERMINISTIC:
-			free(group->g.determ.adjusts);
-			free(group->g.determ.ranges);
+			free(this->g.determ.adjusts);
+			free(this->g.determ.ranges);
 			break;
 
 		case SGT_RANDOMIZED:
-			free((SpriteGroup**)group->g.random.groups);
+			free((SpriteGroup**)this->g.random.groups);
 			break;
 
 		case SGT_TILELAYOUT:
-			free((void*)group->g.layout.dts->seq);
-			free(group->g.layout.dts);
+			free((void*)this->g.layout.dts->seq);
+			free(this->g.layout.dts);
 			break;
 
 		default:
 			break;
 	}
-}
 
-static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item)
-{
-	uint i;
-
-	for (i = start_item; i <= end_item; i++) {
-		DestroySpriteGroup(GetSpriteGroup(i));
-	}
-}
-
-
-/* Allocate a new SpriteGroup */
-SpriteGroup *AllocateSpriteGroup()
-{
-	/* This is totally different to the other pool allocators, as we never remove an item from the pool. */
-	if (_spritegroup_count == GetSpriteGroupPoolSize()) {
-		if (!_SpriteGroup_pool.AddBlockToPool()) return NULL;
-	}
-
-	return GetSpriteGroup(_spritegroup_count++);
-}
-
-
-void InitializeSpriteGroupPool()
-{
-	_SpriteGroup_pool.CleanPool();
-
-	_spritegroup_count = 0;
+	this->type = SGT_INVALID;
 }
 
 TemporaryStorageArray<uint32, 0x110> _temp_store;
--- a/src/newgrf_spritegroup.h
+++ b/src/newgrf_spritegroup.h
@@ -11,6 +11,7 @@
 #include "gfx_type.h"
 #include "engine_type.h"
 #include "tile_type.h"
+#include "oldpool.h"
 
 #include "newgrf_cargo.h"
 #include "newgrf_callbacks.h"
@@ -182,8 +183,18 @@
 	SGT_INDUSTRY_PRODUCTION,
 };
 
+typedef uint32 SpriteGroupID;
+DECLARE_OLD_POOL(SpriteGroup, SpriteGroup, 9, 250)
+
 /* Common wrapper for all the different sprite group types */
-struct SpriteGroup {
+struct SpriteGroup : PoolItem<SpriteGroup, SpriteGroupID, &_SpriteGroup_pool> {
+	SpriteGroup(SpriteGroupType type = SGT_INVALID) :
+		type(type)
+	{
+	}
+
+	~SpriteGroup();
+
 	SpriteGroupType type;
 
 	union {
@@ -195,13 +206,11 @@
 		TileLayoutSpriteGroup layout;
 		IndustryProductionSpriteGroup indprod;
 	} g;
+
+	inline bool IsValid() const { return this->type != SGT_INVALID; }
 };
 
 
-SpriteGroup *AllocateSpriteGroup();
-void InitializeSpriteGroupPool();
-
-
 struct ResolverObject {
 	CallbackID callback;
 	uint32 callback_param1;