cleanups of commented code

This commit is contained in:
2025-10-29 16:15:58 +03:00
parent bc300bb3de
commit 6a72ead855
7 changed files with 12 additions and 1094 deletions

View File

@@ -237,204 +237,6 @@ static constexpr std::array MCC_COMMPROTO_VALID_KEYS_HASH = []<size_t... Is>(std
}(std::make_index_sequence<MCC_COMMPROTO_VALID_KEYS.size()>());
static constexpr size_t MCC_COMMPROTO_KEYWORD_SERVER_ACK_HASH =
mcc::utils::FNV1aHash(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR);
static constexpr size_t MCC_COMMPROTO_KEYWORD_SERVER_ERROR_HASH =
mcc::utils::FNV1aHash(MCC_COMMPROTO_KEYWORD_SERVER_ERROR_STR);
static constexpr size_t MCC_COMMPROTO_KEYWORD_TARGET_HASH = mcc::utils::FNV1aHash(MCC_COMMPROTO_KEYWORD_TARGET_STR);
static constexpr size_t MCC_COMMPROTO_KEYWORD_MOUNT_HASH = mcc::utils::FNV1aHash(MCC_COMMPROTO_KEYWORD_MOUNT_STR);
template <traits::mcc_char_range T = std::string_view, std::ranges::output_range<T> RT = std::vector<T>>
struct mcc_netmsg_parse_result_t {
size_t keyword_hash;
T keyword;
RT params;
};
// network message parsing result class concept
template <typename T>
concept mcc_netmsg_parse_result_c = requires(T t) {
requires std::same_as<decltype(t.keyword_hash), size_t>; // hash of keyword
requires traits::mcc_char_range<decltype(t.keyword)>; // keyword char-range representation
// a range of parameters char-range representations
requires std::ranges::output_range<decltype(t.params), decltype(t.keyword)>;
};
// the function returns hash of message keyword
// if 'from_server' is true then given network message is considered as a server response, i.e.,
// valid keywords are "ACK" or "ERROR"
//
// the funtions returns false in the case of invalid message format and true otherwise
//
template <traits::mcc_input_char_range IR, mcc_netmsg_parse_result_c ResT>
bool mcc_parse_netmsg(const IR& netmsg, ResT& parse_res, bool from_server = false)
{
if (std::ranges::size(netmsg) == 0) {
return false;
};
auto found = std::ranges::search(netmsg, MCC_COMMPROTO_KEYPARAM_DELIM_SEQ);
if (std::distance(netmsg.begin(), found.begin()) == 0) {
return false;
}
const size_t hash = mcc::utils::FNV1aHash(netmsg.begin(), found.begin());
auto it = std::ranges::find(MCC_COMMPROTO_VALID_KEYS_HASH, hash);
if (it == MCC_COMMPROTO_VALID_KEYS_HASH.end()) {
return false;
}
if (from_server) { // only ACK or ERROR
auto ok = hash == MCC_COMMPROTO_VALID_KEYS_HASH[0] || hash == MCC_COMMPROTO_VALID_KEYS_HASH[1];
if (!ok) {
return false;
}
}
parse_res.keyword_hash = hash;
parse_res.keyword = {netmsg.begin(), found.begin()};
auto pars = netmsg | std::views::drop(std::distance(netmsg.begin(), found.end())) |
std::views::split(MCC_COMMPROTO_PARAMPARAM_DELIM_SEQ);
decltype(parse_res.params) res;
for (auto const& el : pars) { // parameters
std::back_inserter(res) = {el.begin(), el.end()};
}
parse_res.params = std::move(res);
return true;
}
// construct network message
// the function returns false if input keyword is not valid one (see MCC_COMMPROTO_VALID_KEYS)!
template <typename... PTs>
bool mcc_netmsg_construct(traits::mcc_output_char_range auto& msg,
traits::mcc_input_char_range auto const& keyword,
PTs... params)
{
const size_t hash = mcc::utils::FNV1aHash(keyword);
if (!std::ranges::contains(MCC_COMMPROTO_VALID_KEYS_HASH, hash)) {
return false;
}
msg = {keyword.begin(), keyword.end()};
if constexpr (sizeof...(PTs)) {
std::ranges::copy(MCC_COMMPROTO_KEYPARAM_DELIM_SEQ, std::back_inserter(msg));
[&msg]<typename T, typename... Ts>(this auto&& self, const T& par, const Ts&... pars) {
if constexpr (std::is_arithmetic_v<T>) {
std::ranges::copy(std::to_string(par), std::back_inserter(msg));
} else if constexpr (std::convertible_to<T, std::string>) {
std::ranges::copy(static_cast<std::string>(par), std::back_inserter(msg));
} else if constexpr (std::constructible_from<std::string, T>) {
std::ranges::copy(std::string(par), std::back_inserter(msg));
} else if constexpr (traits::mcc_char_range<T>) {
std::ranges::copy(std::string(par.begin(), par.end()), std::back_inserter(msg));
} else if constexpr (std::same_as<T, MccCoordPairKind>) {
std::ranges::copy(mcc_pairkind2str(par), std::back_inserter(msg));
} else {
static_assert(false, "UNSUPPORTED TYPE!!!");
}
if constexpr (sizeof...(Ts)) {
std::ranges::copy(MCC_COMMPROTO_PARAMPARAM_DELIM_SEQ, std::back_inserter(msg));
std::forward<decltype(self)>(self)(pars...);
}
}(params...);
}
return true;
}
// the function convert given network message parsing result class to
// celestial point coordinates according to parsed message parameters.
//
// It is assumed that the coordinates and their type are contained in the consecutive elements of the input array
// starting from the element 'from_idx' (zero-based):
//
// parse_res.params[..., X-COORD, Y-COORD, XY-KIND, ...]
//
// th last parameter 'XY-KIND' can be omitted and, in this case, 'default_kind' is assumed
//
// NOTE: IT IS ASSUMED THAT THE COORDINATES ARE REPRESENTED AS DEGREES EXPRESSED BY THE NUMBER WITH A FLOATING POINT
// OR IN SEXAGESIMAL FORM. IN THE CASE OF SEXAGESIMAL FORM THE TYPE (DEGREES OR HOURS) OF THE COORDINATE
// REPRESENTATION IS DETERMINED BY 'XY-KIND', E.G.:
// parse_res.params[..., "12:34:52.123", "23:43:56.12", "HADEC", ...]
// 'HADEC' STRING FOR 'XY-KIND' DETERMINES THE FIRST COORDINATE (HOUR ANGLE)
// AS AN ANGLE IN HOUR FORM WHILE THE SECOND ONE (DECLINATION) IN DEGREES
//
//
// The function returns false if it can not convert coordinate string to number or the 'XY-KIND' string is invalid
//
bool mcc_netmsg_get_cpoint(mcc_netmsg_parse_result_c auto const& parse_res,
size_t from_idx,
mcc_celestial_point_c auto& cpoint,
MccCoordPairKind default_kind)
requires std::ranges::contiguous_range<decltype(parse_res.keyword)>
{
if (std::ranges::size(parse_res.params) < (from_idx + 2)) {
return false;
}
MccCoordPairKind kind = default_kind;
if (std::ranges::size(parse_res.params) > (from_idx + 2)) {
kind = mcc_str2pairkind(parse_res.params[from_idx + 2]);
if (kind == MccCoordPairKind::COORDS_KIND_GENERIC) {
return false;
}
}
std::optional<double> ang1, ang2;
switch (kind) {
case mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS:
case mcc::MccCoordPairKind::COORDS_KIND_RADEC_APP:
case mcc::MccCoordPairKind::COORDS_KIND_HADEC_APP:
ang1 = mcc::utils::parsAngleString(parse_res.params[from_idx], true);
break;
default:
ang1 = mcc::utils::parsAngleString(parse_res.params[from_idx]);
}
if (!ang1) {
return false;
}
ang2 = mcc::utils::parsAngleString(parse_res.params[from_idx + 1]);
if (!ang2) {
return false;
}
if (kind != mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
mcc_tp2tp(std::chrono::system_clock::now(), cpoint.time_point);
} else {
// J2000.0: 11:58:55.816 1 January 2000 UTC
auto tp = std::chrono::sys_days(std::chrono::year_month_day(std::chrono::January / std::chrono::day(1) /
std::chrono::year(2000))) +
std::chrono::hours(11) + std::chrono::minutes(58) + std::chrono::milliseconds(55816);
mcc_tp2tp(tp, cpoint.time_point);
}
cpoint.pair_kind = kind;
cpoint.X = MccAngle(ang1.value(), mcc::MccDegreeTag{}); // to radians
cpoint.Y = MccAngle(ang2.value(), mcc::MccDegreeTag{}); // to radians
return true;
}
template <typename T>
concept mcc_netmsg_valid_keys_c = requires(T t) {