#include "CommStation.hxx"
-
+#include <Airports/airport.hxx>
#include <Navaids/NavDataCache.hxx>
namespace flightgear {
mAirport = apt;
}
-FGAirport* CommStation::airport() const
+FGAirportRef CommStation::airport() const
{
- return (FGAirport*) NavDataCache::instance()->loadById(mAirport);
+ return FGPositioned::loadById<FGAirport>(mAirport);
}
double CommStation::freqMHz() const
return mFreqKhz / 1000.0;
}
-CommStation*
+CommStationRef
CommStation::findByFreq(int freqKhz, const SGGeod& pos, FGPositioned::Filter* filt)
{
return (CommStation*) NavDataCache::instance()->findCommByFreq(freqKhz, pos, filt).ptr();
#ifndef FG_ATC_COMM_STATION_HXX
#define FG_ATC_COMM_STATION_HXX
+#include <Airports/airports_fwd.hxx>
#include <Navaids/positioned.hxx>
-class FGAirport;
-
namespace flightgear
{
CommStation(PositionedID aGuid, const std::string& name, FGPositioned::Type t, const SGGeod& pos, int range, int freq);
void setAirport(PositionedID apt);
- FGAirport* airport() const;
+ FGAirportRef airport() const;
int rangeNm() const
{ return mRangeNM; }
double freqMHz() const;
- static CommStation* findByFreq(int freqKhz, const SGGeod& pos, FGPositioned::Filter* filt = NULL);
+ static CommStationRef findByFreq(int freqKhz, const SGGeod& pos, FGPositioned::Filter* filt = NULL);
private:
int mRangeNM;
int mFreqKhz;
button_group->removeChildren("button", false);
AirportsWithATC filt;
- FGPositioned::List results = FGPositioned::findWithinRange(globals->get_aircraft_position(), 50.0, &filt);
+ FGPositionedList results = FGPositioned::findWithinRange(globals->get_aircraft_position(), 50.0, &filt);
FGPositioned::sortByRange(results, globals->get_aircraft_position());
for (unsigned int r=0; (r<results.size()) && (r < 6); ++r) {
}
//------------------------------------------------------------------------------
-FGRunway* FGAirport::getRunwayByIndex(unsigned int aIndex) const
+FGRunwayRef FGAirport::getRunwayByIndex(unsigned int aIndex) const
{
loadRunways();
return loadById<FGRunway>(mRunways, aIndex);
}
//------------------------------------------------------------------------------
-FGHelipad* FGAirport::getHelipadByIndex(unsigned int aIndex) const
+FGHelipadRef FGAirport::getHelipadByIndex(unsigned int aIndex) const
{
loadHelipads();
return loadById<FGHelipad>(mHelipads, aIndex);
//------------------------------------------------------------------------------
bool FGAirport::hasRunwayWithIdent(const std::string& aIdent) const
{
- return flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent) != 0;
+ return flightgear::NavDataCache::instance()
+ ->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent) != 0;
}
+//------------------------------------------------------------------------------
bool FGAirport::hasHelipadWithIdent(const std::string& aIdent) const
{
- return flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::HELIPAD, aIdent) != 0;
+ return flightgear::NavDataCache::instance()
+ ->airportItemWithIdent(guid(), FGPositioned::HELIPAD, aIdent) != 0;
}
//------------------------------------------------------------------------------
-FGRunway* FGAirport::getRunwayByIdent(const std::string& aIdent) const
+FGRunwayRef FGAirport::getRunwayByIdent(const std::string& aIdent) const
{
- PositionedID id = flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent);
+ PositionedID id =
+ flightgear::NavDataCache::instance()
+ ->airportItemWithIdent(guid(), FGPositioned::RUNWAY, aIdent);
+
if (id == 0) {
SG_LOG(SG_GENERAL, SG_ALERT, "no such runway '" << aIdent << "' at airport " << ident());
throw sg_range_exception("unknown runway " + aIdent + " at airport:" + ident(), "FGAirport::getRunwayByIdent");
}
//------------------------------------------------------------------------------
-FGHelipad* FGAirport::getHelipadByIdent(const std::string& aIdent) const
+FGHelipadRef FGAirport::getHelipadByIdent(const std::string& aIdent) const
{
PositionedID id = flightgear::NavDataCache::instance()->airportItemWithIdent(guid(), FGPositioned::HELIPAD, aIdent);
if (id == 0) {
}
//------------------------------------------------------------------------------
-FGRunway* FGAirport::findBestRunwayForHeading(double aHeading) const
+FGRunwayRef FGAirport::findBestRunwayForHeading(double aHeading) const
{
loadRunways();
}
//------------------------------------------------------------------------------
-FGRunway* FGAirport::findBestRunwayForPos(const SGGeod& aPos) const
+FGRunwayRef FGAirport::findBestRunwayForPos(const SGGeod& aPos) const
{
loadRunways();
}
//------------------------------------------------------------------------------
-FGTaxiway* FGAirport::getTaxiwayByIndex(unsigned int aIndex) const
+FGTaxiwayRef FGAirport::getTaxiwayByIndex(unsigned int aIndex) const
{
loadTaxiways();
return loadById<FGTaxiway>(mTaxiways, aIndex);
}
//------------------------------------------------------------------------------
-FGPavement* FGAirport::getPavementByIndex(unsigned int aIndex) const
+FGPavementRef FGAirport::getPavementByIndex(unsigned int aIndex) const
{
loadTaxiways();
return loadById<FGPavement>(mPavements, aIndex);
}
//------------------------------------------------------------------------------
-FGRunway* FGAirport::getActiveRunwayForUsage() const
+FGRunwayRef FGAirport::getActiveRunwayForUsage() const
{
FGEnvironmentMgr* envMgr = (FGEnvironmentMgr *) globals->get_subsystem("environment");
return findBestRunwayForHeading(hdg);
}
-FGAirport* FGAirport::findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter)
+//------------------------------------------------------------------------------
+FGAirportRef FGAirport::findClosest( const SGGeod& aPos,
+ double aCuttofNm,
+ Filter* filter )
{
AirportFilter aptFilter;
- if (filter == NULL) {
+ if( !filter )
filter = &aptFilter;
- }
- FGPositionedRef r = FGPositioned::findClosest(aPos, aCuttofNm, filter);
- if (!r) {
- return NULL;
- }
-
- return static_cast<FGAirport*>(r.ptr());
+ return static_pointer_cast<FGAirport>
+ (
+ FGPositioned::findClosest(aPos, aCuttofNm, filter)
+ );
}
FGAirport::HardSurfaceFilter::HardSurfaceFilter(double minLengthFt) :
}
//------------------------------------------------------------------------------
-FGAirport* FGAirport::findByIdent(const std::string& aIdent)
+FGAirportRef FGAirport::findByIdent(const std::string& aIdent)
{
AirportCache::iterator it = airportCache.find(aIdent);
if (it != airportCache.end())
return it->second;
PortsFilter filter;
- FGAirport* r = static_cast<FGAirport*> (FGPositioned::findFirstWithIdent(aIdent, &filter).get());
+ FGAirportRef r = static_pointer_cast<FGAirport>
+ (
+ FGPositioned::findFirstWithIdent(aIdent, &filter)
+ );
// add airport to the cache (even when it's NULL, so we don't need to search in vain again)
airportCache[aIdent] = r;
return r;
}
-FGAirport* FGAirport::getByIdent(const std::string& aIdent)
+//------------------------------------------------------------------------------
+FGAirportRef FGAirport::getByIdent(const std::string& aIdent)
{
- FGAirport* r = findByIdent(aIdent);
+ FGAirportRef r = findByIdent(aIdent);
if (!r)
throw sg_range_exception("No such airport with ident: " + aIdent);
return r;
FGPositioned::FREQ_GROUND,
FGPositioned::FREQ_UNICOM))
{
- result.push_back((CommStation*) cache->loadById(pos));
+ result.push_back( loadById<CommStation>(pos) );
}
return result;
NavDataCache* cache = NavDataCache::instance();
CommStationList result;
BOOST_FOREACH(PositionedID pos, cache->airportItemsOfType(guid(), aTy)) {
- result.push_back((CommStation*) cache->loadById(pos));
+ result.push_back( loadById<CommStation>(pos) );
}
return result;
void setMetar(bool value) { _has_metar = value; }
- FGRunway* getActiveRunwayForUsage() const;
+ FGRunwayRef getActiveRunwayForUsage() const;
FGAirportDynamics *getDynamics();
unsigned int numRunways() const;
unsigned int numHelipads() const;
- FGRunway* getRunwayByIndex(unsigned int aIndex) const;
- FGHelipad* getHelipadByIndex(unsigned int aIndex) const;
+ FGRunwayRef getRunwayByIndex(unsigned int aIndex) const;
+ FGHelipadRef getHelipadByIndex(unsigned int aIndex) const;
FGRunwayMap getRunwayMap() const;
FGHelipadMap getHelipadMap() const;
bool hasRunwayWithIdent(const std::string& aIdent) const;
bool hasHelipadWithIdent(const std::string& aIdent) const;
- FGRunway* getRunwayByIdent(const std::string& aIdent) const;
- FGHelipad* getHelipadByIdent(const std::string& aIdent) const;
- FGRunway* findBestRunwayForHeading(double aHeading) const;
+ FGRunwayRef getRunwayByIdent(const std::string& aIdent) const;
+ FGHelipadRef getHelipadByIdent(const std::string& aIdent) const;
+ FGRunwayRef findBestRunwayForHeading(double aHeading) const;
/**
* return the most likely target runway based on a position.
* This is a good approximation of which runway the position is on or
* aiming towards.
*/
- FGRunway* findBestRunwayForPos(const SGGeod& aPos) const;
+ FGRunwayRef findBestRunwayForPos(const SGGeod& aPos) const;
/**
* Retrieve all runways at the airport, but excluding the reciprocal
bool hasHardRunwayOfLengthFt(double aLengthFt) const;
unsigned int numTaxiways() const;
- FGTaxiway* getTaxiwayByIndex(unsigned int aIndex) const;
+ FGTaxiwayRef getTaxiwayByIndex(unsigned int aIndex) const;
FGTaxiwayList getTaxiways() const;
unsigned int numPavements() const;
- FGPavement* getPavementByIndex(unsigned int aIndex) const;
+ FGPavementRef getPavementByIndex(unsigned int aIndex) const;
FGPavementList getPavements() const;
class AirportFilter : public Filter
* match for filter, and return it cast to FGAirport. The default filter
* passes airports, but not seaports or heliports
*/
- static FGAirport* findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter = NULL);
+ static FGAirportRef findClosest(const SGGeod& aPos, double aCuttofNm, Filter* filter = NULL);
/**
* Helper to look up an FGAirport instance by unique ident. Throws an
* exception if the airport could not be found - so callers can assume
* the result is non-NULL.
*/
- static FGAirport* getByIdent(const std::string& aIdent);
+ static FGAirportRef getByIdent(const std::string& aIdent);
/**
* Helper to look up an FGAirport instance by unique ident. Returns NULL
* if the airport could not be found.
*/
- static FGAirport* findByIdent(const std::string& aIdent);
+ static FGAirportRef findByIdent(const std::string& aIdent);
/**
* Specialised helper to implement the AirportList dialog. Performs a
// forward decls
class FGAirport;
class FGAirportDynamics;
+class FGRunwayBase;
class FGRunway;
class FGHelipad;
class FGTaxiway;
typedef std::vector<WayptRef> WayptVec;
typedef SGSharedPtr<CommStation> CommStationRef;
- typedef std::vector<CommStation*> CommStationList;
+ typedef std::vector<CommStationRef> CommStationList;
typedef std::map<std::string, FGAirport*> AirportCache;
}
typedef SGSharedPtr<FGAirport> FGAirportRef;
+typedef SGSharedPtr<FGRunwayBase> FGRunwayBaseRef;
typedef SGSharedPtr<FGRunway> FGRunwayRef;
+typedef SGSharedPtr<FGHelipad> FGHelipadRef;
+typedef SGSharedPtr<FGTaxiway> FGTaxiwayRef;
+typedef SGSharedPtr<FGPavement> FGPavementRef;
typedef SGSharedPtr<FGParking> FGParkingRef;
-typedef std::vector<FGRunway*> FGRunwayList;
-typedef std::map<std::string, FGRunway*> FGRunwayMap;
-typedef std::map<std::string, FGHelipad*> FGHelipadMap;
+typedef std::vector<FGRunwayRef> FGRunwayList;
+typedef std::map<std::string, FGRunwayRef> FGRunwayMap;
+typedef std::map<std::string, FGHelipadRef> FGHelipadMap;
-typedef std::vector<FGTaxiway*> FGTaxiwayList;
-typedef std::vector<FGPavement*> FGPavementList;
-typedef std::vector<FGParking*> FGParkingList;
+typedef std::vector<FGTaxiwayRef> FGTaxiwayList;
+typedef std::vector<FGPavementRef> FGPavementList;
+typedef std::vector<FGParkingRef> FGParkingList;
typedef std::vector<FGTaxiSegment*> FGTaxiSegmentVector;
typedef FGTaxiSegmentVector::iterator FGTaxiSegmentVectorIterator;
return result ? ParkingAssignment(result, _ap) : ParkingAssignment();
}
-FGParking *FGAirportDynamics::getParking(PositionedID id) const
+FGParkingRef FGAirportDynamics::getParking(PositionedID id) const
{
- return static_cast<FGParking*>(flightgear::NavDataCache::instance()->loadById(id));
+ return FGPositioned::loadById<FGParking>(id);
}
string FGAirportDynamics::getParkingName(PositionedID id) const
bool isParkingAvailable(PositionedID parking) const;
- FGParking *getParking(PositionedID i) const;
+ FGParkingRef getParking(PositionedID i) const;
void releaseParking(PositionedID id);
std::string getParkingName(PositionedID i) const;
return SGGeodesy::direct(start->geod(), heading, length * 0.5);
}
-FGTaxiNode* FGTaxiSegment::getEnd() const
+FGTaxiNodeRef FGTaxiSegment::getEnd() const
{
- return static_cast<FGTaxiNode*>(NavDataCache::instance()->loadById(endNode));
+ return FGPositioned::loadById<FGTaxiNode>(endNode);
}
-FGTaxiNode* FGTaxiSegment::getStart() const
+FGTaxiNodeRef FGTaxiSegment::getStart() const
{
- return static_cast<FGTaxiNode*>(NavDataCache::instance()->loadById(startNode));
+ return FGPositioned::loadById<FGTaxiNode>(startNode);
}
double FGTaxiSegment::getLength() const
return NavDataCache::instance()->findGroundNetNode(parent->guid(), aGeod, onRunway, aRunway);
}
-FGTaxiNode* FGGroundNetwork::findNode(PositionedID idx) const
+FGTaxiNodeRef FGGroundNetwork::findNode(PositionedID idx) const
{
-
- return static_cast<FGTaxiNode*>(NavDataCache::instance()->loadById(idx));
+ return FGPositioned::loadById<FGTaxiNode>(idx);
}
FGTaxiSegment *FGGroundNetwork::findSegment(unsigned idx) const
}
BOOST_FOREACH(PositionedID targetId, cache->groundNetEdgesFrom(best->guid(), !fullSearch)) {
- FGTaxiNode* tgt = (FGTaxiNode*) cache->loadById(targetId);
+ FGTaxiNodeRef tgt = FGPositioned::loadById<FGTaxiNode>(targetId);
double edgeLength = dist(best->cart(), tgt->cart());
double alt = searchData[best].score + edgeLength + edgePenalty(tgt);
if (alt < searchData[tgt].score) { // Relax (u,v)
void unblock(time_t now);
bool hasBlock(time_t now);
- FGTaxiNode * getEnd() const;
- FGTaxiNode * getStart() const;
+ FGTaxiNodeRef getEnd() const;
+ FGTaxiNodeRef getStart() const;
double getLength() const;
int findNearestNode(const SGGeod& aGeod) const;
int findNearestNodeOnRunway(const SGGeod& aGeod, FGRunway* aRunway = NULL) const;
- FGTaxiNode *findNode(PositionedID idx) const;
+ FGTaxiNodeRef findNode(PositionedID idx) const;
FGTaxiSegment *findSegment(unsigned idx) const;
/**
return NULL;
}
- return (FGNavRecord*) cache->loadById(gsId);
+ return loadById<FGNavRecord>(gsId);
}
flightgear::SIDList FGRunway::getSIDs() const
bool _cachedItemsValid;
SGVec3d _cachedPos;
- FGPositioned::List _itemsInRange;
+ FGPositionedList _itemsInRange;
SGPropertyNode_ptr _excessDataNode;
int _maxSymbols;
SGPropertyNode_ptr _customSymbols;
{
MapAirportFilter af(_root);
bool partial = false;
- FGPositioned::List apts = FGPositioned::findWithinRangePartial(_projectionCenter, _drawRangeNm, &af, partial);
+ FGPositionedList apts = FGPositioned::findWithinRangePartial(_projectionCenter, _drawRangeNm, &af, partial);
for (unsigned int i=0; i<apts.size(); ++i) {
drawAirport((FGAirport*) apts[i].get());
}
NavaidFilter f(fixes, _root->getBoolValue("draw-navaids"));
if (f.minType() <= f.maxType()) {
- FGPositioned::List navs = FGPositioned::findWithinRange(_projectionCenter, _drawRangeNm, &f);
+ FGPositionedList navs = FGPositioned::findWithinRange(_projectionCenter, _drawRangeNm, &f);
glLineWidth(1.0);
for (unsigned int i=0; i<navs.size(); ++i) {
FGPositioned::TypeFilter f(FGPositioned::COUNTRY);
f.addType(FGPositioned::CITY);
f.addType(FGPositioned::TOWN);
- FGPositioned::List poi = FGPositioned::findWithinRange(_projectionCenter, _drawRangeNm, &f);
+ FGPositionedList poi = FGPositioned::findWithinRange(_projectionCenter, _drawRangeNm, &f);
glLineWidth(1.0);
for (unsigned int i=0; i<poi.size(); ++i) {
GPSWaypoint* DCLGPS::FindFirstById(const string& id) const
{
DCLGPSFilter filter;
- FGPositioned::List matches = FGPositioned::findAllWithIdent(id, &filter, false);
+ FGPositionedList matches = FGPositioned::findAllWithIdent(id, &filter, false);
if (matches.empty()) {
return NULL;
}
multi = false;
FGPositioned::TypeFilter filter(ty);
- FGPositioned::List matches =
+ FGPositionedList matches =
FGPositioned::findAllWithIdent(id, &filter, exact);
if (matches.empty()) {
return NULL;
// check for duplicate idents
FGPositioned::TypeFilter f(FGPositioned::WAYPOINT);
- FGPositioned::List dups = FGPositioned::findAllWithIdent(ident, &f);
+ FGPositionedList dups = FGPositioned::findAllWithIdent(ident, &f);
if (!dups.empty()) {
SG_LOG(SG_INSTR, SG_WARN, "GPS:defineWaypoint: non-unique waypoint identifier, ho-hum");
}
// forward decls
class SGRoute;
class FGRouteMgr;
-class FGAirport;
class GPSListener;
/**
std::string _searchQuery;
FGPositioned::Type _searchType;
bool _searchExact;
- FGPositioned::List _searchResults;
+ FGPositionedList _searchResults;
bool _searchIsRoute; ///< set if 'search' is actually the current route
bool _searchHasNext; ///< is there a result after this one?
bool _searchNames; ///< set if we're searching names instead of idents
return r;
}
- FGPositioned::List findAllByString(const string& s, const string& column,
+ FGPositionedList findAllByString(const string& s, const string& column,
FGPositioned::Filter* filter, bool exact)
{
string query = s;
sqlite3_bind_int(stmt, 3, filter->maxType());
}
- FGPositioned::List result;
+ FGPositionedList result;
// run the prepared SQL
while (stepSelect(stmt))
{
case FGPositioned::MOBILE_TACAN:
{
if (aptId > 0) {
- FGAirport* apt = (FGAirport*) outer->loadById(aptId);
+ FGAirport* apt = FGPositioned::loadById<FGAirport>(aptId);
if (apt->validateILSData()) {
SG_LOG(SG_NAVCACHE, SG_INFO, "re-loaded ILS data for " << apt->ident());
// queried data above is probably invalid, force us to go around again
d->transactionAborted = true;
}
-FGPositioned* NavDataCache::loadById(PositionedID rowid)
+FGPositionedRef NavDataCache::loadById(PositionedID rowid)
{
if (rowid == 0) {
return NULL;
d->execUpdate(d->setAirportMetar);
}
-FGPositioned::List NavDataCache::findAllWithIdent(const string& s,
- FGPositioned::Filter* filter, bool exact)
+//------------------------------------------------------------------------------
+FGPositionedList NavDataCache::findAllWithIdent( const string& s,
+ FGPositioned::Filter* filter,
+ bool exact )
{
return d->findAllByString(s, "ident", filter, exact);
}
-FGPositioned::List NavDataCache::findAllWithName(const string& s,
- FGPositioned::Filter* filter, bool exact)
+//------------------------------------------------------------------------------
+FGPositionedList NavDataCache::findAllWithName( const string& s,
+ FGPositioned::Filter* filter,
+ bool exact )
{
return d->findAllByString(s, "name", filter, exact);
}
-
-FGPositionedRef NavDataCache::findClosestWithIdent(const string& aIdent,
- const SGGeod& aPos, FGPositioned::Filter* aFilter)
+
+//------------------------------------------------------------------------------
+FGPositionedRef NavDataCache::findClosestWithIdent( const string& aIdent,
+ const SGGeod& aPos,
+ FGPositioned::Filter* aFilter )
{
sqlite_bind_stdstring(d->findClosestWithIdent, 1, aIdent);
if (aFilter) {
* This may be trivial if the object is previously loaded, or require actual
* disk IO.
*/
- FGPositioned* loadById(PositionedID guid);
+ FGPositionedRef loadById(PositionedID guid);
PositionedID insertAirport(FGPositioned::Type ty, const std::string& ident,
const std::string& name);
*/
void updatePosition(PositionedID item, const SGGeod &pos);
- FGPositioned::List findAllWithIdent(const std::string& ident,
- FGPositioned::Filter* filter, bool exact);
- FGPositioned::List findAllWithName(const std::string& ident,
- FGPositioned::Filter* filter, bool exact);
+ FGPositionedList findAllWithIdent( const std::string& ident,
+ FGPositioned::Filter* filter,
+ bool exact );
+ FGPositionedList findAllWithName( const std::string& ident,
+ FGPositioned::Filter* filter,
+ bool exact );
- FGPositionedRef findClosestWithIdent(const std::string& aIdent,
- const SGGeod& aPos, FGPositioned::Filter* aFilter);
+ FGPositionedRef findClosestWithIdent( const std::string& aIdent,
+ const SGGeod& aPos,
+ FGPositioned::Filter* aFilter );
/**
return result;
}
-bool findNearestN(const SGVec3d& aPos, unsigned int aN, double aCutoffM, FGPositioned::Filter* aFilter, FGPositioned::List& aResults, int aCutoffMsec)
+bool findNearestN(const SGVec3d& aPos, unsigned int aN, double aCutoffM, FGPositioned::Filter* aFilter, FGPositionedList& aResults, int aCutoffMsec)
{
aResults.clear();
FindNearestPQueue pq;
return !pq.empty();
}
-bool findAllWithinRange(const SGVec3d& aPos, double aRangeM, FGPositioned::Filter* aFilter, FGPositioned::List& aResults, int aCutoffMsec)
+bool findAllWithinRange(const SGVec3d& aPos, double aRangeM, FGPositioned::Filter* aFilter, FGPositionedList& aResults, int aCutoffMsec)
{
aResults.clear();
FindNearestPQueue pq;
mutable bool childrenLoaded;
};
- bool findNearestN(const SGVec3d& aPos, unsigned int aN, double aCutoffM, FGPositioned::Filter* aFilter, FGPositioned::List& aResults, int aCutoffMsec);
- bool findAllWithinRange(const SGVec3d& aPos, double aRangeM, FGPositioned::Filter* aFilter, FGPositioned::List& aResults, int aCutoffMsec);
+ bool findNearestN(const SGVec3d& aPos, unsigned int aN, double aCutoffM, FGPositioned::Filter* aFilter, FGPositionedList& aResults, int aCutoffMsec);
+ bool findAllWithinRange(const SGVec3d& aPos, double aRangeM, FGPositioned::Filter* aFilter, FGPositionedList& aResults, int aCutoffMsec);
} // of namespace Octree
if ((type >= FGPositioned::ILS) && (type <= FGPositioned::GS)) {
arp = cache->findAirportRunway(name);
if (arp.second) {
- runway = static_cast<FGRunway*>(cache->loadById(arp.second));
+ runway = FGPositioned::loadById<FGRunway>(arp.second);
assert(runway);
#if 0
// code is disabled since it's causing some problems, see
#include <Airports/runways.hxx>
#include <Navaids/NavDataCache.hxx>
+#include <Navaids/navrecord.hxx>
using std::string;
return &tf;
}
-FGNavRecord *FGNavList::findByFreq( double freq, const SGGeod& position,
- TypeFilter* filter)
+FGNavRecordRef FGNavList::findByFreq( double freq,
+ const SGGeod& position,
+ TypeFilter* filter )
{
flightgear::NavDataCache* cache = flightgear::NavDataCache::instance();
int freqKhz = static_cast<int>(freq * 100 + 0.5);
= FG_NAV_MAX_RANGE*SG_NM_TO_METER*FG_NAV_MAX_RANGE*SG_NM_TO_METER;
BOOST_FOREACH(PositionedID id, stations) {
- FGNavRecord* station = (FGNavRecord*) cache->loadById(id);
+ FGNavRecordRef station = FGPositioned::loadById<FGNavRecord>(id);
if (!filter->pass(station)) {
continue;
}
return NULL;
}
-FGNavRecord *FGNavList::findByFreq( double freq, TypeFilter* filter)
+FGNavRecordRef FGNavList::findByFreq(double freq, TypeFilter* filter)
{
flightgear::NavDataCache* cache = flightgear::NavDataCache::instance();
int freqKhz = static_cast<int>(freq * 100 + 0.5);
}
BOOST_FOREACH(PositionedID id, stations) {
- FGNavRecord* station = (FGNavRecord*) cache->loadById(id);
+ FGNavRecordRef station = FGPositioned::loadById<FGNavRecord>(id);
if (filter->pass(station)) {
return station;
}
PositionedIDVec ids(cache->findNavaidsByFreq(freqKhz, position, filter));
BOOST_FOREACH(PositionedID id, ids) {
- FGNavRecord* station = (FGNavRecord*) cache->loadById(id);
+ FGNavRecordRef station = FGPositioned::loadById<FGNavRecord>(id);
if (!filter->pass(station)) {
continue;
}
nav_list_type reply;
int f = (int)(freq*100.0 + 0.5);
- FGPositioned::List stations = FGPositioned::findAllWithIdent(ident, filter);
+ FGPositionedList stations = FGPositioned::findAllWithIdent(ident, filter);
BOOST_FOREACH(FGPositionedRef ref, stations) {
FGNavRecord* nav = static_cast<FGNavRecord*>(ref.ptr());
if ( f <= 0.0 || nav->get_freq() == f) {
* that there will be multiple stations with matching frequencies
* so a position must be specified.
*/
- static FGNavRecord *findByFreq( double freq, const SGGeod& position,
+ static FGNavRecordRef findByFreq( double freq, const SGGeod& position,
TypeFilter* filter = NULL);
/**
* mobile TACANs which have no valid position. The first match is
* returned only.
*/
- static FGNavRecord *findByFreq( double freq, TypeFilter* filter = NULL);
+ static FGNavRecordRef findByFreq( double freq, TypeFilter* filter = NULL);
static nav_list_type findAllByFreq( double freq, const SGGeod& position,
TypeFilter* filter = NULL);
#include <Airports/airport.hxx>
#include <Airports/xmlloader.hxx>
#include <Main/fg_props.hxx>
-#include <Navaids/NavDataCache.hxx>
FGNavRecord::FGNavRecord(PositionedID aGuid, Type aTy, const std::string& aIdent,
const std::string& aName, const SGGeod& aPos,
{
}
-FGRunway* FGNavRecord::runway() const
+FGRunwayRef FGNavRecord::runway() const
{
- return (FGRunway*) flightgear::NavDataCache::instance()->loadById(mRunway);
+ return loadById<FGRunway>(mRunway);
}
double FGNavRecord::localizerWidth() const
/**
* Retrieve the runway this navaid is associated with (for ILS/LOC/GS)
*/
- FGRunway* runway() const;
+ FGRunwayRef runway() const;
/**
* return the localizer width, in degrees
{
NavDataCache* cache = NavDataCache::instance();
TypeFilter filter(WAYPOINT);
- FGPositioned::List existing = cache->findAllWithIdent(aIdent, &filter, true);
+ FGPositionedList existing = cache->findAllWithIdent(aIdent, &filter, true);
if (!existing.empty()) {
SG_LOG(SG_NAVAID, SG_WARN, "attempt to insert duplicate WAYPOINT:" << aIdent);
return existing.front().ptr();
return NULL;
}
- List r = NavDataCache::instance()->findAllWithIdent(aIdent, aFilter, true);
+ FGPositionedList r =
+ NavDataCache::instance()->findAllWithIdent(aIdent, aFilter, true);
if (r.empty()) {
return NULL;
}
return r.front();
}
-FGPositioned::List
+FGPositionedList
FGPositioned::findWithinRange(const SGGeod& aPos, double aRangeNm, Filter* aFilter)
{
validateSGGeod(aPos);
- List result;
+ FGPositionedList result;
Octree::findAllWithinRange(SGVec3d::fromGeod(aPos),
aRangeNm * SG_NM_TO_METER, aFilter, result, 0xffffff);
return result;
}
-FGPositioned::List
+FGPositionedList
FGPositioned::findWithinRangePartial(const SGGeod& aPos, double aRangeNm, Filter* aFilter, bool& aPartial)
{
validateSGGeod(aPos);
int limitMsec = 32;
- List result;
+ FGPositionedList result;
aPartial = Octree::findAllWithinRange(SGVec3d::fromGeod(aPos),
aRangeNm * SG_NM_TO_METER, aFilter, result,
limitMsec);
return result;
}
-FGPositioned::List
+FGPositionedList
FGPositioned::findAllWithIdent(const std::string& aIdent, Filter* aFilter, bool aExact)
{
return NavDataCache::instance()->findAllWithIdent(aIdent, aFilter, aExact);
}
-FGPositioned::List
+FGPositionedList
FGPositioned::findAllWithName(const std::string& aName, Filter* aFilter, bool aExact)
{
return NavDataCache::instance()->findAllWithName(aName, aFilter, aExact);
{
validateSGGeod(aPos);
- List l(findClosestN(aPos, 1, aCutoffNm, aFilter));
+ FGPositionedList l(findClosestN(aPos, 1, aCutoffNm, aFilter));
if (l.empty()) {
return NULL;
}
return l.front();
}
-FGPositioned::List
+FGPositionedList
FGPositioned::findClosestN(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter)
{
validateSGGeod(aPos);
- List result;
+ FGPositionedList result;
int limitMsec = 0xffff;
Octree::findNearestN(SGVec3d::fromGeod(aPos), aN, aCutoffNm * SG_NM_TO_METER, aFilter, result, limitMsec);
return result;
}
-FGPositioned::List
+FGPositionedList
FGPositioned::findClosestNPartial(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter, bool &aPartial)
{
validateSGGeod(aPos);
- List result;
+ FGPositionedList result;
int limitMsec = 32;
aPartial = Octree::findNearestN(SGVec3d::fromGeod(aPos), aN, aCutoffNm * SG_NM_TO_METER, aFilter, result,
limitMsec);
}
void
-FGPositioned::sortByRange(List& aResult, const SGGeod& aPos)
+FGPositioned::sortByRange(FGPositionedList& aResult, const SGGeod& aPos)
{
validateSGGeod(aPos);
SGVec3d cartPos(SGVec3d::fromGeod(aPos));
// computer ordering values
Octree::FindNearestResults r;
- List::iterator it = aResult.begin(), lend = aResult.end();
+ FGPositionedList::iterator it = aResult.begin(), lend = aResult.end();
for (; it != lend; ++it) {
double d2 = distSqr((*it)->cart(), cartPos);
r.push_back(Octree::OrderedPositioned(*it, d2));
}
//------------------------------------------------------------------------------
-FGPositioned* FGPositioned::loadByIdImpl(PositionedID id)
+FGPositionedRef FGPositioned::loadByIdImpl(PositionedID id)
{
return flightgear::NavDataCache::instance()->loadById(id);
}
class FGPositioned;
typedef SGSharedPtr<FGPositioned> FGPositionedRef;
+typedef std::vector<FGPositionedRef> FGPositionedList;
typedef int64_t PositionedID;
typedef std::vector<PositionedID> PositionedIDVec;
LAST_TYPE
} Type;
- typedef std::vector<FGPositionedRef> List;
-
virtual ~FGPositioned();
Type type() const
Type mMinType, mMaxType;
};
- static List findWithinRange(const SGGeod& aPos, double aRangeNm, Filter* aFilter = NULL);
+ static FGPositionedList findWithinRange(const SGGeod& aPos, double aRangeNm, Filter* aFilter = NULL);
- static List findWithinRangePartial(const SGGeod& aPos, double aRangeNm, Filter* aFilter, bool& aPartial);
+ static FGPositionedList findWithinRangePartial(const SGGeod& aPos, double aRangeNm, Filter* aFilter, bool& aPartial);
static FGPositionedRef findClosestWithIdent(const std::string& aIdent, const SGGeod& aPos, Filter* aFilter = NULL);
* Find all items with the specified ident
* @param aFilter - optional filter on items
*/
- static List findAllWithIdent(const std::string& aIdent, Filter* aFilter = NULL, bool aExact = true);
+ static FGPositionedList findAllWithIdent(const std::string& aIdent, Filter* aFilter = NULL, bool aExact = true);
/**
* As above, but searches names instead of idents
*/
- static List findAllWithName(const std::string& aName, Filter* aFilter = NULL, bool aExact = true);
+ static FGPositionedList findAllWithName(const std::string& aName, Filter* aFilter = NULL, bool aExact = true);
/**
* Sort an FGPositionedList by distance from a position
*/
- static void sortByRange(List&, const SGGeod& aPos);
+ static void sortByRange(FGPositionedList&, const SGGeod& aPos);
/**
* Find the closest item to a position, which pass the specified filter
* @param aN - number of matches to find
* @param aCutoffNm - maximum distance to search within, in nautical miles
*/
- static List findClosestN(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter = NULL);
+ static FGPositionedList findClosestN(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter = NULL);
/**
* Same as above, but with a time-bound in msec too.
*/
- static List findClosestNPartial(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter,
+ static FGPositionedList findClosestNPartial(const SGGeod& aPos, unsigned int aN, double aCutoffNm, Filter* aFilter,
bool& aPartial);
-
- /**
- * Map a candidate type string to a real type. Returns INVALID if the string
- * does not correspond to a defined type.
- */
- static Type typeFromName(const std::string& aName);
-
- /**
- * Map a type to a human-readable string
- */
- static const char* nameForType(Type aTy);
-
- static FGPositioned* createUserWaypoint(const std::string& aIdent, const SGGeod& aPos);
- static void deleteUserWaypoint(const std::string& aIdent);
-protected:
- friend class flightgear::NavDataCache;
- FGPositioned(PositionedID aGuid, Type ty, const std::string& aIdent, const SGGeod& aPos);
-
- void modifyPosition(const SGGeod& newPos);
-
- static FGPositioned* loadByIdImpl(PositionedID id);
-
template<class T>
- static T* loadById(PositionedID id)
+ static SGSharedPtr<T> loadById(PositionedID id)
{
- return static_cast<T*>( loadByIdImpl(id) );
+ return static_pointer_cast<T>( loadByIdImpl(id) );
}
template<class T>
- static T* loadById(const PositionedIDVec& id_vec, size_t index)
+ static SGSharedPtr<T> loadById(const PositionedIDVec& id_vec, size_t index)
{
assert(index >= 0 && index < id_vec.size());
return loadById<T>(id_vec[index]);
}
template<class T>
- static std::vector<T*> loadAllById(const PositionedIDVec& id_vec)
+ static std::vector<SGSharedPtr<T> > loadAllById(const PositionedIDVec& id_vec)
{
- std::vector<T*> vec(id_vec.size());
+ std::vector<SGSharedPtr<T> > vec(id_vec.size());
for(size_t i = 0; i < id_vec.size(); ++i)
vec[i] = loadById<T>(id_vec[i]);
return vec;
}
+ /**
+ * Map a candidate type string to a real type. Returns INVALID if the string
+ * does not correspond to a defined type.
+ */
+ static Type typeFromName(const std::string& aName);
+
+ /**
+ * Map a type to a human-readable string
+ */
+ static const char* nameForType(Type aTy);
+
+ static FGPositioned* createUserWaypoint(const std::string& aIdent, const SGGeod& aPos);
+ static void deleteUserWaypoint(const std::string& aIdent);
+protected:
+ friend class flightgear::NavDataCache;
+
+ FGPositioned(PositionedID aGuid, Type ty, const std::string& aIdent, const SGGeod& aPos);
+
+ void modifyPosition(const SGGeod& newPos);
+
+ static FGPositionedRef loadByIdImpl(PositionedID id);
+
const PositionedID mGuid;
const SGGeod mPosition;
const SGVec3d mCart;
naRef r = naNewVector(c);
- FGPositioned::List apts = FGPositioned::findWithinRange(pos, rangeNm, &filter);
+ FGPositionedList apts = FGPositioned::findWithinRange(pos, rangeNm, &filter);
FGPositioned::sortByRange(apts, pos);
BOOST_FOREACH(FGPositionedRef a, apts) {
naRef r = naNewVector(c);
- FGPositioned::List apts = FGPositioned::findAllWithIdent(prefix, &filter, false);
+ FGPositionedList apts = FGPositioned::findAllWithIdent(prefix, &filter, false);
BOOST_FOREACH(FGPositionedRef a, apts) {
FGAirport* apt = (FGAirport*) a.get();
naRef r = naNewVector(c);
FGNavList::TypeFilter filter(type);
- FGPositioned::List navs = FGPositioned::findWithinRange(pos, rangeNm, &filter);
+ FGPositionedList navs = FGPositioned::findWithinRange(pos, rangeNm, &filter);
FGPositioned::sortByRange(navs, pos);
BOOST_FOREACH(FGPositionedRef a, navs) {
naRef r = naNewVector(c);
FGPositioned::TypeFilter filter(FGPositioned::FIX);
- FGPositioned::List fixes = FGPositioned::findAllWithIdent(ident, &filter);
+ FGPositionedList fixes = FGPositioned::findAllWithIdent(ident, &filter);
FGPositioned::sortByRange(fixes, pos);
BOOST_FOREACH(FGPositionedRef f, fixes) {
#include <Airports/airport.hxx>
#include <Airports/dynamics.hxx>
+#include <Airports/pavement.hxx>
#include <ATC/CommStation.hxx>
#include <Main/globals.hxx>
#include <Navaids/NavDataCache.hxx>
typedef nasal::Ghost<flightgear::CommStationRef> NasalCommStation;
typedef nasal::Ghost<FGNavRecordRef> NasalNavRecord;
-//------------------------------------------------------------------------------
-naRef to_nasal_helper(naContext c, FGPositioned* positioned)
-{
- return NasalPositioned::create(c, positioned);
-}
-
-//------------------------------------------------------------------------------
-naRef to_nasal_helper(naContext c, FGPavement* rwy)
-{
- return NasalPositioned::create(c, (FGPositioned*)rwy);
-}
-
-//------------------------------------------------------------------------------
-naRef to_nasal_helper(naContext c, FGRunwayBase* rwy)
-{
- return NasalPositioned::create(c, (FGPositioned*)rwy);
-}
-
-//------------------------------------------------------------------------------
-naRef to_nasal_helper(naContext c, FGParking* parking)
-{
- return NasalParking::create(c, parking);
-}
-
//------------------------------------------------------------------------------
naRef to_nasal_helper(naContext c, flightgear::SID* sid)
{
return nasal::to_nasal(c, iap->ident());
}
-//------------------------------------------------------------------------------
-naRef to_nasal_helper(naContext c, FGAirport* apt)
-{
- return NasalAirport::create(c, apt);
-}
-
//------------------------------------------------------------------------------
naRef to_nasal_helper(naContext c, const SGGeod& pos)
{
}
//------------------------------------------------------------------------------
-static FGRunwayBase* f_airport_runway(FGAirport& apt, std::string ident)
+static FGRunwayBaseRef f_airport_runway(FGAirport& apt, std::string ident)
{
boost::to_upper(ident);
//------------------------------------------------------------------------------
template<class T, class C1, class C2>
-std::vector<T> extract( const std::vector<C1*>& in,
+std::vector<T> extract( const std::vector<C1>& in,
T (C2::*getter)() const )
{
std::vector<T> ret(in.size());
// airportinfo(<type>); type := ("airport"|"seaport"|"heliport")
// airportinfo() same as airportinfo("airport")
// airportinfo(<lat>, <lon> [, <type>]);
-static naRef f_airportinfo(naContext c, naRef me, int argc, naRef* args)
+static naRef f_airportinfo(nasal::CallContext ctx)
{
- nasal::CallContext ctx(c, argc, args);
-
SGGeod pos = getPosition(ctx);
if( ctx.argc > 1 )
/**
* findAirportsWithinRange([<position>,] <range-nm> [, type])
*/
-static naRef f_findAirportsWithinRange(naContext c, naRef me, int argc, naRef* args)
+static naRef f_findAirportsWithinRange(nasal::CallContext ctx)
{
- nasal::CallContext ctx(c, argc, args);
-
SGGeod pos = getPosition(ctx);
double range_nm = ctx.requireArg<double>(0);
FGAirport::TypeRunwayFilter filter; // defaults to airports only
filter.fromTypeString( ctx.getArg<std::string>(1) );
- FGPositioned::List apts =
- FGPositioned::findWithinRange(pos, range_nm, &filter);
+ FGPositionedList apts = FGPositioned::findWithinRange(pos, range_nm, &filter);
FGPositioned::sortByRange(apts, pos);
return ctx.to_nasal(apts);
/**
* findAirportsByICAO(<ident/prefix> [, type])
*/
-static naRef f_findAirportsByICAO(naContext c, naRef me, int argc, naRef* args)
+static naRef f_findAirportsByICAO(nasal::CallContext ctx)
{
- nasal::CallContext ctx(c, argc, args);
std::string prefix = ctx.requireArg<std::string>(0);
FGAirport::TypeRunwayFilter filter; // defaults to airports only
// navinfo("vor", "HAM") return all vor who's name start with "HAM"
//navinfo(34,48,"vor","HAM") return all vor who's name start with "HAM"
// sorted by distance relative to lat=34, lon=48
-static naRef f_navinfo(naContext c, naRef me, int argc, naRef* args)
+static naRef f_navinfo(nasal::CallContext ctx)
{
- nasal::CallContext ctx(c, argc, args);
-
SGGeod pos = getPosition(ctx);
std::string id = ctx.getArg<std::string>(0);
if( filter.fromTypeString(id) )
id = ctx.getArg<std::string>(1);
else if( ctx.argc > 1 )
- naRuntimeError(c, "navinfo() already got an ident");
+ naRuntimeError(ctx.c, "navinfo() already got an ident");
return ctx.to_nasal( FGNavList::findByIdentAndFreq(pos, id, 0.0, &filter) );
}
//------------------------------------------------------------------------------
-static naRef f_findNavaidsWithinRange(naContext c, naRef me, int argc, naRef* args)
+static naRef f_findNavaidsWithinRange(nasal::CallContext ctx)
{
- nasal::CallContext ctx(c, argc, args);
-
SGGeod pos = getPosition(ctx);
double range_nm = ctx.requireArg<double>(0);
FGNavList::TypeFilter filter;
filter.fromTypeString(ctx.getArg<std::string>(0));
- FGPositioned::List navs =
- FGPositioned::findWithinRange(pos, range_nm, &filter);
+ FGPositionedList navs = FGPositioned::findWithinRange(pos, range_nm, &filter);
FGPositioned::sortByRange(navs, pos);
return ctx.to_nasal(navs);