1 #include "Predicates.h"
2 
3 #include "Building.h"
4 #include "Fleet.h"
5 #include "Planet.h"
6 #include "Ship.h"
7 #include "System.h"
8 #include "Field.h"
9 #include "Fighter.h"
10 #include "UniverseObject.h"
11 
12 ////////////////////////////////////////////////
13 // UniverseObjectVisitor
14 ////////////////////////////////////////////////
~UniverseObjectVisitor()15 UniverseObjectVisitor::~UniverseObjectVisitor()
16 {}
17 
Visit(std::shared_ptr<UniverseObject> obj) const18 std::shared_ptr<UniverseObject> UniverseObjectVisitor::Visit(std::shared_ptr<UniverseObject> obj) const
19 { return nullptr; }
20 
Visit(std::shared_ptr<Building> obj) const21 std::shared_ptr<UniverseObject> UniverseObjectVisitor::Visit(std::shared_ptr<Building> obj) const
22 { return Visit(std::static_pointer_cast<UniverseObject>(obj)); }
23 
Visit(std::shared_ptr<Fleet> obj) const24 std::shared_ptr<UniverseObject> UniverseObjectVisitor::Visit(std::shared_ptr<Fleet> obj) const
25 { return Visit(std::static_pointer_cast<UniverseObject>(obj)); }
26 
Visit(std::shared_ptr<Planet> obj) const27 std::shared_ptr<UniverseObject> UniverseObjectVisitor::Visit(std::shared_ptr<Planet> obj) const
28 { return Visit(std::static_pointer_cast<UniverseObject>(obj)); }
29 
Visit(std::shared_ptr<Ship> obj) const30 std::shared_ptr<UniverseObject> UniverseObjectVisitor::Visit(std::shared_ptr<Ship> obj) const
31 { return Visit(std::static_pointer_cast<UniverseObject>(obj)); }
32 
Visit(std::shared_ptr<System> obj) const33 std::shared_ptr<UniverseObject> UniverseObjectVisitor::Visit(std::shared_ptr<System> obj) const
34 { return Visit(std::static_pointer_cast<UniverseObject>(obj)); }
35 
Visit(std::shared_ptr<Field> obj) const36 std::shared_ptr<UniverseObject> UniverseObjectVisitor::Visit(std::shared_ptr<Field> obj) const
37 { return Visit(std::static_pointer_cast<UniverseObject>(obj)); }
38 
Visit(std::shared_ptr<Fighter> obj) const39 std::shared_ptr<UniverseObject> UniverseObjectVisitor::Visit(std::shared_ptr<Fighter> obj) const
40 { return Visit(std::static_pointer_cast<UniverseObject>(obj)); }
41 
42 
43 ////////////////////////////////////////////////
44 // StationaryFleetVisitor
45 ////////////////////////////////////////////////
~StationaryFleetVisitor()46 StationaryFleetVisitor::~StationaryFleetVisitor()
47 {}
48 
StationaryFleetVisitor(int empire)49 StationaryFleetVisitor::StationaryFleetVisitor(int empire/* = ALL_EMPIRES*/) :
50     empire_id(empire)
51 {}
52 
Visit(std::shared_ptr<Fleet> obj) const53 std::shared_ptr<UniverseObject> StationaryFleetVisitor::Visit(std::shared_ptr<Fleet> obj) const {
54     if ((obj->FinalDestinationID() == INVALID_OBJECT_ID ||
55          obj->TravelRoute().empty()) &&
56         (empire_id == ALL_EMPIRES || (!obj->Unowned() && obj->Owner() == empire_id)))
57         return obj;
58     return nullptr;
59 }
60 
61 ////////////////////////////////////////////////
62 // OrderedMovingFleetVisitor
63 ////////////////////////////////////////////////
~OrderedMovingFleetVisitor()64 OrderedMovingFleetVisitor::~OrderedMovingFleetVisitor()
65 {}
66 
OrderedMovingFleetVisitor(int empire)67 OrderedMovingFleetVisitor::OrderedMovingFleetVisitor(int empire/* = ALL_EMPIRES*/) :
68     empire_id(empire)
69 {}
70 
Visit(std::shared_ptr<Fleet> obj) const71 std::shared_ptr<UniverseObject> OrderedMovingFleetVisitor::Visit(std::shared_ptr<Fleet> obj) const {
72     if (obj->FinalDestinationID() != INVALID_OBJECT_ID &&
73         !obj->TravelRoute().empty() &&
74         obj->SystemID() != INVALID_OBJECT_ID &&
75         (empire_id == ALL_EMPIRES || (!obj->Unowned() && obj->Owner() == empire_id)))
76         return obj;
77     return nullptr;
78 }
79 
80 ////////////////////////////////////////////////
81 // MovingFleetVisitor
82 ////////////////////////////////////////////////
~MovingFleetVisitor()83 MovingFleetVisitor::~MovingFleetVisitor()
84 {}
85 
MovingFleetVisitor(int empire)86 MovingFleetVisitor::MovingFleetVisitor(int empire/* = ALL_EMPIRES*/) :
87     empire_id(empire)
88 {}
89 
Visit(std::shared_ptr<Fleet> obj) const90 std::shared_ptr<UniverseObject> MovingFleetVisitor::Visit(std::shared_ptr<Fleet> obj) const {
91     if (obj->FinalDestinationID() != INVALID_OBJECT_ID &&
92         obj->SystemID() == INVALID_OBJECT_ID &&
93         (empire_id == ALL_EMPIRES || (!obj->Unowned() && obj->Owner() == empire_id)))
94         return obj;
95     return nullptr;
96 }
97 
98 ////////////////////////////////////////////////
99 // OwnedVisitor
100 ////////////////////////////////////////////////
OwnedVisitor(int empire)101 OwnedVisitor::OwnedVisitor(int empire) :
102     empire_id(empire)
103 {}
104 
105 OwnedVisitor::~OwnedVisitor() = default;
106 
Visit(std::shared_ptr<UniverseObject> obj) const107 std::shared_ptr<UniverseObject> OwnedVisitor::Visit(std::shared_ptr<UniverseObject> obj) const
108 {
109     if (obj->OwnedBy(empire_id))
110         return obj;
111     return nullptr;
112 }
113 
114 ////////////////////////////////////////////////
115 // HostileVisitor
116 ////////////////////////////////////////////////
HostileVisitor(int viewing_empire,int owning_empire)117 HostileVisitor::HostileVisitor(int viewing_empire, int owning_empire) :
118     viewing_empire_id(viewing_empire),
119     owning_empire_id(owning_empire)
120 {}
121 
122 HostileVisitor::~HostileVisitor() = default;
123 
Visit(std::shared_ptr<UniverseObject> obj) const124 std::shared_ptr<UniverseObject> HostileVisitor::Visit(std::shared_ptr<UniverseObject> obj) const
125 {
126     if (obj->HostileToEmpire(viewing_empire_id))
127         return obj;
128     return nullptr;
129 }
130