libprocess: Added std::hash template specializations. Review: https://reviews.apache.org/r/37188
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/f665d957 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/f665d957 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/f665d957 Branch: refs/heads/master Commit: f665d957c79c008f20256497b784768b7d7f7d19 Parents: b091815 Author: Jan Schlicht <[email protected]> Authored: Thu Aug 27 14:08:07 2015 -0400 Committer: Michael Park <[email protected]> Committed: Thu Aug 27 14:08:08 2015 -0400 ---------------------------------------------------------------------- 3rdparty/libprocess/include/process/address.hpp | 28 +++++++++++++------- 3rdparty/libprocess/include/process/pid.hpp | 27 ++++++++++++++++--- 3rdparty/libprocess/src/pid.cpp | 12 --------- 3rdparty/libprocess/src/tests/http_tests.cpp | 28 ++++++++++++++------ 4 files changed, 62 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/f665d957/3rdparty/libprocess/include/process/address.hpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/include/process/address.hpp b/3rdparty/libprocess/include/process/address.hpp index df78f8e..e0fa179 100644 --- a/3rdparty/libprocess/include/process/address.hpp +++ b/3rdparty/libprocess/include/process/address.hpp @@ -142,17 +142,27 @@ inline std::ostream& operator<<(std::ostream& stream, const Address& address) return stream; } +} // namespace network { +} // namespace process { + +namespace std { -// Address hash value (for example, to use in Boost's unordered maps). -inline std::size_t hash_value(const Address& address) +template <> +struct hash<process::network::Address> { - size_t seed = 0; - boost::hash_combine(seed, address.ip); - boost::hash_combine(seed, address.port); - return seed; -} + typedef std::size_t result_type; -} // namespace network { -} // namespace process { + typedef process::network::Address argument_type; + + result_type operator()(const argument_type& address) const + { + size_t seed = 0; + boost::hash_combine(seed, std::hash<net::IP>()(address.ip)); + boost::hash_combine(seed, address.port); + return seed; + } +}; + +} // namespace std { #endif // __PROCESS_ADDRESS_HPP__ http://git-wip-us.apache.org/repos/asf/mesos/blob/f665d957/3rdparty/libprocess/include/process/pid.hpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/include/process/pid.hpp b/3rdparty/libprocess/include/process/pid.hpp index 8d3735c..2986e85 100644 --- a/3rdparty/libprocess/include/process/pid.hpp +++ b/3rdparty/libprocess/include/process/pid.hpp @@ -21,6 +21,8 @@ #include <sstream> #include <string> +#include <boost/functional/hash.hpp> + #include <process/address.hpp> #include <stout/ip.hpp> @@ -137,7 +139,7 @@ struct PID : UPID // Only allow upcasts! T* t = NULL; Base* base = t; - (void)base; // Eliminate unused base warning. + (void)base; // Eliminate unused base warning. PID<Base> pid; pid.id = id; pid.address = address; @@ -150,10 +152,27 @@ struct PID : UPID std::ostream& operator<<(std::ostream&, const UPID&); std::istream& operator>>(std::istream&, UPID&); +} // namespace process { + +namespace std { + +template <> +struct hash<process::UPID> +{ + typedef std::size_t result_type; + + typedef process::UPID argument_type; -// UPID hash value (for example, to use in Boost's unordered maps). -std::size_t hash_value(const UPID&); + result_type operator()(const argument_type& upid) const + { + size_t seed = 0; + boost::hash_combine(seed, upid.id); + boost::hash_combine(seed, std::hash<net::IP>()(upid.address.ip)); + boost::hash_combine(seed, upid.address.port); + return seed; + } +}; -} // namespace process { +} // namespace std { #endif // __PROCESS_PID_HPP__ http://git-wip-us.apache.org/repos/asf/mesos/blob/f665d957/3rdparty/libprocess/src/pid.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/pid.cpp b/3rdparty/libprocess/src/pid.cpp index f5528ae..a1731ae 100644 --- a/3rdparty/libprocess/src/pid.cpp +++ b/3rdparty/libprocess/src/pid.cpp @@ -25,8 +25,6 @@ #include <iostream> #include <string> -#include <boost/unordered_map.hpp> - #include <process/pid.hpp> #include <process/process.hpp> @@ -148,14 +146,4 @@ istream& operator>>(istream& stream, UPID& pid) return stream; } - -size_t hash_value(const UPID& pid) -{ - size_t seed = 0; - boost::hash_combine(seed, pid.id); - boost::hash_combine(seed, pid.address.ip); - boost::hash_combine(seed, pid.address.port); - return seed; -} - } // namespace process { http://git-wip-us.apache.org/repos/asf/mesos/blob/f665d957/3rdparty/libprocess/src/tests/http_tests.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/tests/http_tests.cpp b/3rdparty/libprocess/src/tests/http_tests.cpp index c22f9d3..d0b9399 100644 --- a/3rdparty/libprocess/src/tests/http_tests.cpp +++ b/3rdparty/libprocess/src/tests/http_tests.cpp @@ -791,15 +791,27 @@ TEST(URLTest, Stringification) query["foo"] = "bar"; query["baz"] = "bam"; - EXPECT_EQ("http://172.158.1.23:80/?baz=bam&foo=bar", - stringify(URL("http", ip.get(), 80, "/", query))); + // The order of the hashmap entries may vary, hence we have + // to check if one of the possible outcomes is satisfied. + const string url1 = stringify(URL("http", ip.get(), 80, "/", query)); - EXPECT_EQ("http://172.158.1.23:80/path?baz=bam&foo=bar", - stringify(URL("http", ip.get(), 80, "/path", query))); + EXPECT_TRUE(url1 == "http://172.158.1.23:80/?baz=bam&foo=bar" || + url1 == "http://172.158.1.23:80/?foo=bar&baz=bam"); - EXPECT_EQ("http://172.158.1.23:80/?baz=bam&foo=bar#fragment", - stringify(URL("http", ip.get(), 80, "/", query, "fragment"))); + const string url2 = stringify(URL("http", ip.get(), 80, "/path", query)); - EXPECT_EQ("http://172.158.1.23:80/path?baz=bam&foo=bar#fragment", - stringify(URL("http", ip.get(), 80, "/path", query, "fragment"))); + EXPECT_TRUE(url2 == "http://172.158.1.23:80/path?baz=bam&foo=bar" || + url2 == "http://172.158.1.23:80/path?foo=bar&baz=bam"); + + const string url3 = + stringify(URL("http", ip.get(), 80, "/", query, "fragment")); + + EXPECT_TRUE(url3 == "http://172.158.1.23:80/?baz=bam&foo=bar#fragment" || + url3 == "http://172.158.1.23:80/?foo=bar&baz=bam#fragment"); + + const string url4 = + stringify(URL("http", ip.get(), 80, "/path", query, "fragment")); + + EXPECT_TRUE(url4 == "http://172.158.1.23:80/path?baz=bam&foo=bar#fragment" || + url4 == "http://172.158.1.23:80/path?foo=bar&baz=bam#fragment"); }
