]> git.mxchange.org Git - flightgear.git/commitdiff
Add various helper filters, to make use of type-ranges, and reduce the need
authorjmt <jmt>
Thu, 8 Jan 2009 21:11:53 +0000 (21:11 +0000)
committerTim Moore <timoore@redhat.com>
Fri, 9 Jan 2009 23:07:01 +0000 (00:07 +0100)
to down-cast in filter implementations.

src/Airports/simple.cxx
src/Airports/simple.hxx
src/Environment/environment_ctrl.cxx
src/Instrumentation/marker_beacon.cxx
src/Instrumentation/mk_viii.cxx
src/Instrumentation/mk_viii.hxx
src/Navaids/navlist.cxx
src/Scripting/NasalSys.cxx

index 356b8dcc20c42e6fec42c9024ae480a0c731afef..02d7025b8c62c8c1ecd45270efed823d63ad7528 100644 (file)
@@ -249,13 +249,9 @@ FGAirport::HardSurfaceFilter::HardSurfaceFilter(double minLengthFt) :
 {
 }
       
-bool FGAirport::HardSurfaceFilter::pass(FGPositioned* aPos) const
+bool FGAirport::HardSurfaceFilter::passAirport(FGAirport* aApt) const
 {
-  if (aPos->type() != AIRPORT) {
-    return false; // exclude seaports and heliports as well, we need a runways
-  }
-   
-  return static_cast<FGAirport*>(aPos)->hasHardRunwayOfLengthFt(mMinLengthFt);
+  return aApt->hasHardRunwayOfLengthFt(mMinLengthFt);
 }
 
 FGAirport* FGAirport::findByIdent(const std::string& aIdent)
index 0a25f8d46249acf29132f1c3462d558719da9a0b..dc4d7c319a3e60891003b3d16cb20ef542b0b850 100644 (file)
@@ -104,17 +104,32 @@ public:
      {
      public:
        virtual bool pass(FGPositioned* aPos) const { 
-         Type ty(aPos->type());
-         return (ty >= AIRPORT) && (ty <= SEAPORT);
+         return passAirport(static_cast<FGAirport*>(aPos));
+       }
+       
+       virtual Type minType() const {
+         return AIRPORT;
+       }
+       
+       virtual Type maxType() const {
+         return SEAPORT;
+       }
+       
+       virtual bool passAirport(FGAirport* aApt) const {
+         return true;
        }
      };
      
-     class HardSurfaceFilter : public Filter
+     class HardSurfaceFilter : public AirportFilter
      {
      public:
        HardSurfaceFilter(double minLengthFt);
        
-       virtual bool pass(FGPositioned* aPos) const;
+       virtual bool passAirport(FGAirport* aApt) const;
+       
+       virtual Type maxType() const {
+         return AIRPORT;
+       }
      private:
        double mMinLengthFt;
      };
index 1331a2c325d3bc7475e17c405dc680a153993887..72f6f09794ecf07bb8f231056566abb10a2e8c27 100644 (file)
 
 using std::sort;
 
-class AirportWithMetar : public FGPositioned::Filter
+class AirportWithMetar : public FGAirport::AirportFilter
 {
 public:
-  virtual bool pass(FGPositioned* aPos) const
+  virtual bool passAirport(FGAirport* aApt) const
   {
-    if ((aPos->type() < FGPositioned::AIRPORT) || (aPos->type() > FGPositioned::SEAPORT)) {
-      return false;
-    }
-    
-    FGAirport* apt = static_cast<FGAirport*>(aPos);
-    return apt->getMetar();
+    return aApt->getMetar();
   }
 };
 \f
index e636704fb90ef686a7307f4bd9ec35ab074ce7dc..3662fcd1622f8b228310cce0c28b1380cc31f3ae 100644 (file)
@@ -250,11 +250,15 @@ static bool check_beacon_range( const SGGeod& pos,
 
 class BeaconFilter : public FGPositioned::Filter
 {
-public:
-  virtual bool pass(FGPositioned* aPos) const
-  {
-    return (aPos->type() >= FGPositioned::OM) && (aPos->type() <= FGPositioned::IM);
+public:  
+  virtual FGPositioned::Type minType() const {
+    return FGPositioned::OM;
   }
+
+  virtual FGPositioned::Type maxType()  const {
+    return FGPositioned::IM;
+  }
+
 };
 
 // Update current nav/adf radio stations based on current postition
index 50e1df1a75ec323c32597bd2166098ff9ccb593a..3bbdc4235d73c902f64e4300a0b5a7a3b27dff67 100755 (executable)
@@ -4254,13 +4254,9 @@ MK_VIII::Mode6Handler::test_airport (const FGAirport *airport)
   return false;
 }
 
-bool MK_VIII::Mode6Handler::AirportFilter::pass(FGPositioned* a) const
+bool MK_VIII::Mode6Handler::AirportFilter::passAirport(FGAirport* a) const
 {
-  if (a->type() != FGPositioned::AIRPORT) {
-    return false;
-  }
-    
-  bool ok = self->test_airport(static_cast<FGAirport*>(a));
+  bool ok = self->test_airport(a);
   return ok;
 }
 
@@ -4497,14 +4493,9 @@ MK_VIII::TCFHandler::select_runway (const FGAirport *airport)
   return _runway;
 }
 
-bool MK_VIII::TCFHandler::AirportFilter::pass(FGPositioned* aPos) const
+bool MK_VIII::TCFHandler::AirportFilter::passAirport(FGAirport* aApt) const
 {
-  if (aPos->type() != FGPositioned::AIRPORT) {
-    return false;
-  }
-  
-  FGAirport* apt = static_cast<FGAirport*>(aPos);
-  return apt->hasHardRunwayOfLengthFt(mk->conf.runway_database);
+  return aApt->hasHardRunwayOfLengthFt(mk->conf.runway_database);
 }
    
 void
index 249bdf023c5c19d45fceee34911c4c815f79479b..4db4b45cec27bcb3a4fb75808e6c4fa6ec03d864 100755 (executable)
@@ -1505,13 +1505,17 @@ private:
     unsigned int get_bank_angle_alerts ();
     void update_bank_angle ();
     
-    class AirportFilter : public FGPositioned::Filter
+    class AirportFilter : public FGAirport::AirportFilter
     {
     public: 
       AirportFilter(Mode6Handler *s)
         : self(s) {}
         
-      virtual bool pass(FGPositioned *a) const;
+      virtual bool passAirport(FGAirport *a) const;
+      
+      virtual FGPositioned::Type maxType() const {
+        return FGPositioned::AIRPORT;
+      }
       
     private:
       Mode6Handler* self;
@@ -1578,14 +1582,17 @@ private:
     bool is_tcf ();
     bool is_rfcf ();
 
-    class AirportFilter : public FGPositioned::Filter
+    class AirportFilter : public FGAirport::AirportFilter
     {
     public: 
       AirportFilter(MK_VIII *device)
         : mk(device) {}
         
-      virtual bool pass(FGPositioned *a) const;
+      virtual bool passAirport(FGAirport *a) const;
       
+      virtual FGPositioned::Type maxType() const {
+        return FGPositioned::AIRPORT;
+      }
     private:
       MK_VIII* mk;
     };
index 66d990d5cd987f0cda3aa54c03a4fe5c37595b13..f490521253300af170d352f8635a13845d590753 100644 (file)
@@ -74,9 +74,12 @@ FGNavRecord *FGNavList::findByFreq( double freq, const SGGeod& position)
 class VORNDBFilter : public FGPositioned::Filter
 {
 public:
-  virtual bool pass(FGPositioned* aPos) const
-  {
-    return (aPos->type() == FGPositioned::VOR) || (aPos->type() == FGPositioned::NDB);
+  virtual FGPositioned::Type minType() const {
+    return FGPositioned::VOR;
+  }
+
+  virtual FGPositioned::Type maxType()  const {
+    return FGPositioned::NDB;
   }
 };
 
index af2d51c662a319bd47e82f817b5cfc56cf59593f..1941712eca92487f1ccd2b8add2ea9a9fc0cadba 100644 (file)
@@ -497,19 +497,22 @@ static naRef f_geodinfo(naContext c, naRef me, int argc, naRef* args)
 #undef HASHSET
 }
 
-class AirportInfoFilter : public FGPositioned::Filter
+class AirportInfoFilter : public FGAirport::AirportFilter
 {
 public:
   AirportInfoFilter() :
     type(FGPositioned::AIRPORT)
   { }
   
-  virtual bool pass(FGPositioned* aPos) const
-  {
-    return (aPos->type() == type);
+  virtual FGPositioned::Type minType() const {
+    return type;
   }
   
-  FGPositioned::Type type;
+  virtual FGPositioned::Type maxType() const {
+    return type;
+  }
+  
+ FGPositioned::Type type;
 };
 
 // Returns data hash for particular or nearest airport of a <type>, or nil