From 808ac4784eff257ab2c6be4f403f894d5462b93e Mon Sep 17 00:00:00 2001 From: daveluff Date: Sun, 27 Nov 2005 20:19:00 +0000 Subject: [PATCH] Add a lower-bound search function for fixes for GPS units with next-match database search capabilities --- src/Navaids/fixlist.cxx | 15 +++++++++++++++ src/Navaids/fixlist.hxx | 18 +++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/Navaids/fixlist.cxx b/src/Navaids/fixlist.cxx index f22fa57fb..608faf02e 100644 --- a/src/Navaids/fixlist.cxx +++ b/src/Navaids/fixlist.cxx @@ -120,3 +120,18 @@ bool FGFixList::query_and_offset( const string& ident, double lon, double lat, *dist = s; return true; } + +const FGFix* FGFixList::findFirstByIdent( const string& ident, bool exact) +{ + fix_map_iterator itr; + if(exact) { + itr = fixlist.find(ident); + } else { + itr = fixlist.lower_bound(ident); + } + if(itr == fixlist.end()) { + return(NULL); + } else { + return(&(itr->second)); + } +} diff --git a/src/Navaids/fixlist.hxx b/src/Navaids/fixlist.hxx index 20e7b8800..02e6e8a96 100644 --- a/src/Navaids/fixlist.hxx +++ b/src/Navaids/fixlist.hxx @@ -38,14 +38,13 @@ SG_USING_STD(map); SG_USING_STD(vector); SG_USING_STD(string); +// TODO - fix names may be globally non-unique. Allow for this. +typedef map < string, FGFix > fix_map_type; +typedef fix_map_type::iterator fix_map_iterator; +typedef fix_map_type::const_iterator fix_map_const_iterator; class FGFixList { - // typedef map < string, FGFix, less > fix_map_type; - typedef map < string, FGFix > fix_map_type; - typedef fix_map_type::iterator fix_map_iterator; - typedef fix_map_type::const_iterator fix_map_const_iterator; - fix_map_type fixlist; public: @@ -58,12 +57,21 @@ public: // query the database for the specified fix bool query( const string& ident, FGFix *f ); + + // Find fix of requested type with closest exact or following ident + // (by ACSII values) to that supplied (ie. a lower-bound lookup). + // Supplying true for exact forces only exact matches to be returned (similar to above function) + // Returns NULL if no match found. + const FGFix* findFirstByIdent( const string& ident, bool exact = false ); // query the database for the specified fix, lon and lat are // in degrees, elev is in meters bool query_and_offset( const string& ident, double lon, double lat, double elev, FGFix *f, double *heading, double *dist ); + + // Return a pointer to the master fixlist + inline const fix_map_type* getFixList() { return(&fixlist); } }; -- 2.39.5