diff --git a/AK/AKString.h b/AK/AKString.h index 70e0fb09172..b1e8b745476 100644 --- a/AK/AKString.h +++ b/AK/AKString.h @@ -132,6 +132,9 @@ public: bool operator==(const String&) const; bool operator!=(const String& other) const { return !(*this == other); } bool operator<(const String&) const; + bool operator<(const char*) const; + bool operator>=(const String& other) const { return !(*this < other); } + bool operator>=(const char* other) const { return !(*this < other); } bool operator==(const char* cstring) const { @@ -210,6 +213,22 @@ struct Traits : public GenericTraits { static void dump(const String& s) { kprintf("%s", s.characters()); } }; +inline bool operator<(const char* characters, const String& string) +{ + if (!characters) + return !string.is_null(); + + if (string.is_null()) + return false; + + return strcmp(characters, string.characters()) < 0; +} + +inline bool operator>=(const char* characters, const String& string) +{ + return !(characters < string); +} + } using AK::String; diff --git a/AK/Tests/TestVector.cpp b/AK/Tests/TestVector.cpp index 182a3acbe46..d8f8fa405c8 100644 --- a/AK/Tests/TestVector.cpp +++ b/AK/Tests/TestVector.cpp @@ -41,5 +41,21 @@ int main() } EXPECT_EQ(loop_counter, 2); + { + Vector strings; + strings.append("abc"); + strings.append("def"); + strings.append("ghi"); + + strings.insert_before_matching("f-g", [](auto& entry) { + return "f-g" < entry; + }); + + EXPECT_EQ(strings[0], "abc"); + EXPECT_EQ(strings[1], "def"); + EXPECT_EQ(strings[2], "f-g"); + EXPECT_EQ(strings[3], "ghi"); + } + return 0; } diff --git a/AK/Vector.h b/AK/Vector.h index ede02cafb88..2de470a3830 100644 --- a/AK/Vector.h +++ b/AK/Vector.h @@ -243,6 +243,18 @@ public: insert(index, T(value)); } + template + void insert_before_matching(T&& value, C callback) + { + for (int i = 0; i < size(); ++i) { + if (callback(at(i))) { + insert(i, move(value)); + return; + } + } + append(move(value)); + } + Vector& operator=(const Vector& other) { if (this != &other) {