Explorar el Código

core: fix less-than operator

Daniele Bartolini hace 5 años
padre
commit
93f5476220
Se han modificado 2 ficheros con 42 adiciones y 2 borrados
  1. 10 2
      src/core/strings/string_view.inl
  2. 32 0
      src/core/unit_tests.cpp

+ 10 - 2
src/core/strings/string_view.inl

@@ -60,10 +60,18 @@ inline bool operator==(const StringView& a, const StringView& b)
 		;
 }
 
+inline bool operator!=(const StringView& a, const StringView& b)
+{
+	return a._length != b._length
+		|| strncmp(a._data, b._data, a._length) != 0
+		;
+}
+
 inline bool operator<(const StringView& a, const StringView& b)
 {
-	const u32 len = max(a._length, b._length);
-	return strncmp(a._data, b._data, len) < 0;
+	const u32 len = min(a._length, b._length);
+	const int cmp = strncmp(a._data, b._data, len);
+	return cmp < 0 || (cmp == 0 && a._length < b._length);
 }
 
 } // namespace crown

+ 32 - 0
src/core/unit_tests.cpp

@@ -35,6 +35,7 @@
 #include "core/strings/dynamic_string.inl"
 #include "core/strings/string.inl"
 #include "core/strings/string_id.inl"
+#include "core/strings/string_view.inl"
 #include "core/thread/thread.h"
 #include "core/time.h"
 #include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE
@@ -996,6 +997,36 @@ static void test_dynamic_string()
 		ENSURE(str.length() == 16);
 		ENSURE(strcmp(str.c_str(), "2f4a8724618f4c63") == 0);
 	}
+
+static void test_string_view()
+{
+	memory_globals::init();
+	{
+		const char* str = "foo";
+		StringView sv(str);
+		ENSURE(sv._length == 3);
+		ENSURE(sv._data == &str[0]);
+	}
+	{
+		StringView sv1("foo");
+		StringView sv2("foo");
+		ENSURE(sv1 == sv2);
+	}
+	{
+		StringView sv1("foo");
+		StringView sv2("bar");
+		ENSURE(sv1 != sv2);
+	}
+	{
+		StringView sv1("bar");
+		StringView sv2("foo");
+		ENSURE(sv1 < sv2);
+	}
+	{
+		StringView sv1("foo");
+		StringView sv2("fooo");
+		ENSURE(sv1 < sv2);
+	}
 	memory_globals::shutdown();
 }
 
@@ -1457,6 +1488,7 @@ int main_unit_tests()
 	RUN_TEST(test_murmur);
 	RUN_TEST(test_string_id);
 	RUN_TEST(test_dynamic_string);
+	RUN_TEST(test_string_view);
 	RUN_TEST(test_guid);
 	RUN_TEST(test_json);
 	RUN_TEST(test_sjson);