aboutsummaryrefslogtreecommitdiff
path: root/absl/hash/hash_test.cc
diff options
context:
space:
mode:
authorDerek Mauro <dmauro@google.com>2023-11-15 18:02:49 -0800
committerCopybara-Service <copybara-worker@google.com>2023-11-15 18:03:30 -0800
commit3bd86026c93da5a40006fd53403dff9d5f5e30e3 (patch)
tree2bb708baea92a1ba2d90e0fcdb388b759aca451e /absl/hash/hash_test.cc
parent20f92b10d5ae1dc03592b4b6caafec7b0e161252 (diff)
downloadabseil-3bd86026c93da5a40006fd53403dff9d5f5e30e3.tar.gz
abseil-3bd86026c93da5a40006fd53403dff9d5f5e30e3.tar.bz2
abseil-3bd86026c93da5a40006fd53403dff9d5f5e30e3.zip
Provide AbslHashValue for std::filesystem::path in C++17
This is somewhat tricky to implement because path equality is not straightforward. See https://github.com/abseil/abseil-cpp/pull/1560#issuecomment-1799983471 for discussion. Closes #655 Closes #1560 PiperOrigin-RevId: 582863821 Change-Id: I03517a7f2003614c027c786abbfb91b6571ab662
Diffstat (limited to 'absl/hash/hash_test.cc')
-rw-r--r--absl/hash/hash_test.cc41
1 files changed, 41 insertions, 0 deletions
diff --git a/absl/hash/hash_test.cc b/absl/hash/hash_test.cc
index 111f375b..71874061 100644
--- a/absl/hash/hash_test.cc
+++ b/absl/hash/hash_test.cc
@@ -48,6 +48,10 @@
#include "absl/types/optional.h"
#include "absl/types/variant.h"
+#if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
+#include <filesystem> // NOLINT
+#endif
+
#ifdef ABSL_HAVE_STD_STRING_VIEW
#include <string_view>
#endif
@@ -480,6 +484,43 @@ TEST(HashValueTest, U32StringView) {
#endif
}
+TEST(HashValueTest, StdFilesystemPath) {
+#if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L
+ GTEST_SKIP() << "std::filesystem::path requires C++17";
+#else
+ EXPECT_TRUE((is_hashable<std::filesystem::path>::value));
+
+ // clang-format off
+ const auto kTestCases = std::make_tuple(
+ std::filesystem::path(),
+ std::filesystem::path("/"),
+#ifndef __GLIBCXX__
+ // libstdc++ has a known issue normalizing "//".
+ // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106452
+ std::filesystem::path("//"),
+#endif
+ std::filesystem::path("/a/b"),
+ std::filesystem::path("/a//b"),
+ std::filesystem::path("a/b"),
+ std::filesystem::path("a/b/"),
+ std::filesystem::path("a//b"),
+ std::filesystem::path("a//b/"),
+ std::filesystem::path("c:/"),
+ std::filesystem::path("c:\\"),
+ std::filesystem::path("c:\\/"),
+ std::filesystem::path("c:\\//"),
+ std::filesystem::path("c://"),
+ std::filesystem::path("c://\\"),
+ std::filesystem::path("/e/p"),
+ std::filesystem::path("/s/../e/p"),
+ std::filesystem::path("e/p"),
+ std::filesystem::path("s/../e/p"));
+ // clang-format on
+
+ EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(kTestCases));
+#endif
+}
+
TEST(HashValueTest, StdArray) {
EXPECT_TRUE((is_hashable<std::array<int, 3>>::value));