cargopacket.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #ifndef CARGOPACKET_H
00013 #define CARGOPACKET_H
00014
00015 #include "core/pool_type.hpp"
00016 #include "economy_type.h"
00017 #include "station_type.h"
00018 #include "cargo_type.h"
00019 #include "vehicle_type.h"
00020 #include <list>
00021
00023 typedef uint32 CargoPacketID;
00024 struct CargoPacket;
00025
00027 typedef Pool<CargoPacket, CargoPacketID, 1024, 1048576, true, false> CargoPacketPool;
00029 extern CargoPacketPool _cargopacket_pool;
00030
00031 template <class Tinst> class CargoList;
00032 extern const struct SaveLoad *GetCargoPacketDesc();
00033
00037 struct CargoPacket : CargoPacketPool::PoolItem<&_cargopacket_pool> {
00038 private:
00039 Money feeder_share;
00040 uint16 count;
00041 byte days_in_transit;
00042 SourceTypeByte source_type;
00043 SourceID source_id;
00044 StationID source;
00045 TileIndex source_xy;
00046 TileIndex loaded_at_xy;
00047
00049 template <class Tinst> friend class CargoList;
00050 friend class VehicleCargoList;
00051 friend class StationCargoList;
00053 friend const struct SaveLoad *GetCargoPacketDesc();
00054 public:
00056 static const uint16 MAX_COUNT = UINT16_MAX;
00057
00061 CargoPacket();
00062
00072 CargoPacket(StationID source, TileIndex source_xy, uint16 count, SourceType source_type, SourceID source_id);
00073
00086 CargoPacket(uint16 count, byte days_in_transit, StationID source, TileIndex source_xy, TileIndex loaded_at_xy, Money feeder_share = 0, SourceType source_type = ST_INDUSTRY, SourceID source_id = INVALID_SOURCE);
00087
00089 ~CargoPacket() { }
00090
00091
00096 FORCEINLINE uint16 Count() const
00097 {
00098 return this->count;
00099 }
00100
00106 FORCEINLINE Money FeederShare() const
00107 {
00108 return this->feeder_share;
00109 }
00110
00117 FORCEINLINE byte DaysInTransit() const
00118 {
00119 return this->days_in_transit;
00120 }
00121
00126 FORCEINLINE SourceType SourceSubsidyType() const
00127 {
00128 return this->source_type;
00129 }
00130
00135 FORCEINLINE SourceID SourceSubsidyID() const
00136 {
00137 return this->source_id;
00138 }
00139
00144 FORCEINLINE SourceID SourceStation() const
00145 {
00146 return this->source;
00147 }
00148
00153 FORCEINLINE TileIndex SourceStationXY() const
00154 {
00155 return this->source_xy;
00156 }
00157
00162 FORCEINLINE TileIndex LoadedAtXY() const
00163 {
00164 return this->loaded_at_xy;
00165 }
00166
00167
00168 static void InvalidateAllFrom(SourceType src_type, SourceID src);
00169 static void InvalidateAllFrom(StationID sid);
00170 static void AfterLoad();
00171 };
00172
00178 #define FOR_ALL_CARGOPACKETS_FROM(var, start) FOR_ALL_ITEMS_FROM(CargoPacket, cargopacket_index, var, start)
00179
00184 #define FOR_ALL_CARGOPACKETS(var) FOR_ALL_CARGOPACKETS_FROM(var, 0)
00185
00190 template <class Tinst>
00191 class CargoList {
00192 public:
00194 typedef std::list<CargoPacket *> List;
00196 typedef List::iterator Iterator;
00198 typedef List::const_iterator ConstIterator;
00199
00201 enum MoveToAction {
00202 MTA_FINAL_DELIVERY,
00203 MTA_CARGO_LOAD,
00204 MTA_TRANSFER,
00205 MTA_UNLOAD,
00206 };
00207
00208 protected:
00209 uint count;
00210 uint cargo_days_in_transit;
00211
00212 List packets;
00213
00219 void AddToCache(const CargoPacket *cp);
00220
00226 void RemoveFromCache(const CargoPacket *cp);
00227
00228 public:
00230 CargoList() {}
00232 ~CargoList();
00233
00238 FORCEINLINE const List *Packets() const
00239 {
00240 return &this->packets;
00241 }
00242
00247 FORCEINLINE bool Empty() const
00248 {
00249 return this->count == 0;
00250 }
00251
00256 FORCEINLINE uint Count() const
00257 {
00258 return this->count;
00259 }
00260
00265 FORCEINLINE StationID Source() const
00266 {
00267 return this->Empty() ? INVALID_STATION : this->packets.front()->source;
00268 }
00269
00274 FORCEINLINE uint DaysInTransit() const
00275 {
00276 return this->count == 0 ? 0 : this->cargo_days_in_transit / this->count;
00277 }
00278
00279
00287 void Append(CargoPacket *cp);
00288
00294 void Truncate(uint max_remaining);
00295
00317 template <class Tother_inst>
00318 bool MoveTo(Tother_inst *dest, uint count, MoveToAction mta, CargoPayment *payment, uint data = 0);
00319
00321 void InvalidateCache();
00322 };
00323
00327 class VehicleCargoList : public CargoList<VehicleCargoList> {
00328 protected:
00330 typedef CargoList<VehicleCargoList> Parent;
00331
00332 Money feeder_share;
00333
00339 void AddToCache(const CargoPacket *cp);
00340
00346 void RemoveFromCache(const CargoPacket *cp);
00347
00348 public:
00350 friend class CargoList<VehicleCargoList>;
00352 friend const struct SaveLoad *GetVehicleDescription(VehicleType vt);
00353
00358 FORCEINLINE Money FeederShare() const
00359 {
00360 return this->feeder_share;
00361 }
00362
00366 void AgeCargo();
00367
00369 void InvalidateCache();
00370
00378 static bool AreMergable(const CargoPacket *cp1, const CargoPacket *cp2)
00379 {
00380 return cp1->source_xy == cp2->source_xy &&
00381 cp1->days_in_transit == cp2->days_in_transit &&
00382 cp1->source_type == cp2->source_type &&
00383 cp1->source_id == cp2->source_id &&
00384 cp1->loaded_at_xy == cp2->loaded_at_xy;
00385 }
00386 };
00387
00391 class StationCargoList : public CargoList<StationCargoList> {
00392 public:
00394 friend class CargoList<StationCargoList>;
00396 friend const struct SaveLoad *GetGoodsDesc();
00397
00405 static bool AreMergable(const CargoPacket *cp1, const CargoPacket *cp2)
00406 {
00407 return cp1->source_xy == cp2->source_xy &&
00408 cp1->days_in_transit == cp2->days_in_transit &&
00409 cp1->source_type == cp2->source_type &&
00410 cp1->source_id == cp2->source_id;
00411 }
00412 };
00413
00414 #endif