diff --git a/src/group.h b/src/group.h --- a/src/group.h +++ b/src/group.h @@ -31,6 +31,11 @@ struct GroupStatistics { void Clear(); + static GroupStatistics &Get(CompanyID company, GroupID id_g, VehicleType type); + static GroupStatistics &Get(const Vehicle *v); + + static void CountVehicle(const Vehicle *v, int delta); + static void UpdateAfterLoad(); }; @@ -81,27 +86,6 @@ static inline uint GetGroupArraySize() uint GetGroupNumEngines(CompanyID company, GroupID id_g, EngineID id_e); -/** - * Increase the number of vehicles by one in a group. - * @param id_g Group id. - */ -static inline void IncreaseGroupNumVehicle(GroupID id_g) -{ - Group *g = Group::GetIfValid(id_g); - if (g != NULL) g->statistics.num_vehicle++; -} - -/** - * Decrease the number of vehicles by one in a group. - * @param id_g Group id. - */ -static inline void DecreaseGroupNumVehicle(GroupID id_g) -{ - Group *g = Group::GetIfValid(id_g); - if (g != NULL) g->statistics.num_vehicle--; -} - - void SetTrainGroupID(Train *v, GroupID grp); void UpdateTrainGroupID(Train *v); void RemoveVehicleFromGroup(const Vehicle *v); diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -55,6 +55,35 @@ void GroupStatistics::Clear() } /** + * Returns the GroupStatistics for a specific group. + * @param company Owner of the group. + * @param id_g GroupID of the group. + * @param type VehicleType of the vehicles in the group. + * @return Statistics for the group. + */ +/* static */ GroupStatistics &GroupStatistics::Get(CompanyID company, GroupID id_g, VehicleType type) +{ + if (Group::IsValidID(id_g)) { + Group *g = Group::Get(id_g); + assert(g->owner == company); + assert(g->vehicle_type == type); + return g->statistics; + } + + NOT_REACHED(); +} + +/** + * Returns the GroupStatistic for the group of a vehicle. + * @param v Vehicle. + * @return GroupStatistics for the group of the vehicle. + */ +/* static */ GroupStatistics &GroupStatistics::Get(const Vehicle *v) +{ + return GroupStatistics::Get(v->owner, v->group_id, v->type); +} + +/** * Update all caches after loading a game, changing NewGRF etc.. */ /* static */ void GroupStatistics::UpdateAfterLoad() @@ -89,10 +118,25 @@ void GroupStatistics::Clear() assert(v->owner == g->owner); g->statistics.num_engines[v->engine_type]++; - if (v->IsPrimaryVehicle()) g->statistics.num_vehicle++; + if (v->IsPrimaryVehicle()) GroupStatistics::CountVehicle(v, 1); } } +/** + * Update num_vehicle when adding or removing a vehicle. + * @param v Vehicle to count. + * @param delta +1 to add, -1 to remove. + */ +/* static */ void GroupStatistics::CountVehicle(const Vehicle *v, int delta) +{ + assert(delta == 1 || delta == -1); + if (!Group::IsValidID(v->group_id)) return; + + GroupStatistics &stats = GroupStatistics::Get(v); + + stats.num_vehicle += delta; +} + /** * Update the num engines of a groupID. Decrease the old one and increase the new one @@ -276,8 +320,7 @@ CommandCost CmdAddVehicleGroup(TileIndex if (v->owner != _current_company || !v->IsPrimaryVehicle()) return CMD_ERROR; if (flags & DC_EXEC) { - DecreaseGroupNumVehicle(v->group_id); - IncreaseGroupNumVehicle(new_g); + GroupStatistics::CountVehicle(v, -1); switch (v->type) { default: NOT_REACHED(); @@ -292,6 +335,8 @@ CommandCost CmdAddVehicleGroup(TileIndex break; } + GroupStatistics::CountVehicle(v, 1); + /* Update the Replace Vehicle Windows */ SetWindowDirty(WC_REPLACE_VEHICLE, v->type); InvalidateWindowData(GetWindowClassForVehicleType(v->type), VehicleListIdentifier(VL_GROUP_LIST, v->type, _current_company).Pack()); @@ -412,7 +457,7 @@ void RemoveVehicleFromGroup(const Vehicl { if (!v->IsPrimaryVehicle()) return; - if (!IsDefaultGroupID(v->group_id)) DecreaseGroupNumVehicle(v->group_id); + if (!IsDefaultGroupID(v->group_id)) GroupStatistics::CountVehicle(v, -1); } diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -1245,13 +1245,13 @@ CommandCost CmdMoveRailVehicle(TileIndex /* We are going to be moved to a different train, and * we were the front engine of the original train. */ if (dst_head != NULL && dst_head != src && (src_head == NULL || !src_head->IsFrontEngine())) { - DecreaseGroupNumVehicle(src->group_id); + GroupStatistics::CountVehicle(src, -1); } /* The front engine is going to be moved later in the * current train, and it will not be a train anymore. */ if (dst_head == NULL && !src_head->IsFrontEngine()) { - DecreaseGroupNumVehicle(src->group_id); + GroupStatistics::CountVehicle(src, -1); } /* Delete orders, group stuff and the unit number as we're not the @@ -1264,7 +1264,7 @@ CommandCost CmdMoveRailVehicle(TileIndex /* We were a front engine and we are becoming one for a different train. * Increase the group counter accordingly. */ if (original_src_head == src && dst_head == src) { - IncreaseGroupNumVehicle(src->group_id); + GroupStatistics::CountVehicle(src, 1); } /* We weren't a front engine but are becoming one. So @@ -1354,7 +1354,7 @@ CommandCost CmdSellRailWagon(DoCommandFl /* Copy other important data from the front engine */ new_head->CopyVehicleConfigAndStatistics(first); - IncreaseGroupNumVehicle(new_head->group_id); + GroupStatistics::CountVehicle(new_head, 1); /* If we deleted a window then open a new one for the 'new' train */ if (IsLocalCompany() && w != NULL) ShowVehicleViewWindow(new_head); diff --git a/src/vehicle.cpp b/src/vehicle.cpp --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -698,7 +698,7 @@ void Vehicle::PreDestructor() DeleteGroupHighlightOfVehicle(this); if (Group::IsValidID(this->group_id)) Group::Get(this->group_id)->statistics.num_engines[this->engine_type]--; - if (this->IsPrimaryVehicle()) DecreaseGroupNumVehicle(this->group_id); + if (this->IsPrimaryVehicle()) GroupStatistics::CountVehicle(this, -1); } if (this->type == VEH_AIRCRAFT && this->IsPrimaryVehicle()) {