From: <bi...@us...> - 2013-08-17 18:23:39
|
Revision: 6345 http://sourceforge.net/p/freeorion/code/6345 Author: bigjoe5 Date: 2013-08-17 18:23:36 +0000 (Sat, 17 Aug 2013) Log Message: ----------- - Removed all instances of needing to pass a TemporaryPtr of an object into it's own member function by using TemporaryFromThis() Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj.filters trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/Field.cpp trunk/FreeOrion/universe/Field.h trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/universe/ObjectMap.cpp trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/Planet.h trunk/FreeOrion/universe/Predicates.h trunk/FreeOrion/universe/Ship.cpp trunk/FreeOrion/universe/Ship.h trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h trunk/FreeOrion/universe/ValueRef.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -2229,7 +2229,7 @@ int planet_id = panel->PlanetID(); TemporaryPtr<const Planet> planet = GetPlanet(planet_id); - if (planet && planet->Accept(planet, *m_valid_selection_predicate)) { + if (planet && planet->Accept(*m_valid_selection_predicate)) { m_candidate_ids.insert(planet_id); //std::cout << " ... planet " << planet->ID() << " is a selection candidate" << std::endl; } else { Modified: trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj.filters =================================================================== --- trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj.filters 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/msvc2010/FreeOrion/FreeOrion.vcxproj.filters 2013-08-17 18:23:36 UTC (rev 6345) @@ -9,10 +9,6 @@ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions> </Filter> - <Filter Include="Resource Files"> - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> - </Filter> <Filter Include="Header Files\client"> <UniqueIdentifier>{b7e1ac2b-7eb2-497a-80b4-1b3c660e492a}</UniqueIdentifier> </Filter> @@ -55,6 +51,10 @@ <Filter Include="Source Files\PagedGeometry"> <UniqueIdentifier>{69c0d51a-2b2c-434a-9440-48242f0e5e58}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> + </Filter> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\client\ClientApp.h"> Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/server/ServerApp.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -2210,7 +2210,7 @@ // save for possible SitRep generation after moving... TemporaryPtr<Fleet> fleet = *it; if (fleet) - fleet->MovementPhase(fleet); + fleet->MovementPhase(); } // post-movement visibility update Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Building.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -41,18 +41,14 @@ UniverseObject::Init(); } -Building* Building::Clone(TemporaryPtr<const UniverseObject> obj, int empire_id) const { - if (this != obj) { - Logger().debugStream() << "Building::Clone passed a TemporaryPtr to an object other than this."; - } - +Building* Building::Clone(int empire_id) const { Visibility vis = GetUniverse().GetObjectVisibilityByEmpire(this->ID(), empire_id); if (!(vis >= VIS_BASIC_VISIBILITY && vis <= VIS_FULL_VISIBILITY)) return 0; Building* retval = new Building(); - retval->Copy(obj, empire_id); + retval->Copy(TemporaryFromThis(), empire_id); return retval; } @@ -114,13 +110,9 @@ return os.str(); } -TemporaryPtr<UniverseObject> Building::Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const { - if (this_obj != this) - return TemporaryPtr<UniverseObject>(); +TemporaryPtr<UniverseObject> Building::Accept(const UniverseObjectVisitor& visitor) const +{ return visitor.Visit(const_ptr_cast<Building>(TemporaryFromThis())); } - return visitor.Visit(const_ptr_cast<Building>(static_ptr_cast<const Building>(this_obj))); -} - void Building::SetPlanetID(int planet_id) { if (TemporaryPtr<Planet> planet = GetPlanet(m_planet_id)) planet->RemoveBuilding(this->ID()); Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Building.h 2013-08-17 18:23:36 UTC (rev 6345) @@ -32,7 +32,7 @@ int ProducedByEmpireID() const { return m_produced_by_empire_id; } ///< returns the empire ID of the empire that produced this building virtual TemporaryPtr<UniverseObject> - Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const; + Accept(const UniverseObjectVisitor& visitor) const; bool OrderedScrapped() const { return m_ordered_scrapped; } //@} @@ -66,10 +66,13 @@ template <class T> friend void boost::checked_delete(T* x); ~Building() {} - virtual Building* Clone(TemporaryPtr<const UniverseObject> obj, int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Building + virtual Building* Clone(int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Building //@} private: + TemporaryPtr<Building> TemporaryFromThis() { return static_ptr_cast<Building>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + TemporaryPtr<const Building> TemporaryFromThis() const { return static_ptr_cast<const Building>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + std::string m_building_type; int m_planet_id; bool m_ordered_scrapped; Modified: trunk/FreeOrion/universe/Field.cpp =================================================================== --- trunk/FreeOrion/universe/Field.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Field.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -60,18 +60,14 @@ UniverseObject::GetMeter(METER_SIZE)->Set(radius, radius); } -Field* Field::Clone(TemporaryPtr<const UniverseObject> obj, int empire_id) const { - if (this != obj) { - Logger().debugStream() << "Field::Clone passed a TemporaryPtr to an object other than this."; - } - +Field* Field::Clone(int empire_id) const { Visibility vis = GetUniverse().GetObjectVisibilityByEmpire(this->ID(), empire_id); if (!(vis >= VIS_BASIC_VISIBILITY && vis <= VIS_FULL_VISIBILITY)) return 0; Field* retval = new Field(); - retval->Copy(obj, empire_id); + retval->Copy(TemporaryFromThis(), empire_id); return retval; } @@ -127,13 +123,9 @@ return UserString(m_type_name); } -TemporaryPtr<UniverseObject> Field::Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const { - if (this_obj != this) - return TemporaryPtr<UniverseObject>(); +TemporaryPtr<UniverseObject> Field::Accept(const UniverseObjectVisitor& visitor) const +{ return visitor.Visit(const_ptr_cast<Field>(TemporaryFromThis())); } - return visitor.Visit(const_ptr_cast<Field>(static_ptr_cast<const Field>(this_obj))); -} - bool Field::InField(TemporaryPtr<const UniverseObject> obj) const { return obj && InField(obj->X(), obj->Y()); } Modified: trunk/FreeOrion/universe/Field.h =================================================================== --- trunk/FreeOrion/universe/Field.h 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Field.h 2013-08-17 18:23:36 UTC (rev 6345) @@ -24,7 +24,7 @@ const std::string& FieldTypeName() const { return m_type_name; } virtual TemporaryPtr<UniverseObject> - Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const; + Accept(const UniverseObjectVisitor& visitor) const; bool InField(TemporaryPtr<const UniverseObject> obj) const; bool InField(double x, double y) const; @@ -48,12 +48,15 @@ template <class T> friend void boost::checked_delete(T* x); ~Field() {} - virtual Field* Clone(TemporaryPtr<const UniverseObject> obj, int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Field + virtual Field* Clone(int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Field //@} private: virtual void ClampMeters(); + TemporaryPtr<Field> TemporaryFromThis() { return static_ptr_cast<Field>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + TemporaryPtr<const Field> TemporaryFromThis() const { return static_ptr_cast<const Field>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + std::string m_type_name; friend class boost::serialization::access; Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Fleet.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -44,18 +44,14 @@ SetOwner(owner); } -Fleet* Fleet::Clone(TemporaryPtr<const UniverseObject> obj, int empire_id) const { - if (this != obj) { - Logger().debugStream() << "Fleet::Clone passed a TemporaryPtr to an object other than this."; - } - +Fleet* Fleet::Clone(int empire_id) const { Visibility vis = GetUniverse().GetObjectVisibilityByEmpire(this->ID(), empire_id); if (!(vis >= VIS_BASIC_VISIBILITY && vis <= VIS_FULL_VISIBILITY)) return 0; Fleet* retval = new Fleet(); - retval->Copy(obj, empire_id); + retval->Copy(TemporaryFromThis(), empire_id); return retval; } @@ -643,13 +639,9 @@ return m_travel_route.size() == 1 && m_travel_route.front() == INVALID_OBJECT_ID; } -TemporaryPtr<UniverseObject> Fleet::Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const { - if (this_obj != this) - return TemporaryPtr<UniverseObject>(); +TemporaryPtr<UniverseObject> Fleet::Accept(const UniverseObjectVisitor& visitor) const +{ return visitor.Visit(const_ptr_cast<Fleet>(TemporaryFromThis())); } - return visitor.Visit(const_ptr_cast<Fleet>(static_ptr_cast<const Fleet>(this_obj))); -} - void Fleet::SetRoute(const std::list<int>& route) { //Logger().debugStream() << "Fleet::SetRoute() "; if (route.empty()) @@ -825,24 +817,18 @@ m_arrival_starlane = prev; // see comment for ArrivalStarlane() } -void Fleet::MovementPhase(TemporaryPtr<UniverseObject> obj) { +void Fleet::MovementPhase() { //Logger().debugStream() << "Fleet::MovementPhase this: " << this->Name() << " id: " << this->ID(); - TemporaryPtr<Fleet> fleet = dynamic_ptr_cast<Fleet>(obj); - if (fleet != this) { - Logger().errorStream() << "Fleet::MovementPhase was passed a TemporaryPtr different from itself."; - return; - } - - Empire* empire = Empires().Lookup(fleet->Owner()); + Empire* empire = Empires().Lookup(Owner()); std::set<int> supply_unobstructed_systems; if (empire) supply_unobstructed_systems.insert(empire->SupplyUnobstructedSystems().begin(), empire->SupplyUnobstructedSystems().end()); // if owner of fleet can resupply ships at the location of this fleet, then // resupply all ships in this fleet - if (empire && empire->SystemHasFleetSupply(fleet->SystemID())) { - for (Fleet::const_iterator ship_it = fleet->begin(); ship_it != fleet->end(); ++ship_it) { + if (empire && empire->SystemHasFleetSupply(SystemID())) { + for (Fleet::const_iterator ship_it = begin(); ship_it != end(); ++ship_it) { if (TemporaryPtr<Ship> ship = GetShip(*ship_it)) { ship->Resupply(); if (Meter* fuel_meter = ship->UniverseObject::GetMeter(METER_FUEL)) @@ -851,9 +837,9 @@ } } - TemporaryPtr<System> current_system = GetSystem(fleet->SystemID()); + TemporaryPtr<System> current_system = GetSystem(SystemID()); TemporaryPtr<const System> initial_system = current_system; - std::list<MovePathNode> move_path = fleet->MovePath(); + std::list<MovePathNode> move_path = MovePath(); std::list<MovePathNode>::const_iterator it = move_path.begin(); std::list<MovePathNode>::const_iterator next_it = it; if (next_it != move_path.end()) @@ -866,9 +852,9 @@ ///update m_arrival_starlane if no blockade, if needed // blockade debug logging //Logger().debugStream() << "Fleet::MovementPhase checking blockade for Fleet "<< ID() << " with m_arrival_lane "<<m_arrival_starlane<< " at current_system " << current_system->Name() << "("<<SystemID()<<")"; - if (supply_unobstructed_systems.find(fleet->SystemID()) != supply_unobstructed_systems.end()) { + if (supply_unobstructed_systems.find(SystemID()) != supply_unobstructed_systems.end()) { //Logger().debugStream() << "Fleet::MovementPhase clearing m_arrival_starlane for Fleet "<< ID() << " at current_system " << current_system->Name() << "("<<SystemID()<<")"; - fleet->m_arrival_starlane = fleet->SystemID();//allows departure via any starlane + m_arrival_starlane = SystemID();//allows departure via any starlane } // in a system. if there is no system after the current one in the // path, or the current and next nodes have the same system id, that @@ -879,22 +865,22 @@ } else if (it->object_id != INVALID_OBJECT_ID && it->object_id == next_it->object_id) { stopped = true; //Logger().debugStream() << "Fleet::MovementPhase stopping due to doubled system at start of path"; - } else if (fleet->m_arrival_starlane != fleet->SystemID()) { + } else if (m_arrival_starlane != SystemID()) { int next_sys_id; if (next_it->object_id != INVALID_OBJECT_ID) { next_sys_id = next_it->object_id; } else { next_sys_id = next_it->lane_end_id; } - stopped = fleet->BlockadedAtSystem(fleet->SystemID(), next_sys_id); + stopped = BlockadedAtSystem(SystemID(), next_sys_id); } if (stopped) { // fuel regeneration for ships in stationary fleet - if (fleet->FinalDestinationID() == INVALID_OBJECT_ID || - fleet->FinalDestinationID() == fleet->SystemID()) + if (FinalDestinationID() == INVALID_OBJECT_ID || + FinalDestinationID() == SystemID()) { - for (Fleet::const_iterator ship_it = fleet->begin(); ship_it != fleet->end(); ++ship_it) { + for (Fleet::const_iterator ship_it = begin(); ship_it != end(); ++ship_it) { if (TemporaryPtr<Ship> ship = GetShip(*ship_it)) if (Meter* fuel_meter = ship->UniverseObject::GetMeter(METER_FUEL)) { fuel_meter->AddToCurrent(0.1001f); @@ -904,8 +890,8 @@ } return; } else { - fleet->m_arrival_starlane = fleet->SystemID(); - fleet->m_prev_system = fleet->SystemID(); + m_arrival_starlane = SystemID(); + m_prev_system = SystemID(); } } @@ -939,10 +925,10 @@ // node is a system. explore system for all owners of this fleet if (empire) { empire->AddExploredSystem(it->object_id); - empire->RecordPendingLaneUpdate(it->object_id, fleet->m_prev_system); // specifies the lane from it->object_id back to m_prev_system is available + empire->RecordPendingLaneUpdate(it->object_id, m_prev_system); // specifies the lane from it->object_id back to m_prev_system is available } - fleet->m_prev_system = system->ID(); // passing a system, so update previous system of this fleet + m_prev_system = system->ID(); // passing a system, so update previous system of this fleet bool resupply_here = empire ? empire->SystemHasFleetSupply(system->ID()) : false; @@ -950,7 +936,7 @@ if (resupply_here) { //Logger().debugStream() << " ... node has fuel supply. consumed fuel for movement reset to 0 and fleet resupplied"; fuel_consumed = 0.0; - for (Fleet::const_iterator ship_it = fleet->begin(); ship_it != fleet->end(); ++ship_it) { + for (Fleet::const_iterator ship_it = begin(); ship_it != end(); ++ship_it) { TemporaryPtr<Ship> ship = GetShip(*ship_it); assert(ship); ship->Resupply(); @@ -959,12 +945,12 @@ if (node_is_next_stop) { // is system the last node reached this turn? - system->Insert(fleet); // fleet ends turn at this node. insert fleet into system + system->Insert(TemporaryFromThis()); // fleet ends turn at this node. insert fleet into system current_system = system; // blockade debug logging //Logger().debugStream() << "Fleet::MovementPhase checking blockade for Fleet "<< ID() << " with m_arrival_lane "<<m_arrival_starlane<< " at next stop node system " << current_system->Name() << "("<<SystemID()<<")"; - if (supply_unobstructed_systems.find(fleet->SystemID()) != supply_unobstructed_systems.end()) { - fleet->m_arrival_starlane = fleet->SystemID();//allows departure via any starlane + if (supply_unobstructed_systems.find(SystemID()) != supply_unobstructed_systems.end()) { + m_arrival_starlane = SystemID();//allows departure via any starlane //Logger().debugStream() << "Fleet::MovementPhase clearing m_arrival_starlane for Fleet "<< ID() << " at (next stop node) system " << system->Name() << "("<<system->ID()<<")"; } //Logger().debugStream() << "... ... inserted fleet into system"; @@ -972,7 +958,7 @@ } else { // fleet will continue past this system this turn. //Logger().debugStream() << "... ... moved fleet to system (not inserted)"; - fleet->m_arrival_starlane = fleet->m_prev_system; + m_arrival_starlane = m_prev_system; //Logger().debugStream() << "Fleet::MovementPhase setting m_arrival_starlane for Fleet "<< ID() << " to system just passed: " << system->Name() << "("<<system->ID()<<")"; if (!resupply_here) { fuel_consumed += 1.0; @@ -984,10 +970,10 @@ } else { // node is not a system. - fleet->m_arrival_starlane = fleet->m_prev_system; + m_arrival_starlane = m_prev_system; //Logger().debugStream() << "Fleet::MovementPhase setting m_arrival_starlane for Fleet "<< ID() << " mid starlane from system ID " << m_prev_system; if (node_is_next_stop) { // node is not a system, but is it the last node reached this turn? - fleet->MoveTo(it->x, it->y); // fleet ends turn at this node. move fleet here + MoveTo(it->x, it->y); // fleet ends turn at this node. move fleet here //Logger().debugStream() << "... ... moved fleet to position"; break; } @@ -1000,26 +986,26 @@ // Logger().debugStream() << "... (" << it2->x << ", " << it2->y << ") at object id: " << it2->object_id << " eta: " << it2->eta << (it2->turn_end ? " (end of turn)" : " (during turn)"); // update next system - if (fleet->m_moving_to != fleet->SystemID() && next_it != move_path.end() && it != move_path.end()) { + if (m_moving_to != SystemID() && next_it != move_path.end() && it != move_path.end()) { // there is another system later on the path to aim for. find it for (; next_it != move_path.end(); ++next_it) { if (GetSystem(next_it->object_id)) { //Logger().debugStream() << "___ setting m_next_system to " << next_it->object_id; - fleet->m_next_system = next_it->object_id; + m_next_system = next_it->object_id; break; } } } else { // no more systems on path - fleet->m_arrived_this_turn = current_system != initial_system; - fleet->m_moving_to = fleet->m_next_system = fleet->m_prev_system = INVALID_OBJECT_ID; + m_arrived_this_turn = current_system != initial_system; + m_moving_to = m_next_system = m_prev_system = INVALID_OBJECT_ID; } // consume fuel from ships in fleet if (fuel_consumed > 0.0) { - for (Fleet::const_iterator ship_it = fleet->begin(); ship_it != fleet->end(); ++ship_it) + for (Fleet::const_iterator ship_it = begin(); ship_it != end(); ++ship_it) if (TemporaryPtr<Ship> ship = GetShip(*ship_it)) if (Meter* meter = ship->UniverseObject::GetMeter(METER_FUEL)) { meter->AddToCurrent(-fuel_consumed); Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Fleet.h 2013-08-17 18:23:36 UTC (rev 6345) @@ -100,7 +100,7 @@ * break a blockade unless you beat the blockaders (via combat or they retreat).**/ int ArrivalStarlane() const { return m_arrival_starlane; } - virtual TemporaryPtr<UniverseObject>Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const; + virtual TemporaryPtr<UniverseObject>Accept(const UniverseObjectVisitor& visitor) const; //@} /** \name Mutators */ //@{ @@ -111,7 +111,7 @@ void SetAggressive(bool aggressive = true); ///< sets this fleet to be agressive (true) or passive (false) - virtual void MovementPhase(TemporaryPtr<UniverseObject> obj); + virtual void MovementPhase(); void AddShip(int ship_id); ///< adds the ship to the fleet void AddShips(const std::vector<int>& ship_ids); ///< adds the ships to the fleet @@ -156,7 +156,7 @@ template <class T> friend void boost::checked_delete(T* x); ~Fleet() {} - virtual Fleet* Clone(TemporaryPtr<const UniverseObject> obj, int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Fleet + virtual Fleet* Clone(int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Fleet //@} private: @@ -166,6 +166,9 @@ ///< returns the subset of m_ships that is visible to empire with id \a empire_id ShipIDSet VisibleContainedObjects(int empire_id) const; + TemporaryPtr<Fleet> TemporaryFromThis() { return static_ptr_cast<Fleet>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + TemporaryPtr<const Fleet> TemporaryFromThis() const { return static_ptr_cast<const Fleet>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + ShipIDSet m_ships; int m_moving_to; Modified: trunk/FreeOrion/universe/ObjectMap.cpp =================================================================== --- trunk/FreeOrion/universe/ObjectMap.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/ObjectMap.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -128,7 +128,7 @@ std::vector<TemporaryPtr<const UniverseObject> > ObjectMap::FindObjects(const UniverseObjectVisitor& visitor) const { std::vector<TemporaryPtr<const UniverseObject> > result; for (const_iterator<> it = const_begin(); it != const_end(); ++it) { - if (TemporaryPtr<UniverseObject> obj = it->Accept(*it, visitor)) + if (TemporaryPtr<UniverseObject> obj = it->Accept(visitor)) result.push_back(Object(obj->ID())); } return result; @@ -137,7 +137,7 @@ std::vector<TemporaryPtr<UniverseObject> > ObjectMap::FindObjects(const UniverseObjectVisitor& visitor) { std::vector<TemporaryPtr<UniverseObject> > result; for (iterator<> it = begin(); it != end(); ++it) { - if (TemporaryPtr<UniverseObject> obj = it->Accept(*it, visitor)) + if (TemporaryPtr<UniverseObject> obj = it->Accept(visitor)) result.push_back(Object(obj->ID())); } return result; @@ -146,7 +146,7 @@ std::vector<int> ObjectMap::FindObjectIDs(const UniverseObjectVisitor& visitor) const { std::vector<int> result; for (const_iterator<> it = const_begin(); it != const_end(); ++it) { - if (it->Accept(*it, visitor)) + if (it->Accept(visitor)) result.push_back(it->ID()); } return result; Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Planet.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -102,18 +102,14 @@ m_rotational_period = -m_rotational_period; } -Planet* Planet::Clone(TemporaryPtr<const UniverseObject> obj, int empire_id) const { - if (this != obj) { - Logger().debugStream() << "Planet::Clone passed a TemporaryPtr to an object other than this."; - } - +Planet* Planet::Clone(int empire_id) const { Visibility vis = GetUniverse().GetObjectVisibilityByEmpire(this->ID(), empire_id); if (!(vis >= VIS_BASIC_VISIBILITY && vis <= VIS_FULL_VISIBILITY)) return 0; Planet* retval = new Planet(); - retval->Copy(obj, empire_id); + retval->Copy(TemporaryFromThis(), empire_id); return retval; } @@ -435,13 +431,9 @@ return retval; } -TemporaryPtr<UniverseObject> Planet::Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const { - if (this_obj != this) - return TemporaryPtr<UniverseObject>(); +TemporaryPtr<UniverseObject> Planet::Accept(const UniverseObjectVisitor& visitor) const +{ return visitor.Visit(const_ptr_cast<Planet>(TemporaryFromThis())); } - return visitor.Visit(const_ptr_cast<Planet>(static_ptr_cast<const Planet>(this_obj))); -} - Meter* Planet::GetMeter(MeterType type) { return UniverseObject::GetMeter(type); } Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Planet.h 2013-08-17 18:23:36 UTC (rev 6345) @@ -125,7 +125,7 @@ int LastTurnAttackedByShip() const { return m_last_turn_attacked_by_ship; } virtual TemporaryPtr<UniverseObject> - Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const; + Accept(const UniverseObjectVisitor& visitor) const; virtual float InitialMeterValue(MeterType type) const; virtual float CurrentMeterValue(MeterType type) const; @@ -182,7 +182,7 @@ template <class T> friend void boost::checked_delete(T* x); ~Planet() {} - virtual Planet* Clone(TemporaryPtr<const UniverseObject> obj, int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Planet + virtual Planet* Clone(int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Planet //@} private: @@ -198,6 +198,9 @@ std::set<int> VisibleContainedObjects(int empire_id) const; ///< returns the subset of m_buildings that is visible to empire with id \a empire_id + TemporaryPtr<Planet> TemporaryFromThis() { return static_ptr_cast<Planet>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + TemporaryPtr<const Planet> TemporaryFromThis() const { return static_ptr_cast<const Planet>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + PlanetType m_type; PlanetType m_original_type; PlanetSize m_size; Modified: trunk/FreeOrion/universe/Predicates.h =================================================================== --- trunk/FreeOrion/universe/Predicates.h 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Predicates.h 2013-08-17 18:23:36 UTC (rev 6345) @@ -114,7 +114,7 @@ typedef UniverseObjectSubclassVisitor<T1ConstFreeType> VisitorType; - return static_ptr_cast<T1ConstFreeType>(ptr->Accept(ptr, VisitorType())); + return static_ptr_cast<T1ConstFreeType>(ptr->Accept(VisitorType())); } template <class T> Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Ship.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -108,18 +108,14 @@ } } -Ship* Ship::Clone(TemporaryPtr<const UniverseObject> obj, int empire_id) const { - if (this != obj) { - Logger().debugStream() << "Ship::Clone passed a TemporaryPtr to an object other than this."; - } - +Ship* Ship::Clone(int empire_id) const { Visibility vis = GetUniverse().GetObjectVisibilityByEmpire(this->ID(), empire_id); if (!(vis >= VIS_BASIC_VISIBILITY && vis <= VIS_FULL_VISIBILITY)) return 0; Ship* retval = new Ship(); - retval->Copy(obj, empire_id); + retval->Copy(TemporaryFromThis(), empire_id); return retval; } @@ -325,13 +321,9 @@ return UserString("SHIP"); } -TemporaryPtr<UniverseObject> Ship::Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const { - if (this_obj != this) - return TemporaryPtr<UniverseObject>(); +TemporaryPtr<UniverseObject> Ship::Accept(const UniverseObjectVisitor& visitor) const +{ return visitor.Visit(const_ptr_cast<Ship>(TemporaryFromThis())); } - return visitor.Visit(const_ptr_cast<Ship>(static_ptr_cast<const Ship>(this_obj))); -} - float Ship::NextTurnCurrentMeterValue(MeterType type) const { //if (type == METER_FUEL) { // // todo: consider fleet movement or being stationary, which may partly replenish fuel Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Ship.h 2013-08-17 18:23:36 UTC (rev 6345) @@ -47,7 +47,7 @@ const ConsumablesMap& Missiles() const { return m_missiles; } virtual TemporaryPtr<UniverseObject> - Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const; + Accept(const UniverseObjectVisitor& visitor) const; virtual float NextTurnCurrentMeterValue(MeterType type) const; ///< returns expected value of specified meter current value on the next turn @@ -103,7 +103,7 @@ template <class T> friend void boost::checked_delete(T* x); ~Ship() {} - virtual Ship* Clone(TemporaryPtr<const UniverseObject> obj, int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Ship + virtual Ship* Clone(int empire_id = ALL_EMPIRES) const; ///< returns new copy of this Ship //@} @@ -111,6 +111,9 @@ virtual void PopGrowthProductionResearchPhase(); virtual void ClampMeters(); + TemporaryPtr<Ship> TemporaryFromThis() { return static_ptr_cast<Ship>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + TemporaryPtr<const Ship> TemporaryFromThis() const { return static_ptr_cast<const Ship>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + int m_design_id; int m_fleet_id; bool m_ordered_scrapped; Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/System.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -62,18 +62,14 @@ UniverseObject::Init(); } -System* System::Clone(TemporaryPtr<const UniverseObject> obj, int empire_id) const { - if (this != obj) { - Logger().debugStream() << "System::Clone passed a TemporaryPtr to an object other than this."; - } - +System* System::Clone(int empire_id) const { Visibility vis = GetUniverse().GetObjectVisibilityByEmpire(this->ID(), empire_id); if (!(vis >= VIS_BASIC_VISIBILITY && vis <= VIS_FULL_VISIBILITY)) return 0; System* retval = new System(); - retval->Copy(obj, empire_id); + retval->Copy(TemporaryFromThis(), empire_id); return retval; } @@ -296,7 +292,7 @@ std::vector<int> retval; for (ObjectMultimap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { if (TemporaryPtr<const UniverseObject> obj = GetUniverseObject(it->second)) { - if (obj->Accept(obj, visitor)) + if (obj->Accept(visitor)) retval.push_back(it->second); } else { Logger().errorStream() << "System::FindObjectIDs couldn't get Object with ID " << it->second; @@ -310,7 +306,7 @@ std::pair<ObjectMultimap::const_iterator, ObjectMultimap::const_iterator> range = m_objects.equal_range(orbit); for (ObjectMultimap::const_iterator it = range.first; it != range.second; ++it) { if (TemporaryPtr<const UniverseObject> obj = GetUniverseObject(it->second)) { - if (obj->Accept(obj, visitor)) + if (obj->Accept(visitor)) retval.push_back(it->second); } else { Logger().errorStream() << "System::FindObjectIDsInOrbit couldn't get Object with ID " << it->second; @@ -341,13 +337,9 @@ System::const_lane_iterator System::end_lanes() const { return m_starlanes_wormholes.end(); } -TemporaryPtr<UniverseObject> System::Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const { - if (this_obj != this) - return TemporaryPtr<UniverseObject>(); +TemporaryPtr<UniverseObject> System::Accept(const UniverseObjectVisitor& visitor) const +{ return visitor.Visit(const_ptr_cast<System>(TemporaryFromThis())); } - return visitor.Visit(const_ptr_cast<System>(static_ptr_cast<const System>(this_obj))); -} - int System::Insert(TemporaryPtr<UniverseObject> obj) { return Insert(obj, -1); } Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/System.h 2013-08-17 18:23:36 UTC (rev 6345) @@ -101,7 +101,7 @@ int LastTurnBattleHere() const { return m_last_turn_battle_here; } virtual TemporaryPtr<UniverseObject> - Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const; + Accept(const UniverseObjectVisitor& visitor) const; const std::string& OverlayTexture() const { return m_overlay_texture; } double OverlaySize() const { return m_overlay_size; } ///< size in universe @@ -185,7 +185,7 @@ template <class T> friend void boost::checked_delete(T* x); ~System() {} - virtual System* Clone(TemporaryPtr<const UniverseObject> obj, int empire_id = ALL_EMPIRES) const; ///< returns new copy of this System + virtual System* Clone(int empire_id = ALL_EMPIRES) const; ///< returns new copy of this System //@} private: @@ -196,6 +196,9 @@ /** removes object \a obj from this system. */ void Remove(TemporaryPtr<UniverseObject> obj); + TemporaryPtr<System> TemporaryFromThis() { return static_ptr_cast<System>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + TemporaryPtr<const System> TemporaryFromThis() const { return static_ptr_cast<const System>(EnableTemporaryFromThis<UniverseObject>::TemporaryFromThis()); } + StarType m_star; int m_orbits; ObjectMultimap m_objects; ///< each key value represents an orbit (-1 represents general system contents not in any orbit); there may be many or no objects at each orbit (including -1) @@ -252,7 +255,7 @@ std::vector<int> retval; for (ObjectMultimap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { if (TemporaryPtr<const UniverseObject> obj = GetUniverseObject(it->second)) - if (obj->Accept(obj, UniverseObjectSubclassVisitor<typename boost::remove_const<T>::type>())) + if (obj->Accept(UniverseObjectSubclassVisitor<typename boost::remove_const<T>::type>())) retval.push_back(it->second); } return retval; @@ -264,7 +267,7 @@ std::pair<ObjectMultimap::const_iterator, ObjectMultimap::const_iterator> range = m_objects.equal_range(orbit); for (ObjectMultimap::const_iterator it = range.first; it != range.second; ++it) { if (TemporaryPtr<const UniverseObject> obj = GetUniverseObject(it->second)) - if (obj->Accept(obj, UniverseObjectSubclassVisitor<typename boost::remove_const<T>::type>())) + if (obj->Accept(UniverseObjectSubclassVisitor<typename boost::remove_const<T>::type>())) retval.push_back(it->second); } return retval; Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/Universe.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -2385,7 +2385,7 @@ if (TemporaryPtr<UniverseObject> known_obj = known_object_map.Object(object_id)) { known_obj->Copy(full_object, empire_id); // already a stored version of this object for this empire. update it, limited by visibility this empire has for this object this turn } else { - if (UniverseObject* new_obj = full_object->Clone(full_object, empire_id)) // no previously-recorded version of this object for this empire. create a new one, copying only the information limtied by visibility, leaving the rest as default values + if (UniverseObject* new_obj = full_object->Clone(empire_id)) // no previously-recorded version of this object for this empire. create a new one, copying only the information limtied by visibility, leaving the rest as default values known_object_map.Insert(new_obj); } Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -246,13 +246,9 @@ const std::string& UniverseObject::PublicName(int empire_id) const { return m_name; } -TemporaryPtr<UniverseObject> UniverseObject::Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const { - if (this_obj != this) - return TemporaryPtr<UniverseObject>(); +TemporaryPtr<UniverseObject> UniverseObject::Accept(const UniverseObjectVisitor& visitor) const +{ return visitor.Visit(const_ptr_cast<UniverseObject>(TemporaryFromThis())); } - return visitor.Visit(const_ptr_cast<UniverseObject>(this_obj)); -} - void UniverseObject::SetID(int id) { m_id = id; StateChangedSignal(); Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/UniverseObject.h 2013-08-17 18:23:36 UTC (rev 6345) @@ -6,6 +6,7 @@ #include "Enums.h" #include "TemporaryPtr.h" +#include "Predicates.h" #include "EnableTemporaryFromThis.h" #include "../util/Export.h" @@ -85,8 +86,7 @@ virtual const std::string& PublicName(int empire_id) const; ///< returns the name of this objectas it appears to empire \a empire_id /** accepts a visitor object \see UniverseObjectVisitor */ - virtual TemporaryPtr<UniverseObject> - Accept(TemporaryPtr<const UniverseObject> this_obj, const UniverseObjectVisitor& visitor) const; + virtual TemporaryPtr<UniverseObject> Accept(const UniverseObjectVisitor& visitor) const; int CreationTurn() const; ///< returns game turn on which object was created int AgeInTurns() const; ///< returns elapsed number of turns between turn object was created and current game turn @@ -133,7 +133,7 @@ /** Performs the movement that this object is responsible for this object's * actions during the movement phase of a turn. */ - virtual void MovementPhase(TemporaryPtr<UniverseObject> obj) {}; + virtual void MovementPhase() {}; /** Sets current value of max, target and unpaired meters in in this * UniverseObject to Meter::DEFAULT_VALUE. This should be done before any @@ -173,7 +173,7 @@ * is visible to the empire with the specified \a empire_id as determined * by the detection and visibility system. Caller takes ownership of * returned pointee. */ - virtual UniverseObject* Clone(TemporaryPtr<const UniverseObject> obj, int empire_id = ALL_EMPIRES) const = 0; + virtual UniverseObject* Clone(int empire_id = ALL_EMPIRES) const = 0; //@} void AddMeter(MeterType meter_type); ///< inserts a meter into object as the \a meter_type meter. Should be used by derived classes to add their specialized meters to objects Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2013-08-17 04:18:08 UTC (rev 6344) +++ trunk/FreeOrion/universe/ValueRef.cpp 2013-08-17 18:23:36 UTC (rev 6345) @@ -386,7 +386,7 @@ return INVALID_UNIVERSE_OBJECT_TYPE; } ObjectTypeVisitor v; - if (object->Accept(object, v)) + if (object->Accept(v)) return v.m_type; else if (dynamic_ptr_cast<const PopCenter>(object)) return OBJ_POP_CENTER; |