string: add string_less comparator
This commit is contained in:
parent
ed8db05fed
commit
46c2153434
21
string.hpp
21
string.hpp
@ -11,6 +11,10 @@
|
|||||||
#include "debug.hpp"
|
#include "debug.hpp"
|
||||||
#include "view.hpp"
|
#include "view.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
|
||||||
namespace cruft {
|
namespace cruft {
|
||||||
std::string to_utf8 (const wchar_t*);
|
std::string to_utf8 (const wchar_t*);
|
||||||
std::string to_utf8 (const std::wstring&);
|
std::string to_utf8 (const std::wstring&);
|
||||||
@ -194,4 +198,21 @@ namespace cruft {
|
|||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
/// A comparator for string-like objects that uses strcmp rather than
|
||||||
|
/// pointer comparison.
|
||||||
|
///
|
||||||
|
/// TODO: handle string and string_view objects
|
||||||
|
struct string_less {
|
||||||
|
template <
|
||||||
|
typename CharT,
|
||||||
|
typename = std::void_t<typename std::char_traits<CharT>::char_type>
|
||||||
|
>
|
||||||
|
bool operator() (CharT const *a, CharT const *b) const noexcept
|
||||||
|
{
|
||||||
|
return strcmp (a, b) < 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@ -143,6 +143,27 @@ test_contains (cruft::TAP::logger &tap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
void test_comparator (cruft::TAP::logger &tap)
|
||||||
|
{
|
||||||
|
cruft::string_less cmp;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
char const *a;
|
||||||
|
char const *b;
|
||||||
|
bool less;
|
||||||
|
char const *message;
|
||||||
|
} const TESTS[] = {
|
||||||
|
{ "a", "b", true, "single char less-than" },
|
||||||
|
{ "b", "a", false, "single char not-less-than" },
|
||||||
|
{ "a", "aa", true, "single/double char less-than" },
|
||||||
|
};
|
||||||
|
|
||||||
|
for (auto const &t: TESTS)
|
||||||
|
tap.expect_eq (cmp (t.a, t.b), t.less, "string_less, %!", t.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
int
|
int
|
||||||
main (int, char**)
|
main (int, char**)
|
||||||
@ -152,6 +173,7 @@ main (int, char**)
|
|||||||
test_tokeniser (tap);
|
test_tokeniser (tap);
|
||||||
test_position (tap);
|
test_position (tap);
|
||||||
test_contains (tap);
|
test_contains (tap);
|
||||||
|
test_comparator (tap);
|
||||||
|
|
||||||
return tap.status ();
|
return tap.status ();
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user