#ifndef AIRMAP_AIRSPACE_H_ #define AIRMAP_AIRSPACE_H_ #include #include #include #include #include #include #include #include #include namespace airmap { /// Airspace groups together general information about an airspace and /// in-depth information providing more details. class Airspace { public: /// Airport bundles up properties further describing an /// airspace around an airport. struct Airport { /// Runway describes an individual runway of an airport. struct Runway { std::string name; ///< Commn name assigned to the runway in the context of a specific airport. float length; ///< Lenght of the runway in [m]. float bearing; ///< Bearing of the runway in [°]. }; /// Use enumerates all known usage types for /// an airport. enum class Use { public_ ///< The airport is available for public use. }; std::string iata; ///< IATA code of the airport. std::string icao; ///< ICAO code of the airport. bool paved{false}; ///< True if the airport features paved runways. std::string phone; ///< The phone number of the airport (typically the tower). bool tower{false}; ///< True if the airport features a tower. std::vector runways; ///< Collection of runways available at the airport. float elevation{0.f}; ///< The elevation of the airport in [m]. float longest_runway{0.f}; ///< The lenght of th longest runway in [m]. bool instrument_approach_procedure{false}; ///< True if the airport features equipment supporting an IAP. Use use{Use::public_}; ///< Types of use offered by the airport. }; /// ControlledAirspace bundles up properties describing /// a controlled airspace. struct ControlledAirspace { std::string airspace_classification; ///< The classification of the ControlledAirspace. }; /// SpecialUseAirspace bundles up properties describing /// a special use airspace. struct SpecialUseAirspace { /// Type enumerates all known special-purpose types. enum class Type {}; Type type; ///< The type of the SpecialUseAirspace. }; /// TemporaryFlightRestriction describes an airspace that /// modelling a temporary restriction of the airspace. struct TemporaryFlightRestriction { /// Type enumerates all known types of temporary flight restrictions. enum class Type {}; std::string url; ///< The URL providing further information about the temporary flight restriction. Type type; ///< The type of the temporary flight restriction. std::string reason; ///< The reason for the temporary flight restriction. }; /// Wildfire describes an airspace around a wildfire. struct Wildfire { std::string effective_date; }; /// Park describes an airspace over a park. struct Park {}; /// Prison describes an airspace over a prison. struct Prison {}; /// School describes an airspace over a school. struct School {}; /// Hospital describes an airspace over a hospital. struct Hospital {}; /// Fire describes an airspace over a fire. struct Fire {}; /// Emergency describes an airspace over an emergency situation. struct Emergency {}; /// Heliport describes an airspace around a heliport. struct Heliport { /// Usage enumerates all known usages of a heliport. enum class Usage {}; std::string faa_id; ///< The FAA id of the heliport. std::string phone; ///< The phone number of the heliport. Usage usage; ///< The usages supported by the heliport. }; /// PowerPlant describes the airspace around a power plant. struct PowerPlant { std::string technology; ///< The technology used by the power plant. std::uint64_t code; ///< Official number of the power plant. }; /// RelatedGeometry bundles up a geometry related to an airspace. struct RelatedGeometry { std::string id; ///< The unique id of the geometry in the context of AirMap. Geometry geometry; ///< The actual geometry. }; /// Enumerates all known airspace types. enum class Type { invalid = 0, airport = 1 << 0, controlled_airspace = 1 << 1, special_use_airspace = 1 << 2, tfr = 1 << 3, wildfire = 1 << 4, park = 1 << 5, power_plant = 1 << 6, heliport = 1 << 7, prison = 1 << 8, school = 1 << 9, hospital = 1 << 10, fire = 1 << 11, emergency = 1 << 12, all = airport | controlled_airspace | special_use_airspace | tfr | wildfire | park | power_plant | heliport | prison | school | hospital | fire | emergency }; using Id = std::string; /// @cond Airspace(); Airspace(const Airspace &rhs); ~Airspace(); Airspace &operator=(const Airspace &rhs); bool operator==(const Airspace &rhs) const; bool operator!=(const Airspace &rhs) const; /// @endcond /// id returns an immutable reference to the unique idd /// of this airspace. const Id &id() const; /// set_id adjusts the unique id of this airspace to id. void set_id(const Id &id); /// name returns an immutable reference to the /// human-readable name of this airspace. const std::string &name() const; /// set_name adjusts the name of this airspace to name. void set_name(const std::string &name); /// type returns the Type of this airspace instance. Type type() const; /// country returns an immutable reference to the name of the country /// that the airspace belongs to. const std::string &country() const; /// set_country adjusts the name of the country that this airspace instance belongs to. void set_country(const std::string &country); /// state returns an immutable reference to the name of the state /// that the airspace belongs to. const std::string &state() const; /// set_state adjusts the name of the state that this airspace instance belongs to. void set_state(const std::string &state); /// city returns an immutable reference to the name of the city /// that the airspace belongs to. const std::string &city() const; /// set_city adjusts the name of the city that this airspace instance belongs to. void set_city(const std::string &city); /// last_updated returns an immutable reference to the timestamp of the last update /// to this airspace instance. const Timestamp &last_updated() const; /// set_last_updated adjusts the timestamp of the last update to this airspace to /// 'timestamp'. void set_last_updated(const Timestamp ×tamp); /// geometry returns an immutable reference to the geometry of this airspace instance. const Geometry &geometry() const; /// set_geometry adjusts the geometry of this airspace instance to 'geometry'. void set_geometry(const Geometry &geometry); /// related_geometries returns an immutable reference to all geometries associated with /// this airspace instance. const std::map &related_geometries() const; /// set_related_geometries adjusts the geometries associated with this airspace instance /// to 'geometry'. void set_related_geometries(const std::map &geometries); /// rules returns an immutable reference to the rules applying to this airspace instance. const std::vector &rules() const; /// set_rules adjusts the rules applying to this airspace instance to 'rules. void set_rules(const std::vector &rules); /// details_for_airport returns an immutable reference to the details /// further describing this airspace instance. const Airport &details_for_airport() const; /// details_for_airport returns a mutable reference to the details /// further describing this airspace instance. Airport &details_for_airport(); /// details_for_controlled_airspace returns an immutable reference to the details /// further describing this airspace instance. const ControlledAirspace &details_for_controlled_airspace() const; /// details_for_controlled_airspace returns a mutable reference to the details /// further describing this airspace instance. ControlledAirspace &details_for_controlled_airspace(); /// details_for_emergency returns an immutable reference to the details /// further describing this airspace instance. const Emergency &details_for_emergency() const; /// details_for_emergency returns a mutable reference to the details /// further describing this airspace instance. Emergency &details_for_emergency(); /// details_for_fire returns an immutable reference to the details /// further describing this airspace instance. const Fire &details_for_fire() const; /// details_for_fire returns a mutable reference to the details /// further describing this airspace instance. Fire &details_for_fire(); /// details_for_heliport returns an immutable reference to the details /// further describing this airspace instance. const Heliport &details_for_heliport() const; /// details_for_heliport returns a mutable reference to the details /// further describing this airspace instance. Heliport &details_for_heliport(); /// details_for_hospital returns an immutable reference to the details /// further describing this airspace instance. const Hospital &details_for_hospital() const; /// details_for_hospital returns a mutable reference to the details /// further describing this airspace instance. Hospital &details_for_hospital(); /// details_for_park returns an immutable reference to the details /// further describing this airspace instance. const Park &details_for_park() const; /// details_for_park returns a mutable reference to the details /// further describing this airspace instance. Park &details_for_park(); /// details_for_power_plant returns an immutable reference to the details /// further describing this airspace instance. const PowerPlant &details_for_power_plant() const; /// details_for_power_plant returns a mutable reference to the details /// further describing this airspace instance. PowerPlant &details_for_power_plant(); /// details_for_prison returns an immutable reference to the details /// further describing this airspace instance. const Prison &details_for_prison() const; /// details_for_prison returns a mutable reference to the details /// further describing this airspace instance. Prison &details_for_prison(); /// details_for_school returns an immutable reference to the details /// further describing this airspace instance. const School &details_for_school() const; /// details_for_school returns a mutable reference to the details /// further describing this airspace instance. School &details_for_school(); /// details_for_special_use_airspace returns an immutable reference to the details /// further describing this airspace instance. const SpecialUseAirspace &details_for_special_use_airspace() const; /// details_for_special_use_airspace returns a mutable reference to the details /// further describing this airspace instance. SpecialUseAirspace &details_for_special_use_airspace(); /// details_for_temporary_flight_restriction returns an immutable reference to the details /// further describing this airspace instance. const TemporaryFlightRestriction &details_for_temporary_flight_restriction() const; /// details_for_temporary_flight_restriction returns a mutable reference to the details /// further describing this airspace instance. TemporaryFlightRestriction &details_for_temporary_flight_restriction(); /// details_for_wildfire returns an immutable reference to the details /// further describing this airspace instance. const Wildfire &details_for_wildfire() const; /// details_for_wildfire returns an immutable reference to the details /// further describing this airspace instance. Wildfire &details_for_wildfire(); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const Airspace &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const Airport &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const ControlledAirspace &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const SpecialUseAirspace &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const TemporaryFlightRestriction &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const Wildfire &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const Park &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const PowerPlant &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const Heliport &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const Prison &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const School &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const Hospital &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const Fire &detail); /// set_details adjusts the details of this airspace instance to 'detail'. void set_details(const Emergency &detail); private: struct Invalid {}; union Details { Details(); ~Details(); Invalid invalid; Airport airport; ControlledAirspace controlled_airspace; Emergency emergency; Fire fire; Heliport heliport; Hospital hospital; Park park; PowerPlant power_plant; Prison prison; School school; SpecialUseAirspace special_use_airspace; TemporaryFlightRestriction tfr; Wildfire wildfire; }; void reset(); Id id_; std::string name_; Type type_; std::string country_; // TODO(tvoss): Investigate constraints on country names. std::string state_; // TODO(tvoss): Investigate constraints on state names. std::string city_; Timestamp last_updated_; Geometry geometry_; std::map related_geometries_; std::vector rules_; Details details_; }; /// @cond bool operator==(const Airspace::RelatedGeometry &lhs, const Airspace::RelatedGeometry &rhs); bool operator==(const Airspace::Airport &lhs, const Airspace::Airport &rhs); bool operator==(const Airspace::Airport::Runway &lhs, const Airspace::Airport::Runway &rhs); bool operator==(const Airspace::ControlledAirspace &lhs, const Airspace::ControlledAirspace &rhs); bool operator==(const Airspace::SpecialUseAirspace &lhs, const Airspace::SpecialUseAirspace &rhs); bool operator==(const Airspace::TemporaryFlightRestriction &lhs, const Airspace::TemporaryFlightRestriction &rhs); bool operator==(const Airspace::Wildfire &lhs, const Airspace::Wildfire &rhs); bool operator==(const Airspace::Park &lhs, const Airspace::Park &rhs); bool operator==(const Airspace::Prison &lhs, const Airspace::Prison &rhs); bool operator==(const Airspace::School &lhs, const Airspace::School &rhs); bool operator==(const Airspace::Hospital &lhs, const Airspace::Hospital &rhs); bool operator==(const Airspace::Fire &lhs, const Airspace::Fire &rhs); bool operator==(const Airspace::Emergency &lhs, const Airspace::Emergency &rhs); bool operator==(const Airspace::Heliport &lhs, const Airspace::Heliport &rhs); bool operator==(const Airspace::PowerPlant &lhs, const Airspace::PowerPlant &rhs); Airspace::Type operator~(Airspace::Type); Airspace::Type operator|(Airspace::Type, Airspace::Type); Airspace::Type operator&(Airspace::Type, Airspace::Type); std::ostream &operator<<(std::ostream &, const Airspace &); std::ostream &operator<<(std::ostream &, Airspace::Type); /// @endcond } // namespace airmap #endif // AIRMAP_AIRSPACE_H_