changeset 8949:36b54e6eec1e draft

(svn r12737) -Codechange: Replace vector with a cut down class to allocate space as necessary. This avoids copying data around for vector's push_back() function.
author peter1138 <peter1138@openttd.org>
date Wed, 16 Apr 2008 19:01:09 +0000
parents 6b08c7cd7921
children 1e8449e9c1ec
files projects/openttd_vs80.vcproj projects/openttd_vs90.vcproj source.list src/misc/smallvec.h src/viewport.cpp
diffstat 5 files changed, 77 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -2272,6 +2272,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\misc\smallveh.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\misc\str.hpp"
 				>
 			</File>
--- a/projects/openttd_vs90.vcproj
+++ b/projects/openttd_vs90.vcproj
@@ -2269,6 +2269,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\misc\smallveh.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\misc\str.hpp"
 				>
 			</File>
--- a/source.list
+++ b/source.list
@@ -515,6 +515,7 @@
 misc/dbg_helpers.h
 misc/fixedsizearray.hpp
 misc/hashtable.hpp
+misc/smallveh.h
 misc/str.hpp
 misc/strapi.hpp
 
new file mode 100644
--- /dev/null
+++ b/src/misc/smallvec.h
@@ -0,0 +1,44 @@
+/* $Id$ */
+
+/* @file smallvec.h */
+
+#ifndef SMALLVEC_H
+#define SMALLVEC_H
+
+template <typename T, uint S> struct SmallVector {
+	T *data;
+	uint items;
+	uint capacity;
+
+	SmallVector() : data(NULL), items(0), capacity(0) { }
+
+	~SmallVector()
+	{
+		free(data);
+	}
+
+	/**
+	 * Append an item and return it.
+	 */
+	T *Append()
+	{
+		if (items == capacity) {
+			capacity += S;
+			data = ReallocT(data, capacity);
+		}
+
+		return &data[items++];
+	}
+
+	const T *Begin() const
+	{
+		return data;
+	}
+
+	const T *End() const
+	{
+		return &data[items];
+	}
+};
+
+#endif /* SMALLVEC_H */
--- a/src/viewport.cpp
+++ b/src/viewport.cpp
@@ -28,8 +28,7 @@
 #include "settings_type.h"
 #include "station_func.h"
 #include "core/alloc_type.hpp"
-
-#include <vector>
+#include "misc/smallvec.h"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -139,8 +138,8 @@
 	FOUNDATION_PART_END
 };
 
-typedef std::vector<TileSpriteToDraw> TileSpriteToDrawVector;
-typedef std::vector<StringSpriteToDraw> StringSpriteToDrawVector;
+typedef SmallVector<TileSpriteToDraw, 64> TileSpriteToDrawVector;
+typedef SmallVector<StringSpriteToDraw, 4> StringSpriteToDrawVector;
 
 struct ViewportDrawer {
 	DrawPixelInfo dpi;
@@ -488,15 +487,13 @@
 {
 	assert((image & SPRITE_MASK) < MAX_SPRITES);
 
-	TileSpriteToDraw ts;
-	ts.image = image;
-	ts.pal = pal;
-	ts.sub = sub;
-	ts.x = x;
-	ts.y = y;
-	ts.z = z;
-
-	_cur_vd->tile_sprites_to_draw.push_back(ts);
+	TileSpriteToDraw *ts = _cur_vd->tile_sprites_to_draw.Append();
+	ts->image = image;
+	ts->pal = pal;
+	ts->sub = sub;
+	ts->x = x;
+	ts->y = y;
+	ts->z = z;
 }
 
 /**
@@ -787,16 +784,14 @@
 /* Returns a StringSpriteToDraw */
 void AddStringToDraw(int x, int y, StringID string, uint64 params_1, uint64 params_2, uint16 color, uint16 width)
 {
-	StringSpriteToDraw ss;
-	ss.string = string;
-	ss.x = x;
-	ss.y = y;
-	ss.params[0] = params_1;
-	ss.params[1] = params_2;
-	ss.width = width;
-	ss.color = color;
-
-	_cur_vd->string_sprites_to_draw.push_back(ss);
+	StringSpriteToDraw *ss = _cur_vd->string_sprites_to_draw.Append();
+	ss->string = string;
+	ss->x = x;
+	ss->y = y;
+	ss->params[0] = params_1;
+	ss->params[1] = params_2;
+	ss->width = width;
+	ss->color = color;
 }
 
 
@@ -1333,7 +1328,8 @@
 
 static void ViewportDrawTileSprites(const TileSpriteToDrawVector *tstdv)
 {
-	for (TileSpriteToDrawVector::const_iterator ts = tstdv->begin(); ts != tstdv->end(); ts++) {
+	const TileSpriteToDraw *tsend = tstdv->End();
+	for (const TileSpriteToDraw *ts = tstdv->Begin(); ts != tsend; ++ts) {
 		Point pt = RemapCoords(ts->x, ts->y, ts->z);
 		DrawSprite(ts->image, ts->pal, pt.x, pt.y, ts->sub);
 	}
@@ -1444,7 +1440,8 @@
 	dp.width  = UnScaleByZoom(dp.width,  zoom);
 	dp.height = UnScaleByZoom(dp.height, zoom);
 
-	for (StringSpriteToDrawVector::const_iterator ss = sstdv->begin(); ss != sstdv->end(); ss++) {
+	const StringSpriteToDraw *ssend = sstdv->End();
+	for (const StringSpriteToDraw *ss = sstdv->Begin(); ss != ssend; ++ss) {
 		uint16 colour;
 
 		if (ss->width != 0) {
@@ -1541,7 +1538,7 @@
 	 *  is checked) */
 	assert(vd.parent_list <= endof(parent_list));
 
-	if (!vd.tile_sprites_to_draw.empty()) ViewportDrawTileSprites(&vd.tile_sprites_to_draw);
+	if (vd.tile_sprites_to_draw.items != 0) ViewportDrawTileSprites(&vd.tile_sprites_to_draw);
 
 	/* null terminate parent sprite list */
 	*vd.parent_list = NULL;
@@ -1551,7 +1548,7 @@
 
 	if (_draw_bounding_boxes) ViewportDrawBoundingBoxes(parent_list);
 
-	if (!vd.string_sprites_to_draw.empty()) ViewportDrawStrings(&vd.dpi, &vd.string_sprites_to_draw);
+	if (vd.string_sprites_to_draw.items != 0) ViewportDrawStrings(&vd.dpi, &vd.string_sprites_to_draw);
 
 	_cur_dpi = old_dpi;
 }