diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-07-23 15:09:19 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2021-07-23 15:09:19 +0100 |
commit | 5b17d5900cefe0f220554ff7a5235de308f2abbd (patch) | |
tree | ade7299492e227655fb67fb2828bb831a2e29c19 /test/rspamd_cxx_local_ptr.hxx | |
parent | e75e11f87bf6c7136d171fa14cb4b5f9509c52f4 (diff) | |
download | rspamd-5b17d5900cefe0f220554ff7a5235de308f2abbd.tar.gz rspamd-5b17d5900cefe0f220554ff7a5235de308f2abbd.zip |
[Minor] Add std::hash specialisation + tests
Diffstat (limited to 'test/rspamd_cxx_local_ptr.hxx')
-rw-r--r-- | test/rspamd_cxx_local_ptr.hxx | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/test/rspamd_cxx_local_ptr.hxx b/test/rspamd_cxx_local_ptr.hxx index 5b0554292..a9db65dc3 100644 --- a/test/rspamd_cxx_local_ptr.hxx +++ b/test/rspamd_cxx_local_ptr.hxx @@ -22,7 +22,36 @@ #include "libutil/cxx/local_shared_ptr.hxx" +namespace test_internal { +struct deleter_test { + bool *pv; + + deleter_test(bool &v) + { + v = false; + pv = &v; + } + + ~deleter_test() + { + *pv = true; + } +}; +} + +namespace std { +template<> +struct std::hash<test_internal::deleter_test> { + inline auto operator()(const test_internal::deleter_test &) const noexcept -> auto + { + return 42; + } +}; +} + TEST_SUITE("local_ptr") { +using namespace test_internal; + TEST_CASE("shared_ptr from nullptr") { rspamd::local_shared_ptr<int const> pi(static_cast<int *>(nullptr)); @@ -118,16 +147,6 @@ TEST_CASE("shared_ptr move") CHECK(pi.use_count() != pi2.use_count()); } -struct deleter_test { - bool *pv; - deleter_test(bool &v) { - v = false; - pv = &v; - } - ~deleter_test() { - *pv = true; - } -}; TEST_CASE("shared_ptr dtor") { bool t; @@ -305,6 +324,17 @@ TEST_CASE("std::swap") { CHECK(t == true); } +TEST_CASE("std::hash") { + bool v; + deleter_test dt(v); + CHECK(std::hash<deleter_test>()(dt) == 42); + auto pi = rspamd::local_make_shared<deleter_test>(v); + rspamd::local_shared_ptr<deleter_test> pi1; + CHECK(std::hash<decltype(pi)>()(pi) == 42); + // No hash for nullptr, different from std::smart_pointers! + CHECK_THROWS(std::hash<decltype(pi)>()(pi1)); +} + } #endif //RSPAMD_RSPAMD_CXX_LOCAL_PTR_HXX |