10#ifndef MAIDENHEAD_HPP__
11#define MAIDENHEAD_HPP__
35constexpr char16_t normalize(
char16_t const u)
noexcept {
36 return (u >= u
'a' && u <= u
'z') ? u - (u
'a' - u
'A') : u;
67 auto const size = view.size();
69 for (qsizetype i = 0; i < size; ++i) {
70 auto const u =
normalize(view[i].unicode());
75 if (u >= u
'A' && u <= u
'R')
84 if (u >= u
'0' && u <= u
'9')
91 if (u >= u
'A' && u <= u
'X')
118template <qsizetype Min = 2, qsizetype Max = 6>
119constexpr auto valid(QStringView
const view)
noexcept {
120 static_assert(Min >= 1 && Max >= 1 && Max <= 6 && Min <= Max);
122 if (
auto const size = view.size();
123 !(size & 1) && (size >= 2 * Min) && (size <= 2 * Max)) {
130static_assert(
valid(u
"AA00"));
131static_assert(
valid(u
"AA00AA"));
132static_assert(
valid(u
"AA00AA00"));
133static_assert(
valid(u
"BP51AD95RF"));
134static_assert(
valid(u
"BP51AD95RF00"));
135static_assert(
valid(u
"aa00"));
136static_assert(
valid(u
"AA00aa"));
137static_assert(
valid(u
"RR00XX"));
139static_assert(!
valid(u
""));
140static_assert(!
valid(u
"A"));
141static_assert(!
valid(u
"0"));
142static_assert(!
valid(u
"AA00 "));
143static_assert(!
valid(u
"AA00 "));
144static_assert(!
valid(u
"AA00 "));
145static_assert(!
valid(u
" AA00"));
146static_assert(!
valid(u
" AA00"));
147static_assert(!
valid(u
"00"));
148static_assert(!
valid(u
"aa00a"));
149static_assert(!
valid(u
"AA00ZZA"));
150static_assert(!
valid(u
"!@#$%^"));
151static_assert(!
valid(u
"123456"));
152static_assert(!
valid(u
"AA00ZZ"));
153static_assert(!
valid(u
"ss00XX"));
154static_assert(!
valid(u
"rr00yy"));
155static_assert(!
valid(u
"AAA1aa"));
156static_assert(!
valid(u
"BP51AD95RF00A"));
157static_assert(!
valid(u
"BP51AD95RF0000"));
169template <qsizetype Min, qsizetype Max>
171 static_assert(Min >= 1 && Max >= 1 && Max <= 6 && Min <= Max);
173 using QValidator::QValidator;
185 State validate(QString &input,
int &pos)
const override {
188 input = input.toUpper();
189 auto const size = input.size();
202 if (
auto const index =
invalidIndex(input); index != size) {
203 return index < pos ? Invalid : Intermediate;
209 return ((size & 1) || (size < Min * 2)) ? Intermediate : Acceptable;
Custom Qt validator for stateful UI evaluation of Maidenhead strings.
Definition Maidenhead.h:170
Namespace containing utilities for managing Maidenhead grid locators.
constexpr auto invalidIndex(QStringView const view) noexcept
Locates the first invalid character index in a locator string view.
Definition Maidenhead.h:66
constexpr char16_t normalize(char16_t const u) noexcept
Converts a lowercase character code point to uppercase if applicable.
Definition Maidenhead.h:35
Validator< 2, 6 > ExtendedValidator
Convenience validator permitting high fidelity sub-allocations up to Hyper Extended format.
Definition Maidenhead.h:227
Validator< 2, 3 > StandardValidator
Convenience validator requiring Field and Square, allowing Subsquare.
Definition Maidenhead.h:219
constexpr auto valid(QStringView const view) noexcept
Assesses whether a complete string view matches acceptable grid lengths and constraints.
Definition Maidenhead.h:119