summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/group.h26
-rw-r--r--src/group_cmd.cpp53
-rw-r--r--src/train_cmd.cpp8
-rw-r--r--src/vehicle.cpp2
4 files changed, 59 insertions, 30 deletions
diff --git a/src/group.h b/src/group.h
index 2b6e72492..bb87760c6 100644
--- 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
index d4148474f..df625e69e 100644
--- 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 tile, DoCommandFlag flags, uint32 p1, u
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 tile, DoCommandFlag flags, uint32 p1, u
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 Vehicle *v)
{
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
index 55465d23d..86099507d 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -1245,13 +1245,13 @@ CommandCost CmdMoveRailVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, u
/* 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 tile, DoCommandFlag flags, uint32 p1, u
/* 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(DoCommandFlag flags, Vehicle *t, uint16 data, uint3
/* 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
index c6539ef67..731c31395 100644
--- 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()) {