Spent far too much time fixing <=> to operate over ranges
This commit is contained in:
parent
4e671723fe
commit
97c98cf1e5
2
app.h
2
app.h
@ -47,7 +47,7 @@ static constexpr wxCmdLineEntryDesc g_cmdLineDesc[] =
|
||||
"If the log is displayed, then does not exit on completion of unit test.",
|
||||
wxCMD_LINE_VAL_NONE, wxCMD_LINE_SWITCH_NEGATABLE},
|
||||
{ wxCMD_LINE_SWITCH, "f", "focus", "-f or --focus causes focus events to be logged for debugging purposes. "
|
||||
"Usually used as -lf or -lft, as logging them without displaying them is useless.",
|
||||
"implies log",
|
||||
wxCMD_LINE_VAL_NONE, wxCMD_LINE_SWITCH_NEGATABLE},
|
||||
{ wxCMD_LINE_PARAM, "", "", "mywallet.wallet",
|
||||
wxCMD_LINE_VAL_NONE, /*wxCMD_LINE_PARAM_MULTIPLE|*/wxCMD_LINE_PARAM_OPTIONAL},
|
||||
|
@ -83,10 +83,12 @@ try {
|
||||
m_pLogWindow->GetFrame()->SetName(sz_unit_test_log);
|
||||
m_pLogWindow->GetFrame()->SetIcon(wxICON(AAArho));
|
||||
if (singletonApp->m_unit_test) {
|
||||
wxLogMessage(_T("Command line specified unit test with%s exit on completion of unit test."),
|
||||
wxLogMessage(_T("Command line specified %s unit test with%s exit on completion of unit test."),
|
||||
singletonApp->m_complete_unit_test?_T("complete"): singletonApp->m_quick_unit_test?_T("quick"):_T(""),
|
||||
singletonApp->m_display ? _T("out") : _T(""));
|
||||
wxLogMessage(_T("If an error occurs during unit test, the program will return a non zero "
|
||||
"error number on exit."));
|
||||
wxLogMessage(_T(""));
|
||||
}
|
||||
}else {
|
||||
wxLog::EnableLogging(false);
|
||||
@ -97,7 +99,10 @@ try {
|
||||
wxEVT_IDLE,
|
||||
&UnitTest
|
||||
);
|
||||
if (singletonApp->m_log_focus_events)wxLogMessage(_T("Logging focus events"));
|
||||
if (singletonApp->m_log_focus_events) {
|
||||
wxLogMessage(_T("Logging focus events"));
|
||||
wxLogMessage(_T(""));
|
||||
}
|
||||
if (singletonApp->m_params.empty()) {
|
||||
wxLogMessage(_T("No wallet specified. Attempting to open last used wallet"));
|
||||
}else {
|
||||
|
@ -59,7 +59,61 @@ namespace ro {
|
||||
junction<has_constructor<T, _Types>...>::value;
|
||||
}
|
||||
|
||||
std::span<byte>& operator^=(std::span<byte>& lhs, byte* rhs) {
|
||||
for (auto& j : lhs) { j ^= *rhs++; }
|
||||
return lhs;
|
||||
/*spaceship operator for any pair of types that take an index
|
||||
*
|
||||
* noexistent values of the shorter array are considered zero if of
|
||||
* arithmetic type, otherwise, considered greater than zero */
|
||||
template<class T, class U >
|
||||
decltype(std::declval<T>()[0] <=> std::declval<U>()[0]) operator <=> (
|
||||
const T& lh, const U& rh
|
||||
) {
|
||||
typedef decltype(lh[0] <=> rh[0]) spaceship_return_type;
|
||||
auto slh{ std::span(lh) };
|
||||
auto srh{ std::span(rh) };
|
||||
auto minsize{ std::min(slh.size(), srh.size()) };
|
||||
spaceship_return_type retval{ spaceship_return_type::equivalent };
|
||||
auto plh{ slh.begin() };
|
||||
auto prh{ srh.begin() };
|
||||
auto common_end{ plh + minsize };
|
||||
while (
|
||||
plh < common_end
|
||||
&&
|
||||
(
|
||||
std::is_eq(retval = plh[0] <=> prh[0])
|
||||
)
|
||||
) {
|
||||
plh++;
|
||||
prh++;
|
||||
}
|
||||
if (std::is_eq(retval)) {
|
||||
if (slh.size() > srh.size()) {
|
||||
assert(prh == srh.end() && plh < slh.end());
|
||||
if constexpr (std::is_arithmetic<std::remove_cvref<decltype(std::declval<T>()[0])>::type>::value) {
|
||||
while (
|
||||
plh < slh.end()
|
||||
&& std::is_eq(retval = plh[0] <=> 0)
|
||||
) {
|
||||
plh++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retval = spaceship_return_type::greater;
|
||||
}
|
||||
}
|
||||
if (slh.size() < srh.size()) {
|
||||
assert(plh == slh.end() && prh < srh.end());
|
||||
if constexpr (std::is_arithmetic<std::remove_cvref<decltype(std::declval<U>()[0])>::type>::value) {
|
||||
while (
|
||||
prh < srh.end()
|
||||
&& std::is_eq(retval = prh[0] <=> 0)
|
||||
) {
|
||||
prh++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
retval = spaceship_return_type::less;
|
||||
}
|
||||
}
|
||||
}
|
||||
return retval;
|
||||
}
|
@ -26,6 +26,8 @@ namespace testbed {
|
||||
and can safely be thrown away
|
||||
|
||||
This is a playground, where you can do stuff without worrying you might inadvertently break something that matters
|
||||
|
||||
No mechanism for input is available, but you generally do not need it because you hard code the testing data, but, of course, it can post a dialog using postmessage, then immediately return, and the dialog can then call anything.
|
||||
*/
|
||||
|
||||
void testbed() {
|
||||
|
Loading…
Reference in New Issue
Block a user