#pragma once /* MOUNT CONTROL COMPONENTS LIBRARY */ /* ASTROMETRY ENGINE CONCEPT */ #include #include "mcc_traits.h" namespace mcc::traits { template concept mcc_astrom_engine_c = requires(T t, const T t_const) { typename T::engine_err_t; typename T::engine_state_t; requires std::movable; typename T::coord_t; typename T::prop_motion_t; typename T::parallax_t; typename T::time_point_t; typename T::juldate_t; typename T::gst_t; typename T::pa_t; typename T::eo_t; typename T::refract_result_t; { t.setState(std::declval()) }; { t_const.getState() } -> std::same_as; { t_const.errorString(std::declval()) } -> mcc_formattable; /* coordinates conversional methods */ // ICRS RA and DEC to observed place: icrs2obs(ra, dec, pra, pdec, plx, jd, ra_app, dec_app, ha, az, alt, eo) { t.icrs2obs(std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval()) } -> std::same_as; // compute hour angle and declination from azimuth and altitude: hadec2azalt(ha, dec, az, alt) { t.hadec2azalt(std::declval(), std::declval(), std::declval(), std::declval()) } -> std::same_as; // compute azimuth and altitude from hour angle and declination: azalt2hadec(az, alt, ha, dec) { t.azalt2hadec(std::declval(), std::declval(), std::declval(), std::declval()) } -> std::same_as; // compute paralactic angle: hadec2pa(ha, dec, pa) { t.hadec2pa(std::declval(), std::declval(), std::declval()) } -> std::same_as; /* time-related methods */ // Gregorian Calendar time point to Julian Date: greg2jul(time_point, jd) { t.greg2jul(std::declval(), std::declval()) } -> std::same_as; // requires mcc_systime_c>; // requires mcc_output_arg_c, typename T::juldate_t>; // apparent sideral time: apparentSiderTime(jd, gst, islocal) { t.apparentSiderTime(std::declval(), std::declval(), std::declval()) } -> std::same_as; // equation of origins { t.eqOrigins(std::declval(), std::declval()) } -> std::same_as; /* atmospheric refraction-related methods */ { t.refraction(std::declval()) } -> std::same_as; }; } // namespace mcc::traits