Simplify zeroing callsign on copy-in

Zero the entire array, then overwrite the leading portion with the
received data.  This permits the compiler to do a fixed number of large
stores, instead of a variable number of small stores.
This commit is contained in:
Kp 2022-05-10 01:58:55 +00:00
parent 887851cb99
commit 7b7145f20a

View file

@ -28,24 +28,23 @@ struct callsign_t
{
return std::tolower(static_cast<unsigned>(c));
}
callsign_t &zero_terminate(array_t::iterator i)
{
std::fill(i, end(a), 0);
return *this;
}
callsign_t &copy(const char *s, std::size_t N)
{
return zero_terminate(std::copy_n(s, std::min(a.size() - 1, N), begin(a)));
a = {};
std::copy_n(s, std::min(a.size() - 1, N), begin(a));
return *this;
}
callsign_t &copy_lower(const char *s, std::size_t N)
{
return zero_terminate(std::transform(s, std::next(s, std::min(a.size() - 1, N)), begin(a), lower_predicate));
a = {};
std::transform(s, std::next(s, std::min(a.size() - 1, N)), begin(a), lower_predicate);
return *this;
}
void lower()
{
auto ba = begin(a);
std::transform(ba, std::prev(end(a)), ba, lower_predicate);
a.back() = 0;
std::transform(ba, std::prev(end(a)), ba, lower_predicate);
}
[[nodiscard]]
elements_t &buffer()