Example #1
0
static bool
CompareMapItems(const MapItem *a, const MapItem *b)
{
  if (a->type == MapItem::SELF)
    return true;

  if (b->type == MapItem::SELF)
    return false;

  if (a->type == MapItem::WAYPOINT && b->type != MapItem::WAYPOINT &&
      ((const WaypointMapItem *)a)->waypoint.IsAirport())
    return true;

  if (a->type != MapItem::WAYPOINT && b->type == MapItem::WAYPOINT &&
      ((const WaypointMapItem *)b)->waypoint.IsAirport())
    return false;

  if (a->type == MapItem::WAYPOINT && b->type != MapItem::WAYPOINT &&
      ((const WaypointMapItem *)a)->waypoint.IsLandable())
    return true;

  if (a->type != MapItem::WAYPOINT && b->type == MapItem::WAYPOINT &&
      ((const WaypointMapItem *)b)->waypoint.IsLandable())
    return false;

  if (a->type == MapItem::WAYPOINT && b->type == MapItem::WAYPOINT)
    return CompareWaypointItems((const WaypointMapItem *)a,
                                (const WaypointMapItem *)b);

  if (a->type == MapItem::TASK_OZ && b->type == MapItem::TASK_OZ)
    return ((const TaskOZMapItem *)a)->index <
           ((const TaskOZMapItem *)b)->index;

  if (a->type == MapItem::AIRSPACE && b->type == MapItem::AIRSPACE)
    return AirspaceAltitude::SortHighest(
        ((const AirspaceMapItem *)a)->airspace->GetBase(),
        ((const AirspaceMapItem *)b)->airspace->GetBase());

  if (a->type == MapItem::MARKER && b->type == MapItem::MARKER)
    return ((const MarkerMapItem *)a)->id < ((const MarkerMapItem *)b)->id;

  return a->type < b->type;
}
Example #2
0
static bool
CompareMapItems(const MapItem *a, const MapItem *b)
{
  if (a->type == MapItem::LOCATION)
    return true;

  if (b->type == MapItem::LOCATION)
    return false;

  if (a->type == MapItem::ARRIVAL_ALTITUDE)
    return true;

  if (b->type == MapItem::ARRIVAL_ALTITUDE)
    return false;

  if (a->type == MapItem::SELF)
    return true;

  if (b->type == MapItem::SELF)
    return false;

  if (a->type == MapItem::WAYPOINT && b->type != MapItem::WAYPOINT &&
      ((const WaypointMapItem *)a)->waypoint.IsAirport())
    return true;

  if (a->type != MapItem::WAYPOINT && b->type == MapItem::WAYPOINT &&
      ((const WaypointMapItem *)b)->waypoint.IsAirport())
    return false;

  if (a->type == MapItem::WAYPOINT && b->type != MapItem::WAYPOINT &&
      ((const WaypointMapItem *)a)->waypoint.IsLandable())
    return true;

  if (a->type != MapItem::WAYPOINT && b->type == MapItem::WAYPOINT &&
      ((const WaypointMapItem *)b)->waypoint.IsLandable())
    return false;

  if (a->type == MapItem::WAYPOINT && b->type == MapItem::WAYPOINT)
    return CompareWaypointItems((const WaypointMapItem *)a,
                                (const WaypointMapItem *)b);

  if (a->type == MapItem::TASK_OZ && b->type == MapItem::TASK_OZ)
    return ((const TaskOZMapItem *)a)->index <
           ((const TaskOZMapItem *)b)->index;

  if (a->type == MapItem::TRAFFIC && b->type == MapItem::TRAFFIC)
    return ((const TrafficMapItem *)a)->id <
           ((const TrafficMapItem *)b)->id;

  if (a->type == MapItem::THERMAL && b->type == MapItem::THERMAL)
    return ((const ThermalMapItem *)a)->thermal.time >
           ((const ThermalMapItem *)b)->thermal.time;

  if (a->type == MapItem::AIRSPACE && b->type == MapItem::AIRSPACE)
    return AirspaceAltitude::SortHighest(
        ((const AirspaceMapItem *)a)->airspace->GetBase(),
        ((const AirspaceMapItem *)b)->airspace->GetBase());

#ifdef HAVE_NOAA
  if (a->type == MapItem::WEATHER && b->type == MapItem::WEATHER)
    return strcmp(((const WeatherStationMapItem *)a)->station->code,
                  ((const WeatherStationMapItem *)b)->station->code) < 0;
#endif

  return a->type < b->type;
}