]> git.mxchange.org Git - flightgear.git/blobdiff - src/Airports/dynamics.cxx
Interim windows build fix
[flightgear.git] / src / Airports / dynamics.cxx
index 5916c68b0645080e0933249d3833bb040bfb7cb7..fae2add25c63734d2089921d669006b78a0a2d00 100644 (file)
@@ -40,6 +40,7 @@
 #include <Main/fg_props.hxx>
 #include <Main/locale.hxx>
 #include <Airports/runways.hxx>
+#include <Airports/groundnetwork.hxx>
 #include <Navaids/NavDataCache.hxx>
 
 #include "airport.hxx"
@@ -53,19 +54,19 @@ using std::random_shuffle;
 class ParkingAssignment::ParkingAssignmentPrivate
 {
 public:
-  ParkingAssignmentPrivate(FGParking* pk, FGAirport* apt) :
+  ParkingAssignmentPrivate(FGParking* pk, FGAirportDynamics* dyn) :
     refCount(0),
     parking(pk),
-    airport(apt)
+    dynamics(dyn)
   {
     assert(pk);
-    assert(apt);
+    assert(dyn);
     retain(); // initial count of 1
   }
   
   ~ParkingAssignmentPrivate()
   {
-    airport->getDynamics()->releaseParking(parking->guid());
+    dynamics->releaseParking(parking);
   }
   
   void release()
@@ -81,8 +82,8 @@ public:
   }
   
   unsigned int refCount;
-  SGSharedPtr<FGParking> parking;
-  SGSharedPtr<FGAirport> airport;
+  FGParkingRef parking;
+  FGAirportDynamicsRef dynamics;
 };
 
 ParkingAssignment::ParkingAssignment() :
@@ -97,11 +98,11 @@ ParkingAssignment::~ParkingAssignment()
   }
 }
   
-ParkingAssignment::ParkingAssignment(FGParking* pk, FGAirport* apt) :
+ParkingAssignment::ParkingAssignment(FGParking* pk, FGAirportDynamics* dyn) :
   _sharedData(NULL)
 {
   if (pk) {
-    _sharedData = new ParkingAssignmentPrivate(pk, apt);
+    _sharedData = new ParkingAssignmentPrivate(pk, dyn);
   }
 }
 
@@ -159,48 +160,52 @@ FGAirportDynamics::FGAirportDynamics(FGAirport * ap):
 
 {
     lastUpdate = 0;
+    groundNetwork.reset(new FGGroundNetwork);
 }
 
 // Destructor
 FGAirportDynamics::~FGAirportDynamics()
 {
+    SG_LOG(SG_AI, SG_INFO, "destroyed dynamics for:" << _ap->ident());
 }
 
 
 // Initialization required after XMLRead
 void FGAirportDynamics::init()
 {
-    groundNetwork.init(_ap);
-    groundNetwork.setTowerController(&towerController);
-    
+
+    groundNetwork->init(this);
+    groundController.setTowerController(&towerController);
+    groundController.init(this);
 }
 
 FGParking* FGAirportDynamics::innerGetAvailableParking(double radius, const string & flType,
                                            const string & airline,
                                            bool skipEmptyAirlineCode)
 {
-  flightgear::NavDataCache* cache = flightgear::NavDataCache::instance();
-  BOOST_FOREACH(PositionedID pk, cache->findAirportParking(_ap->guid(), flType, radius)) {
-    if (!isParkingAvailable(pk)) {
-      continue;
-    }
-    
-    FGParking* parking = getParking(pk);
-    if (skipEmptyAirlineCode && parking->getCodes().empty()) {
-      continue;
-    }
-    
-    if (!airline.empty() && !parking->getCodes().empty()) {
-      if (parking->getCodes().find(airline, 0) == string::npos) {
-        continue;
-      }
+    const FGParkingList& parkings(groundNetwork->allParkings());
+    FGParkingList::const_iterator it;
+    for (it = parkings.begin(); it != parkings.end(); ++it) {
+        FGParkingRef parking = *it;
+        if (!isParkingAvailable(parking)) {
+          continue;
+        }
+
+        if (skipEmptyAirlineCode && parking->getCodes().empty()) {
+          continue;
+        }
+
+        if (!airline.empty() && !parking->getCodes().empty()) {
+          if (parking->getCodes().find(airline, 0) == string::npos) {
+            continue;
+          }
+        }
+
+        setParkingAvailable(parking, false);
+        return parking;
     }
-    
-    setParkingAvailable(pk, false);
-    return parking;
-  }
-  
-  return NULL;
+
+    return NULL;
 }
 
 ParkingAssignment FGAirportDynamics::getAvailableParking(double radius, const string & flType,
@@ -212,60 +217,48 @@ ParkingAssignment FGAirportDynamics::getAvailableParking(double radius, const st
   // most exact seach - airline codes must be present and match
   FGParking* result = innerGetAvailableParking(radius, flType, airline, true);
   if (result) {
-    return ParkingAssignment(result, _ap);
+    return ParkingAssignment(result, this);
   }
   
   // more tolerant - gates with empty airline codes are permitted
   result = innerGetAvailableParking(radius, flType, airline, false);
   if (result) {
-    return ParkingAssignment(result, _ap);
+    return ParkingAssignment(result, this);
   }
 
   // fallback - ignore the airline code entirely
   result = innerGetAvailableParking(radius, flType, string(), false);
-  return result ? ParkingAssignment(result, _ap) : ParkingAssignment();
-}
-
-FGParkingRef FGAirportDynamics::getParking(PositionedID id) const
-{
-  return FGPositioned::loadById<FGParking>(id);
-}
-
-string FGAirportDynamics::getParkingName(PositionedID id) const
-{
-  FGParking* p = getParking(id);
-  if (p) {
-    return p->getName();
-  }
-  
-  return string();
+  return result ? ParkingAssignment(result, this) : ParkingAssignment();
 }
 
 ParkingAssignment FGAirportDynamics::getParkingByName(const std::string& name) const
 {
-  PositionedID guid = flightgear::NavDataCache::instance()->airportItemWithIdent(parent()->guid(), FGPositioned::PARKING, name);
-  if (guid == 0) {
-    return ParkingAssignment();
-  }
-  
-  return ParkingAssignment(getParking(guid), _ap);
+    const FGParkingList& parkings(groundNetwork->allParkings());
+    FGParkingList::const_iterator it;
+    for (it = parkings.begin(); it != parkings.end(); ++it) {
+        if ((*it)->name() == name) {
+            return ParkingAssignment(*it, const_cast<FGAirportDynamics*>(this));
+        }
+    }
+
+  return ParkingAssignment();
 }
 
-void FGAirportDynamics::setParkingAvailable(PositionedID guid, bool available)
+void FGAirportDynamics::setParkingAvailable(FGParking* park, bool available)
 {
   if (available) {
-    releaseParking(guid);
+    releaseParking(park);
   } else {
-    occupiedParkings.insert(guid);
+    occupiedParkings.insert(park);
   }
 }
 
-bool FGAirportDynamics::isParkingAvailable(PositionedID parking) const
+bool FGAirportDynamics::isParkingAvailable(FGParking* parking) const
 {
   return (occupiedParkings.find(parking) == occupiedParkings.end());
 }
 
-void FGAirportDynamics::releaseParking(PositionedID id)
+void FGAirportDynamics::releaseParking(FGParking* id)
 {
   ParkingSet::iterator it = occupiedParkings.find(id);
   if (it == occupiedParkings.end()) {
@@ -275,6 +268,41 @@ void FGAirportDynamics::releaseParking(PositionedID id)
   occupiedParkings.erase(it);
 }
 
+class GetParkingsPredicate
+{
+    bool mustBeAvailable;
+    std::string type;
+    const FGAirportDynamics* dynamics;
+public:
+    GetParkingsPredicate(bool b, const std::string& ty, const FGAirportDynamics* dyn) :
+        mustBeAvailable(b),
+        type(ty),
+        dynamics(dyn)
+    {}
+
+    bool operator()(const FGParkingRef& park) const
+    {
+        if (!type.empty() && (park->getType() != type))
+            return true;
+
+        if (mustBeAvailable && !dynamics->isParkingAvailable(park)) {
+            return true;
+        }
+
+        return false;
+    }
+};
+
+FGParkingList FGAirportDynamics::getParkings(bool onlyAvailable, const std::string &type) const
+{
+    FGParkingList result(groundNetwork->allParkings());
+
+    GetParkingsPredicate pred(onlyAvailable, type, this);
+    FGParkingList::iterator it = std::remove_if(result.begin(), result.end(), pred);
+    result.erase(it, result.end());
+    return result;
+}
+
 void FGAirportDynamics::setRwyUse(const FGRunwayPreference & ref)
 {
     rwyPrefs = ref;
@@ -298,7 +326,7 @@ bool FGAirportDynamics::innerGetActiveRunway(const string & trafficType,
     RunwayGroup *currRunwayGroup = 0;
     int nrActiveRunways = 0;
     time_t dayStart = fgGetLong("/sim/time/utc/day-seconds");
-    if ((abs((long) (dayStart - lastUpdate)) > 600)
+    if ((std::abs((long) (dayStart - lastUpdate)) > 600)
         || trafficType != prevTrafficType) {
         landing.clear();
         takeoff.clear();