]> git.mxchange.org Git - flightgear.git/blobdiff - src/Airports/simple.cxx
Fix for a premature deletion bug. The _arg SGPropertyNode* is passed
[flightgear.git] / src / Airports / simple.cxx
index c31cce339a00305a40e2102e9e25e280db325d49..ab3b47baf97de74471856feaf2eb147b50c9ddba 100644 (file)
@@ -1,7 +1,7 @@
 //
 // simple.cxx -- a really simplistic class to manage airport ID,
-//                 lat, lon of the center of one of it's runways, and 
-//                 elevation in feet.
+//               lat, lon of the center of one of it's runways, and 
+//               elevation in feet.
 //
 // Written by Curtis Olson, started April 1998.
 //
 //
 // $Id$
 
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
 
 #include <simgear/compiler.h>
 
-#include <simgear/logstream.hxx>
-#include <simgear/fgpath.hxx>
-#include <simgear/fgstream.hxx>
-
-#include <Main/options.hxx>
+#include <simgear/debug/logstream.hxx>
+#include <simgear/misc/sgstream.hxx>
 
 #include STL_STRING
-#include STL_FUNCTIONAL
-#include STL_ALGORITHM
+#include STL_IOSTREAM
 
 #include "simple.hxx"
 
+SG_USING_NAMESPACE(std);
+SG_USING_STD(istream);
 
-fgAIRPORTS::fgAIRPORTS() {
-}
 
+inline istream&
+operator >> ( istream& in, FGAirport& a )
+{
+    string junk;
+    in >> junk >> a.id >> a.latitude >> a.longitude >> a.elevation
+       >> a.code;
+
+    char name[256];             // should never be longer than this, right? :-)
+    in.getline( name, 256 );
+    a.name = name;
 
-// load the data
-int fgAIRPORTS::load( const string& file ) {
-    fgAIRPORT a;
+    return in;
+}
 
-    // build the path name to the airport file
-    FGPath path( current_options.get_fg_root() );
-    path.append( "Airports" );
-    path.append( file );
 
-    airports.erase( airports.begin(), airports.end() );
+FGAirportList::FGAirportList( const string& file ) {
+    SG_LOG( SG_GENERAL, SG_DEBUG, "Reading simple airport list: " << file );
 
-    fg_gzifstream in( path.str() );
+    // open the specified file for reading
+    sg_gzifstream in( file );
     if ( !in.is_open() ) {
-       FG_LOG( FG_GENERAL, FG_ALERT, "Cannot open file: " << path.str() );
+        SG_LOG( SG_GENERAL, SG_ALERT, "Cannot open file: " << file );
        exit(-1);
     }
 
-    /*
-    // We can use the STL copy algorithm because the input
-    // file doesn't contain and comments or blank lines.
-    copy( istream_iterator<fgAIRPORT,ptrdiff_t>(in.stream()),
-         istream_iterator<fgAIRPORT,ptrdiff_t>(),
-         inserter( airports, airports.begin() ) );
-    */
-
-    // read in each line of the file
-
-#ifdef __MWERKS__
-
-    in >> skipcomment;
-    char c = 0;
-    while ( in.get(c) && c != '\0' ) {
-       in.putback(c);
-       in >> a;
-       airports.insert(a);
-       in >> skipcomment;
-    }
-
-#else
+    // skip header line
+    in >> skipeol;
 
-    in >> skipcomment;
-    while ( ! in.eof() ) {
-       in >> a;
-       airports.insert(a);
-       in >> skipcomment;
+    FGAirport a;
+    while ( in ) {
+        in >> a;
+        airports[a.id] = a;
+        airports2.push_back(&airports[a.id]);
     }
 
-#endif
-
-    return 1;
 }
 
 
 // search for the specified id
-bool
-fgAIRPORTS::search( const string& id, fgAIRPORT* a ) const
-{
-    const_iterator it = airports.find( fgAIRPORT(id) );
-    if ( it != airports.end() )
-    {
-       *a = *it;
-       return true;
-    }
-    else
-    {
-       return false;
-    }
-}
-
-
-fgAIRPORT
-fgAIRPORTS::search( const string& id ) const
-{
-    fgAIRPORT a;
-    this->search( id, &a );
-    return a;
+FGAirport FGAirportList::search( const string& id) {
+    return airports[id];
 }
 
 
 // Destructor
-fgAIRPORTS::~fgAIRPORTS( void ) {
+FGAirportList::~FGAirportList( void ) {
 }
 
+int
+FGAirportList::size () const
+{
+    return airports2.size();
+}
 
+const FGAirport *
+FGAirportList::getAirport (int index) const
+{
+    return airports2[index];
+}