# HG changeset patch # User peter1138 # Date 2008-05-28 11:56:21 # Node ID 9c082e37fcdf74691b4cb58b61560cf3876306ee # Parent 5facaa348a52bc586bf1b6ab9893afa0b80decce (svn r13307) -Codechange: Separate VehicleList and its two functions so only the 3 users include it, reducing dependencies on misc/smallvec.h diff --git a/source.list b/source.list --- a/source.list +++ b/source.list @@ -112,6 +112,7 @@ tile_map.cpp #end #end vehicle.cpp +vehiclelist.cpp viewport.cpp waypoint.cpp widget.cpp @@ -324,6 +325,7 @@ vehicle_base.h vehicle_func.h vehicle_gui.h vehicle_type.h +vehiclelist.h viewport_func.h viewport_type.h waypoint.h diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp --- a/src/depot_gui.cpp +++ b/src/depot_gui.cpp @@ -26,6 +26,7 @@ #include "depot_base.h" #include "tilehighlight_func.h" #include "window_gui.h" +#include "vehiclelist.h" #include "table/strings.h" #include "table/sprites.h" diff --git a/src/vehicle.cpp b/src/vehicle.cpp --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -51,6 +51,7 @@ #include "animated_tile_func.h" #include "effectvehicle_base.h" #include "core/alloc_func.hpp" +#include "vehiclelist.h" #include "table/sprites.h" #include "table/strings.h" @@ -1292,137 +1293,6 @@ CommandCost CmdCloneVehicle(TileIndex ti } /** - * Generate a list of vehicles inside a depot. - * @param type Type of vehicle - * @param tile The tile the depot is located on - * @param engines Pointer to list to add vehicles to - * @param wagons Pointer to list to add wagons to (can be NULL) - */ -void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engines, VehicleList *wagons) -{ - engines->Clear(); - if (wagons != NULL && wagons != engines) wagons->Clear(); - - const Vehicle *v; - FOR_ALL_VEHICLES(v) { - /* General tests for all vehicle types */ - if (v->type != type) continue; - if (v->tile != tile) continue; - - switch (type) { - case VEH_TRAIN: - if (v->u.rail.track != TRACK_BIT_DEPOT) continue; - if (wagons != NULL && IsFreeWagon(v)) { - *wagons->Append() = v; - continue; - } - break; - - default: - if (!v->IsInDepot()) continue; - break; - } - - if (!v->IsPrimaryVehicle()) continue; - - *engines->Append() = v; - } - - /* Ensure the lists are not wasting too much space. If the lists are fresh - * (i.e. built within a command) then this will actually do nothing. */ - engines->Compact(); - if (wagons != NULL && wagons != engines) wagons->Compact(); -} - -/** - * Generate a list of vehicles based on window type. - * @param list Pointer to list to add vehicles to - * @param type Type of vehicle - * @param owner Player to generate list for - * @param index This parameter has different meanings depending on window_type - * - * @param window_type The type of window the list is for, using the VLW_ flags in vehicle_gui.h - */ -void GenerateVehicleSortList(VehicleList *list, VehicleType type, PlayerID owner, uint32 index, uint16 window_type) -{ - list->Clear(); - - const Vehicle *v; - - switch (window_type) { - case VLW_STATION_LIST: - FOR_ALL_VEHICLES(v) { - if (v->type == type && v->IsPrimaryVehicle()) { - const Order *order; - - FOR_VEHICLE_ORDERS(v, order) { - if (order->IsType(OT_GOTO_STATION) && order->GetDestination() == index) { - *list->Append() = v; - break; - } - } - } - } - break; - - case VLW_SHARED_ORDERS: - FOR_ALL_VEHICLES(v) { - /* Find a vehicle with the order in question */ - if (v->orders != NULL && v->orders->index == index) { - /* Add all vehicles from this vehicle's shared order list */ - for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) { - *list->Append() = v; - } - break; - } - } - break; - - case VLW_STANDARD: - FOR_ALL_VEHICLES(v) { - if (v->type == type && v->owner == owner && v->IsPrimaryVehicle()) { - *list->Append() = v; - } - } - break; - - case VLW_DEPOT_LIST: - FOR_ALL_VEHICLES(v) { - if (v->type == type && v->IsPrimaryVehicle()) { - const Order *order; - - FOR_VEHICLE_ORDERS(v, order) { - if (order->IsType(OT_GOTO_DEPOT) && order->GetDestination() == index) { - *list->Append() = v; - break; - } - } - } - } - break; - - case VLW_GROUP_LIST: - FOR_ALL_VEHICLES(v) { - if (v->type == type && v->IsPrimaryVehicle() && - v->owner == owner && v->group_id == index) { - *list->Append() = v; - } - } - break; - - default: NOT_REACHED(); break; - } - - list->Compact(); -} - -/** * Send all vehicles of type to depots * @param type type of vehicle * @param flags the flags used for DoCommand() diff --git a/src/vehicle_func.h b/src/vehicle_func.h --- a/src/vehicle_func.h +++ b/src/vehicle_func.h @@ -68,8 +68,6 @@ void TrainConsistChanged(Vehicle *v); void TrainPowerChanged(Vehicle *v); Money GetTrainRunningCost(const Vehicle *v); -void GenerateVehicleSortList(VehicleList *list, VehicleType type, PlayerID owner, uint32 index, uint16 window_type); -void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engine_list, VehicleList *wagon_list); CommandCost SendAllVehiclesToDepot(VehicleType type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id); void VehicleEnterDepot(Vehicle *v); diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -36,6 +36,7 @@ #include "widgets/dropdown_func.h" #include "order_func.h" #include "timetable.h" +#include "vehiclelist.h" #include "table/sprites.h" #include "table/strings.h" diff --git a/src/vehicle_type.h b/src/vehicle_type.h --- a/src/vehicle_type.h +++ b/src/vehicle_type.h @@ -6,7 +6,6 @@ #define VEHICLE_TYPE_H #include "core/enum_type.hpp" -#include "misc/smallvec.h" typedef uint16 VehicleID; @@ -57,6 +56,4 @@ enum DepotCommand { DEPOT_COMMAND_MASK = 0xF, }; -typedef SmallVector VehicleList; - #endif /* VEHICLE_TYPE_H */ diff --git a/src/vehiclelist.cpp b/src/vehiclelist.cpp new file mode 100644 --- /dev/null +++ b/src/vehiclelist.cpp @@ -0,0 +1,144 @@ +/* $Id$ */ + +/** @file vehicle.cpp Base implementations of all vehicles. */ + +#include "stdafx.h" +#include "openttd.h" +#include "vehicle_type.h" +#include "vehicle_func.h" +#include "vehicle_base.h" +#include "vehicle_gui.h" +#include "core/alloc_func.hpp" +#include "train.h" +#include "vehiclelist.h" + +/** + * Generate a list of vehicles inside a depot. + * @param type Type of vehicle + * @param tile The tile the depot is located on + * @param engines Pointer to list to add vehicles to + * @param wagons Pointer to list to add wagons to (can be NULL) + */ +void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engines, VehicleList *wagons) +{ + engines->Clear(); + if (wagons != NULL && wagons != engines) wagons->Clear(); + + const Vehicle *v; + FOR_ALL_VEHICLES(v) { + /* General tests for all vehicle types */ + if (v->type != type) continue; + if (v->tile != tile) continue; + + switch (type) { + case VEH_TRAIN: + if (v->u.rail.track != TRACK_BIT_DEPOT) continue; + if (wagons != NULL && IsFreeWagon(v)) { + *wagons->Append() = v; + continue; + } + break; + + default: + if (!v->IsInDepot()) continue; + break; + } + + if (!v->IsPrimaryVehicle()) continue; + + *engines->Append() = v; + } + + /* Ensure the lists are not wasting too much space. If the lists are fresh + * (i.e. built within a command) then this will actually do nothing. */ + engines->Compact(); + if (wagons != NULL && wagons != engines) wagons->Compact(); +} + +/** + * Generate a list of vehicles based on window type. + * @param list Pointer to list to add vehicles to + * @param type Type of vehicle + * @param owner Player to generate list for + * @param index This parameter has different meanings depending on window_type + * + * @param window_type The type of window the list is for, using the VLW_ flags in vehicle_gui.h + */ +void GenerateVehicleSortList(VehicleList *list, VehicleType type, PlayerID owner, uint32 index, uint16 window_type) +{ + list->Clear(); + + const Vehicle *v; + + switch (window_type) { + case VLW_STATION_LIST: + FOR_ALL_VEHICLES(v) { + if (v->type == type && v->IsPrimaryVehicle()) { + const Order *order; + + FOR_VEHICLE_ORDERS(v, order) { + if (order->IsType(OT_GOTO_STATION) && order->GetDestination() == index) { + *list->Append() = v; + break; + } + } + } + } + break; + + case VLW_SHARED_ORDERS: + FOR_ALL_VEHICLES(v) { + /* Find a vehicle with the order in question */ + if (v->orders != NULL && v->orders->index == index) { + /* Add all vehicles from this vehicle's shared order list */ + for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) { + *list->Append() = v; + } + break; + } + } + break; + + case VLW_STANDARD: + FOR_ALL_VEHICLES(v) { + if (v->type == type && v->owner == owner && v->IsPrimaryVehicle()) { + *list->Append() = v; + } + } + break; + + case VLW_DEPOT_LIST: + FOR_ALL_VEHICLES(v) { + if (v->type == type && v->IsPrimaryVehicle()) { + const Order *order; + + FOR_VEHICLE_ORDERS(v, order) { + if (order->IsType(OT_GOTO_DEPOT) && order->GetDestination() == index) { + *list->Append() = v; + break; + } + } + } + } + break; + + case VLW_GROUP_LIST: + FOR_ALL_VEHICLES(v) { + if (v->type == type && v->IsPrimaryVehicle() && + v->owner == owner && v->group_id == index) { + *list->Append() = v; + } + } + break; + + default: NOT_REACHED(); break; + } + + list->Compact(); +} diff --git a/src/vehiclelist.h b/src/vehiclelist.h new file mode 100644 --- /dev/null +++ b/src/vehiclelist.h @@ -0,0 +1,15 @@ +/* $Id$ */ + +/** @file vehiclelist.h Functions and type for generating vehicle lists. */ + +#ifndef VEHICLELIST_H +#define VEHICLELIST_H + +#include "misc/smallvec.h" + +typedef SmallVector VehicleList; + +void GenerateVehicleSortList(VehicleList *list, VehicleType type, PlayerID owner, uint32 index, uint16 window_type); +void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engine_list, VehicleList *wagon_list); + +#endif /* VEHICLELIST_H */