Changeset - r13293:58ebfc85fa07
[Not reviewed]
master
0 2 0
rubidium - 15 years ago 2009-10-19 01:12:51
rubidium@openttd.org
(svn r17812) -Codechange: move the feeder_share cache from CargoList to VehicleCargoList; saves 512 bytes per station and 1-2% on CargoList::MoveTo.
2 files changed with 79 insertions and 34 deletions:
0 comments (0 inline, 0 general)
src/cargopacket.cpp
Show inline comments
 
@@ -96,7 +96,6 @@ template <class Tinst>
 
void CargoList<Tinst>::RemoveFromCache(const CargoPacket *cp)
 
{
 
	this->count                 -= cp->count;
 
	this->feeder_share          -= cp->feeder_share;
 
	this->cargo_days_in_transit -= cp->days_in_transit * cp->count;
 
}
 

	
 
@@ -104,21 +103,9 @@ template <class Tinst>
 
void CargoList<Tinst>::AddToCache(const CargoPacket *cp)
 
{
 
	this->count                 += cp->count;
 
	this->feeder_share          += cp->feeder_share;
 
	this->cargo_days_in_transit += cp->days_in_transit * cp->count;
 
}
 

	
 
void VehicleCargoList::AgeCargo()
 
{
 
	for (List::const_iterator it = this->packets.begin(); it != this->packets.end(); it++) {
 
		/* If we're at the maximum, then we can't increase no more. */
 
		if ((*it)->days_in_transit == 0xFF) continue;
 

	
 
		(*it)->days_in_transit++;
 
		this->cargo_days_in_transit += (*it)->count;
 
	}
 
}
 

	
 
template <class Tinst>
 
void CargoList<Tinst>::Append(CargoPacket *cp)
 
{
 
@@ -130,7 +117,7 @@ void CargoList<Tinst>::Append(CargoPacke
 
			icp->count        += cp->count;
 
			icp->feeder_share += cp->feeder_share;
 

	
 
			this->AddToCache(cp);
 
			static_cast<Tinst *>(this)->AddToCache(cp);
 
			delete cp;
 
			return;
 
		}
 
@@ -138,7 +125,7 @@ void CargoList<Tinst>::Append(CargoPacke
 

	
 
	/* The packet could not be merged with another one */
 
	this->packets.push_back(cp);
 
	this->AddToCache(cp);
 
	static_cast<Tinst *>(this)->AddToCache(cp);
 
}
 

	
 

	
 
@@ -150,7 +137,7 @@ void CargoList<Tinst>::Truncate(uint max
 
		if (max_remaining == 0) {
 
			/* Nothing should remain, just remove the packets. */
 
			packets.erase(it++);
 
			this->RemoveFromCache(cp);
 
			static_cast<Tinst *>(this)->RemoveFromCache(cp);
 
			delete cp;
 
			continue;
 
		}
 
@@ -189,7 +176,7 @@ bool CargoList<Tinst>::MoveTo(Tother_ins
 
			/* Can move the complete packet */
 
			max_move -= cp->count;
 
			this->packets.erase(it++);
 
			this->RemoveFromCache(cp);
 
			static_cast<Tinst *>(this)->RemoveFromCache(cp);
 
			switch(mta) {
 
				case MTA_FINAL_DELIVERY:
 
					payment->PayFinalDelivery(cp, cp->count);
 
@@ -215,20 +202,24 @@ bool CargoList<Tinst>::MoveTo(Tother_ins
 
		if (mta == MTA_FINAL_DELIVERY) {
 
			/* Final delivery doesn't need package splitting. */
 
			payment->PayFinalDelivery(cp, max_move);
 
			this->count -= max_move;
 
			this->cargo_days_in_transit -= max_move * cp->days_in_transit;
 

	
 
			/* Remove the delivered data from the cache */
 
			uint left = cp->count - max_move;
 
			cp->count = max_move;
 
			static_cast<Tinst *>(this)->RemoveFromCache(cp);
 

	
 
			/* Final delivery payment pays the feeder share, so we have to
 
			 * reset that so it is not 'shown' twice for partial unloads. */
 
			this->feeder_share -= cp->feeder_share;
 
			cp->feeder_share = 0;
 
			cp->count = left;
 
		} else {
 
			/* But... the rest needs package splitting. */
 
			Money fs = cp->feeder_share * max_move / static_cast<uint>(cp->count);
 
			cp->feeder_share -= fs;
 
			cp->count -= max_move;
 

	
 
			CargoPacket *cp_new = new CargoPacket(max_move, cp->days_in_transit, cp->source, cp->source_xy, (mta == MTA_CARGO_LOAD) ? data : cp->loaded_at_xy, fs, cp->source_type, cp->source_id);
 
			this->RemoveFromCache(cp_new); // this reflects the changes in cp.
 
			static_cast<Tinst *>(this)->RemoveFromCache(cp_new); // this reflects the changes in cp.
 

	
 
			if (mta == MTA_TRANSFER) {
 
				/* Add the feeder share before inserting in dest. */
 
@@ -237,7 +228,6 @@ bool CargoList<Tinst>::MoveTo(Tother_ins
 

	
 
			dest->Append(cp_new);
 
		}
 
		cp->count -= max_move;
 

	
 
		max_move = 0;
 
	}
 
@@ -249,14 +239,43 @@ template <class Tinst>
 
void CargoList<Tinst>::InvalidateCache()
 
{
 
	this->count = 0;
 
	this->feeder_share = 0;
 
	this->cargo_days_in_transit = 0;
 

	
 
	for (List::const_iterator it = this->packets.begin(); it != this->packets.end(); it++) {
 
		this->AddToCache(*it);
 
		static_cast<Tinst *>(this)->AddToCache(*it);
 
	}
 
}
 

	
 

	
 
void VehicleCargoList::RemoveFromCache(const CargoPacket *cp)
 
{
 
	this->feeder_share -= cp->feeder_share;
 
	this->Parent::RemoveFromCache(cp);
 
}
 

	
 
void VehicleCargoList::AddToCache(const CargoPacket *cp)
 
{
 
	this->feeder_share += cp->feeder_share;
 
	this->Parent::AddToCache(cp);
 
}
 

	
 
void VehicleCargoList::AgeCargo()
 
{
 
	for (List::const_iterator it = this->packets.begin(); it != this->packets.end(); it++) {
 
		/* If we're at the maximum, then we can't increase no more. */
 
		if ((*it)->days_in_transit == 0xFF) continue;
 

	
 
		(*it)->days_in_transit++;
 
		this->cargo_days_in_transit += (*it)->count;
 
	}
 
}
 

	
 
void VehicleCargoList::InvalidateCache()
 
{
 
	this->feeder_share = 0;
 
	this->Parent::InvalidateCache();
 
}
 

	
 
/*
 
 * We have to instantiate everything we want to be usable.
 
 */
src/cargopacket.h
Show inline comments
 
@@ -197,7 +197,6 @@ public:
 
	};
 

	
 
protected:
 
	Money feeder_share;         ///< Cache for the feeder share
 
	uint count;                 ///< Cache for the number of cargo entities
 
	uint cargo_days_in_transit; ///< Cache for the sum of number of days in transit of each entity; comparable to man-hours
 

	
 
@@ -251,15 +250,6 @@ public:
 
	}
 

	
 
	/**
 
	 * Returns total sum of the feeder share for all packets
 
	 * @return the before mentioned number
 
	 */
 
	FORCEINLINE Money FeederShare() const
 
	{
 
		return this->feeder_share;
 
	}
 

	
 
	/**
 
	 * Returns source of the first cargo packet in this list
 
	 * @return the before mentioned source
 
	 */
 
@@ -326,15 +316,49 @@ public:
 
 * CargoList that is used for vehicles.
 
 */
 
class VehicleCargoList : public CargoList<VehicleCargoList> {
 
protected:
 
	/** The (direct) parent of this class */
 
	typedef CargoList<VehicleCargoList> Parent;
 

	
 
	Money feeder_share; ///< Cache for the feeder share
 

	
 
	/**
 
	 * Update the cache to reflect adding of this packet.
 
	 * Increases count, feeder share and days_in_transit
 
	 * @param cp a new packet to be inserted
 
	 */
 
	void AddToCache(const CargoPacket *cp);
 

	
 
	/**
 
	 * Update the cached values to reflect the removal of this packet.
 
	 * Decreases count, feeder share and days_in_transit
 
	 * @param cp Packet to be removed from cache
 
	 */
 
	void RemoveFromCache(const CargoPacket *cp);
 

	
 
public:
 
	/** The super class ought to know what it's doing */
 
	friend class CargoList<VehicleCargoList>;
 
	/** The vehicles have a cargo list (and we want that saved). */
 
	friend const struct SaveLoad *GetVehicleDescription(VehicleType vt);
 

	
 
	/**
 
	 * Returns total sum of the feeder share for all packets
 
	 * @return the before mentioned number
 
	 */
 
	FORCEINLINE Money FeederShare() const
 
	{
 
		return this->feeder_share;
 
	}
 

	
 
	/**
 
	 * Ages the all cargo in this list
 
	 */
 
	void AgeCargo();
 

	
 
	/** Invalidates the cached data and rebuild it */
 
	void InvalidateCache();
 

	
 
	/**
 
	 * Are two the two CargoPackets mergeable in the context of
 
	 * a list of CargoPackets for a Vehicle?
 
@@ -357,6 +381,8 @@ public:
 
 */
 
class StationCargoList : public CargoList<StationCargoList> {
 
public:
 
	/** The super class ought to know what it's doing */
 
	friend class CargoList<StationCargoList>;
 
	/** The stations, via GoodsEntry, have a CargoList. */
 
	friend const struct SaveLoad *GetGoodsDesc();
 

	
0 comments (0 inline, 0 general)