1#ifndef MAIDENHEAD_HPP__
2#define MAIDENHEAD_HPP__
14constexpr char16_t normalize(
char16_t const u)
noexcept {
15 return (u >= u
'a' && u <= u
'z') ? u - (u
'a' - u
'A') : u;
18static_assert(normalize(u
'0') == u
'0');
19static_assert(normalize(u
'A') == u
'A');
20static_assert(normalize(u
'Z') == u
'Z');
21static_assert(normalize(u
'a') == u
'A');
22static_assert(normalize(u
'z') == u
'Z');
43constexpr auto invalidIndex(QStringView
const view)
noexcept {
58 auto const size = view.size();
60 for (qsizetype i = 0; i < size; ++i) {
61 auto const u = normalize(view[i].unicode());
66 if (u >= u
'A' && u <= u
'R')
75 if (u >= u
'0' && u <= u
'9')
82 if (u >= u
'A' && u <= u
'X')
92static_assert(invalidIndex(u
"") == 0);
93static_assert(invalidIndex(u
"S") == 0);
94static_assert(invalidIndex(u
"AZ") == 1);
95static_assert(invalidIndex(u
"AAA") == 2);
96static_assert(invalidIndex(u
"AA00AA00AA00A") == 12);
102template <qsizetype Min = 2, qsizetype Max = 6>
103constexpr auto valid(QStringView
const view)
noexcept {
104 static_assert(Min >= 1 && Max >= 1 && Max <= 6 && Min <= Max);
106 if (
auto const size = view.size();
107 !(size & 1) && (size >= 2 * Min) && (size <= 2 * Max)) {
108 return invalidIndex(view) == size;
114static_assert(valid(u
"AA00"));
115static_assert(valid(u
"AA00AA"));
116static_assert(valid(u
"AA00AA00"));
117static_assert(valid(u
"BP51AD95RF"));
118static_assert(valid(u
"BP51AD95RF00"));
119static_assert(valid(u
"aa00"));
120static_assert(valid(u
"AA00aa"));
121static_assert(valid(u
"RR00XX"));
123static_assert(!valid(u
""));
124static_assert(!valid(u
"A"));
125static_assert(!valid(u
"0"));
126static_assert(!valid(u
"AA00 "));
127static_assert(!valid(u
"AA00 "));
128static_assert(!valid(u
"AA00 "));
129static_assert(!valid(u
" AA00"));
130static_assert(!valid(u
" AA00"));
131static_assert(!valid(u
"00"));
132static_assert(!valid(u
"aa00a"));
133static_assert(!valid(u
"AA00ZZA"));
134static_assert(!valid(u
"!@#$%^"));
135static_assert(!valid(u
"123456"));
136static_assert(!valid(u
"AA00ZZ"));
137static_assert(!valid(u
"ss00XX"));
138static_assert(!valid(u
"rr00yy"));
139static_assert(!valid(u
"AAA1aa"));
140static_assert(!valid(u
"BP51AD95RF00A"));
141static_assert(!valid(u
"BP51AD95RF0000"));
150template <qsizetype Min, qsizetype Max>
152 static_assert(Min >= 1 && Max >= 1 && Max <= 6 && Min <= Max);
154 using QValidator::QValidator;
156 State validate(QString &input,
int &pos)
const override {
159 input = input.toUpper();
160 auto const size = input.size();
173 if (
auto const index = invalidIndex(input); index != size) {
174 return index < pos ? Invalid : Intermediate;
180 return ((size & 1) || (size < Min * 2)) ? Intermediate : Acceptable;
Definition Maidenhead.h:151