Skip to content

Commit c077f8e

Browse files
committed
Add function to avoid code duplication
1 parent 8a363c8 commit c077f8e

File tree

1 file changed

+36
-76
lines changed

1 file changed

+36
-76
lines changed

libs/s25main/factories/JobFactory.cpp

Lines changed: 36 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@
5252
#include "nodeObjs/noFlag.h"
5353
#include <stdexcept>
5454

55+
namespace {
56+
nobUsual* staticCastAndAssertCorrectType(noRoadNode* const goal)
57+
{
58+
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
59+
return static_cast<nobUsual*>(goal);
60+
}
61+
} // namespace
62+
5563
std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint pt, const unsigned char player,
5664
noRoadNode* const goal)
5765
{
@@ -67,36 +75,18 @@ std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint
6775
case Job::Planer:
6876
RTTR_Assert(dynamic_cast<noBuildingSite*>(goal));
6977
return std::make_unique<nofPlaner>(pt, player, static_cast<noBuildingSite*>(goal));
70-
case Job::Carpenter:
71-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
72-
return std::make_unique<nofCarpenter>(pt, player, static_cast<nobUsual*>(goal));
73-
case Job::Armorer:
74-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
75-
return std::make_unique<nofArmorer>(pt, player, static_cast<nobUsual*>(goal));
76-
case Job::Stonemason:
77-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
78-
return std::make_unique<nofStonemason>(pt, player, static_cast<nobUsual*>(goal));
79-
case Job::Brewer:
80-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
81-
return std::make_unique<nofBrewer>(pt, player, static_cast<nobUsual*>(goal));
82-
case Job::Minter:
83-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
84-
return std::make_unique<nofMinter>(pt, player, static_cast<nobUsual*>(goal));
85-
case Job::Butcher:
86-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
87-
return std::make_unique<nofButcher>(pt, player, static_cast<nobUsual*>(goal));
78+
case Job::Carpenter: return std::make_unique<nofCarpenter>(pt, player, staticCastAndAssertCorrectType(goal));
79+
case Job::Armorer: return std::make_unique<nofArmorer>(pt, player, staticCastAndAssertCorrectType(goal));
80+
case Job::Stonemason: return std::make_unique<nofStonemason>(pt, player, staticCastAndAssertCorrectType(goal));
81+
case Job::Brewer: return std::make_unique<nofBrewer>(pt, player, staticCastAndAssertCorrectType(goal));
82+
case Job::Minter: return std::make_unique<nofMinter>(pt, player, staticCastAndAssertCorrectType(goal));
83+
case Job::Butcher: return std::make_unique<nofButcher>(pt, player, staticCastAndAssertCorrectType(goal));
8884
case Job::IronFounder:
89-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
90-
return std::make_unique<nofIronfounder>(pt, player, static_cast<nobUsual*>(goal));
91-
case Job::Miller:
92-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
93-
return std::make_unique<nofMiller>(pt, player, static_cast<nobUsual*>(goal));
85+
return std::make_unique<nofIronfounder>(pt, player, staticCastAndAssertCorrectType(goal));
86+
case Job::Miller: return std::make_unique<nofMiller>(pt, player, staticCastAndAssertCorrectType(goal));
9487
case Job::Metalworker:
95-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
96-
return std::make_unique<nofMetalworker>(pt, player, static_cast<nobUsual*>(goal));
97-
case Job::Baker:
98-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
99-
return std::make_unique<nofBaker>(pt, player, static_cast<nobUsual*>(goal));
88+
return std::make_unique<nofMetalworker>(pt, player, staticCastAndAssertCorrectType(goal));
89+
case Job::Baker: return std::make_unique<nofBaker>(pt, player, staticCastAndAssertCorrectType(goal));
10090
case Job::Helper:
10191
// Wenn goal = 0 oder Lagerhaus, dann Auslagern anscheinend und mann kann irgendeinen Typ nehmen
10292
if(!goal)
@@ -106,7 +96,7 @@ std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint
10696
return std::make_unique<nofWellguy>(pt, player, static_cast<nobBaseWarehouse*>(goal));
10797
else if(goal->GetGOT() == GO_Type::NobUsual)
10898
{
109-
auto* goalBld = static_cast<nobUsual*>(goal);
99+
auto* goalBld = staticCastAndAssertCorrectType(goal);
110100
if(goalBld->GetBuildingType() == BuildingType::Well)
111101
return std::make_unique<nofWellguy>(pt, player, goalBld);
112102
else if(goalBld->GetBuildingType() == BuildingType::Catapult)
@@ -127,36 +117,20 @@ std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint
127117
return std::make_unique<nofPassiveWorker>(Job::Scout, pt, player, goal);
128118
else if(goal->GetGOT() == GO_Type::NobUsual) // Spähturm / Lagerhaus?
129119
{
130-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
131-
return std::make_unique<nofScout_LookoutTower>(pt, player, static_cast<nobUsual*>(goal));
120+
return std::make_unique<nofScout_LookoutTower>(pt, player, staticCastAndAssertCorrectType(goal));
132121
} else if(goal->GetGOT() == GO_Type::Flag)
133122
return std::make_unique<nofScout_Free>(pt, player, goal);
134123
throw std::runtime_error("Invalid goal type: " + helpers::toString(goal->GetGOT()) + " for job "
135124
+ helpers::toString(job_id));
136-
case Job::Miner:
137-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
138-
return std::make_unique<nofMiner>(pt, player, static_cast<nobUsual*>(goal));
139-
case Job::Farmer:
140-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
141-
return std::make_unique<nofFarmer>(pt, player, static_cast<nobUsual*>(goal));
142-
case Job::Forester:
143-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
144-
return std::make_unique<nofForester>(pt, player, static_cast<nobUsual*>(goal));
145-
case Job::Woodcutter:
146-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
147-
return std::make_unique<nofWoodcutter>(pt, player, static_cast<nobUsual*>(goal));
148-
case Job::PigBreeder:
149-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
150-
return std::make_unique<nofPigbreeder>(pt, player, static_cast<nobUsual*>(goal));
125+
case Job::Miner: return std::make_unique<nofMiner>(pt, player, staticCastAndAssertCorrectType(goal));
126+
case Job::Farmer: return std::make_unique<nofFarmer>(pt, player, staticCastAndAssertCorrectType(goal));
127+
case Job::Forester: return std::make_unique<nofForester>(pt, player, staticCastAndAssertCorrectType(goal));
128+
case Job::Woodcutter: return std::make_unique<nofWoodcutter>(pt, player, staticCastAndAssertCorrectType(goal));
129+
case Job::PigBreeder: return std::make_unique<nofPigbreeder>(pt, player, staticCastAndAssertCorrectType(goal));
151130
case Job::DonkeyBreeder:
152-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
153-
return std::make_unique<nofDonkeybreeder>(pt, player, static_cast<nobUsual*>(goal));
154-
case Job::Hunter:
155-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
156-
return std::make_unique<nofHunter>(pt, player, static_cast<nobUsual*>(goal));
157-
case Job::Fisher:
158-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
159-
return std::make_unique<nofFisher>(pt, player, static_cast<nobUsual*>(goal));
131+
return std::make_unique<nofDonkeybreeder>(pt, player, staticCastAndAssertCorrectType(goal));
132+
case Job::Hunter: return std::make_unique<nofHunter>(pt, player, staticCastAndAssertCorrectType(goal));
133+
case Job::Fisher: return std::make_unique<nofFisher>(pt, player, staticCastAndAssertCorrectType(goal));
160134
case Job::Private:
161135
case Job::PrivateFirstClass:
162136
case Job::Sergeant:
@@ -167,30 +141,16 @@ std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint
167141
return std::make_unique<nofPassiveSoldier>(pt, player, static_cast<nobBaseMilitary*>(goal), nullptr,
168142
getSoldierRank(job_id));
169143
case Job::PackDonkey: return std::make_unique<nofCarrier>(CarrierType::Donkey, pt, player, nullptr, goal);
170-
case Job::Shipwright:
171-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
172-
return std::make_unique<nofShipWright>(pt, player, static_cast<nobUsual*>(goal));
173-
case Job::CharBurner:
174-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
175-
return std::make_unique<nofCharburner>(pt, player, static_cast<nobUsual*>(goal));
176-
case Job::Winegrower:
177-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
178-
return std::make_unique<nofWinegrower>(pt, player, static_cast<nobUsual*>(goal));
179-
case Job::Vintner:
180-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
181-
return std::make_unique<nofVintner>(pt, player, static_cast<nobUsual*>(goal));
144+
case Job::Shipwright: return std::make_unique<nofShipWright>(pt, player, staticCastAndAssertCorrectType(goal));
145+
case Job::CharBurner: return std::make_unique<nofCharburner>(pt, player, staticCastAndAssertCorrectType(goal));
146+
case Job::Winegrower: return std::make_unique<nofWinegrower>(pt, player, staticCastAndAssertCorrectType(goal));
147+
case Job::Vintner: return std::make_unique<nofVintner>(pt, player, staticCastAndAssertCorrectType(goal));
182148
case Job::TempleServant:
183-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
184-
return std::make_unique<nofTempleServant>(pt, player, static_cast<nobUsual*>(goal));
185-
case Job::Skinner:
186-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
187-
return std::make_unique<nofSkinner>(pt, player, static_cast<nobUsual*>(goal));
188-
case Job::Tanner:
189-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
190-
return std::make_unique<nofTanner>(pt, player, static_cast<nobUsual*>(goal));
149+
return std::make_unique<nofTempleServant>(pt, player, staticCastAndAssertCorrectType(goal));
150+
case Job::Skinner: return std::make_unique<nofSkinner>(pt, player, staticCastAndAssertCorrectType(goal));
151+
case Job::Tanner: return std::make_unique<nofTanner>(pt, player, staticCastAndAssertCorrectType(goal));
191152
case Job::LeatherWorker:
192-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
193-
return std::make_unique<nofLeatherWorker>(pt, player, static_cast<nobUsual*>(goal));
153+
return std::make_unique<nofLeatherWorker>(pt, player, staticCastAndAssertCorrectType(goal));
194154
case Job::BoatCarrier:
195155
throw std::logic_error("Cannot create a boat carrier job (try creating Job::Helper).");
196156
break;

0 commit comments

Comments
 (0)