Skip to content

Commit e6e734e

Browse files
ottmlFlow86
authored andcommitted
Add function to avoid code duplication
1 parent 23fad66 commit e6e734e

1 file changed

Lines changed: 33 additions & 68 deletions

File tree

libs/s25main/factories/JobFactory.cpp

Lines changed: 33 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@
4949
#include "nodeObjs/noFlag.h"
5050
#include <stdexcept>
5151

52+
namespace {
53+
nobUsual* staticCastAndAssertCorrectType(noRoadNode* const goal)
54+
{
55+
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
56+
return static_cast<nobUsual*>(goal);
57+
}
58+
} // namespace
59+
5260
std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint pt, const unsigned char player,
5361
noRoadNode* const goal)
5462
{
@@ -64,41 +72,22 @@ std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint
6472
case Job::Planer:
6573
RTTR_Assert(dynamic_cast<noBuildingSite*>(goal));
6674
return std::make_unique<nofPlaner>(pt, player, static_cast<noBuildingSite*>(goal));
67-
case Job::Carpenter:
68-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
69-
return std::make_unique<nofCarpenter>(pt, player, static_cast<nobUsual*>(goal));
70-
case Job::Armorer:
71-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
72-
return std::make_unique<nofArmorer>(pt, player, static_cast<nobUsual*>(goal));
73-
case Job::Stonemason:
74-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
75-
return std::make_unique<nofStonemason>(pt, player, static_cast<nobUsual*>(goal));
76-
case Job::Brewer:
77-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
78-
return std::make_unique<nofBrewer>(pt, player, static_cast<nobUsual*>(goal));
79-
case Job::Minter:
80-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
81-
return std::make_unique<nofMinter>(pt, player, static_cast<nobUsual*>(goal));
82-
case Job::Butcher:
83-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
84-
return std::make_unique<nofButcher>(pt, player, static_cast<nobUsual*>(goal));
75+
case Job::Carpenter: return std::make_unique<nofCarpenter>(pt, player, staticCastAndAssertCorrectType(goal));
76+
case Job::Armorer: return std::make_unique<nofArmorer>(pt, player, staticCastAndAssertCorrectType(goal));
77+
case Job::Stonemason: return std::make_unique<nofStonemason>(pt, player, staticCastAndAssertCorrectType(goal));
78+
case Job::Brewer: return std::make_unique<nofBrewer>(pt, player, staticCastAndAssertCorrectType(goal));
79+
case Job::Minter: return std::make_unique<nofMinter>(pt, player, staticCastAndAssertCorrectType(goal));
80+
case Job::Butcher: return std::make_unique<nofButcher>(pt, player, staticCastAndAssertCorrectType(goal));
8581
case Job::IronFounder:
86-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
87-
return std::make_unique<nofIronfounder>(pt, player, static_cast<nobUsual*>(goal));
88-
case Job::Miller:
89-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
90-
return std::make_unique<nofMiller>(pt, player, static_cast<nobUsual*>(goal));
82+
return std::make_unique<nofIronfounder>(pt, player, staticCastAndAssertCorrectType(goal));
83+
case Job::Miller: return std::make_unique<nofMiller>(pt, player, staticCastAndAssertCorrectType(goal));
9184
case Job::Metalworker:
92-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
93-
return std::make_unique<nofMetalworker>(pt, player, static_cast<nobUsual*>(goal));
94-
case Job::Baker:
95-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
96-
return std::make_unique<nofBaker>(pt, player, static_cast<nobUsual*>(goal));
85+
return std::make_unique<nofMetalworker>(pt, player, staticCastAndAssertCorrectType(goal));
86+
case Job::Baker: return std::make_unique<nofBaker>(pt, player, staticCastAndAssertCorrectType(goal));
9787
case Job::Helper:
9888
if(goal && goal->GetGOT() == GO_Type::NobUsual)
9989
{
100-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
101-
auto* goalBld = static_cast<nobUsual*>(goal);
90+
auto* goalBld = staticCastAndAssertCorrectType(goal);
10291
if(goalBld->GetBuildingType() == BuildingType::Well)
10392
return std::make_unique<nofWellguy>(pt, player, goalBld);
10493
else if(goalBld->GetBuildingType() == BuildingType::Catapult)
@@ -113,36 +102,20 @@ std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint
113102
// Different scout for lookout towers and free scouts
114103
if(goal->GetGOT() == GO_Type::NobUsual)
115104
{
116-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
117-
return std::make_unique<nofScout_LookoutTower>(pt, player, static_cast<nobUsual*>(goal));
105+
return std::make_unique<nofScout_LookoutTower>(pt, player, staticCastAndAssertCorrectType(goal));
118106
} else if(goal->GetGOT() == GO_Type::Flag)
119107
return std::make_unique<nofScout_Free>(pt, player, goal);
120108
throw std::runtime_error("Invalid goal type: " + helpers::toString(goal->GetGOT()) + " for job "
121109
+ helpers::toString(job_id));
122-
case Job::Miner:
123-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
124-
return std::make_unique<nofMiner>(pt, player, static_cast<nobUsual*>(goal));
125-
case Job::Farmer:
126-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
127-
return std::make_unique<nofFarmer>(pt, player, static_cast<nobUsual*>(goal));
128-
case Job::Forester:
129-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
130-
return std::make_unique<nofForester>(pt, player, static_cast<nobUsual*>(goal));
131-
case Job::Woodcutter:
132-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
133-
return std::make_unique<nofWoodcutter>(pt, player, static_cast<nobUsual*>(goal));
134-
case Job::PigBreeder:
135-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
136-
return std::make_unique<nofPigbreeder>(pt, player, static_cast<nobUsual*>(goal));
110+
case Job::Miner: return std::make_unique<nofMiner>(pt, player, staticCastAndAssertCorrectType(goal));
111+
case Job::Farmer: return std::make_unique<nofFarmer>(pt, player, staticCastAndAssertCorrectType(goal));
112+
case Job::Forester: return std::make_unique<nofForester>(pt, player, staticCastAndAssertCorrectType(goal));
113+
case Job::Woodcutter: return std::make_unique<nofWoodcutter>(pt, player, staticCastAndAssertCorrectType(goal));
114+
case Job::PigBreeder: return std::make_unique<nofPigbreeder>(pt, player, staticCastAndAssertCorrectType(goal));
137115
case Job::DonkeyBreeder:
138-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
139-
return std::make_unique<nofDonkeybreeder>(pt, player, static_cast<nobUsual*>(goal));
140-
case Job::Hunter:
141-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
142-
return std::make_unique<nofHunter>(pt, player, static_cast<nobUsual*>(goal));
143-
case Job::Fisher:
144-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
145-
return std::make_unique<nofFisher>(pt, player, static_cast<nobUsual*>(goal));
116+
return std::make_unique<nofDonkeybreeder>(pt, player, staticCastAndAssertCorrectType(goal));
117+
case Job::Hunter: return std::make_unique<nofHunter>(pt, player, staticCastAndAssertCorrectType(goal));
118+
case Job::Fisher: return std::make_unique<nofFisher>(pt, player, staticCastAndAssertCorrectType(goal));
146119
case Job::Private:
147120
case Job::PrivateFirstClass:
148121
case Job::Sergeant:
@@ -153,21 +126,13 @@ std::unique_ptr<noFigure> JobFactory::CreateJob(const Job job_id, const MapPoint
153126
return std::make_unique<nofPassiveSoldier>(pt, player, static_cast<nobBaseMilitary*>(goal), nullptr,
154127
getSoldierRank(job_id));
155128
case Job::PackDonkey: return std::make_unique<nofCarrier>(CarrierType::Donkey, pt, player, nullptr, goal);
156-
case Job::Shipwright:
157-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
158-
return std::make_unique<nofShipWright>(pt, player, static_cast<nobUsual*>(goal));
159-
case Job::CharBurner:
160-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
161-
return std::make_unique<nofCharburner>(pt, player, static_cast<nobUsual*>(goal));
162-
case Job::Winegrower:
163-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
164-
return std::make_unique<nofWinegrower>(pt, player, static_cast<nobUsual*>(goal));
165-
case Job::Vintner:
166-
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
167-
return std::make_unique<nofVintner>(pt, player, static_cast<nobUsual*>(goal));
129+
case Job::Shipwright: return std::make_unique<nofShipWright>(pt, player, staticCastAndAssertCorrectType(goal));
130+
case Job::CharBurner: return std::make_unique<nofCharburner>(pt, player, staticCastAndAssertCorrectType(goal));
131+
case Job::Winegrower: return std::make_unique<nofWinegrower>(pt, player, staticCastAndAssertCorrectType(goal));
132+
case Job::Vintner: return std::make_unique<nofVintner>(pt, player, staticCastAndAssertCorrectType(goal));
168133
case Job::TempleServant:
169134
RTTR_Assert(dynamic_cast<nobUsual*>(goal));
170-
return std::make_unique<nofTempleServant>(pt, player, static_cast<nobUsual*>(goal));
135+
return std::make_unique<nofTempleServant>(pt, player, staticCastAndAssertCorrectType(goal));
171136
case Job::BoatCarrier:
172137
throw std::logic_error("Cannot create a boat carrier job (try creating Job::Helper).");
173138
break;

0 commit comments

Comments
 (0)