Commit c141f6ec authored by Sebastian Messmer's avatar Sebastian Messmer Committed by Facebook Github Bot

Specialise std::hash for folly::Optional

Summary: This allows using folly::Optional<T> in std::unordered_map and std::unordered_set.

Reviewed By: luciang

Differential Revision: D4469938

fbshipit-source-id: b86b1a4510379b337e9de83471a4aafce6d5a6cb
parent bcbc4ff5
......@@ -54,6 +54,7 @@
* }
*/
#include <cstddef>
#include <functional>
#include <new>
#include <stdexcept>
#include <type_traits>
......@@ -418,3 +419,16 @@ template<class V> bool operator> (const V& other, const Optional<V>&) = delete;
///////////////////////////////////////////////////////////////////////////////
} // namespace folly
// Allow usage of Optional<T> in std::unordered_map and std::unordered_set
FOLLY_NAMESPACE_STD_BEGIN
template <class T>
struct hash<folly::Optional<T>> {
size_t operator()(folly::Optional<T> const& obj) const {
if (!obj.hasValue()) {
return 0;
}
return hash<typename remove_const<T>::type>()(*obj);
}
};
FOLLY_NAMESPACE_STD_END
......@@ -18,14 +18,14 @@
#include <folly/Portability.h>
#include <folly/portability/GTest.h>
#include <memory>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <memory>
#include <string>
#include <type_traits>
#include <unordered_map>
#include <vector>
#include <glog/logging.h>
#include <boost/optional.hpp>
using std::unique_ptr;
......@@ -545,4 +545,12 @@ TEST(Optional, TriviallyDestructible) {
EXPECT_TRUE(std::is_trivially_destructible<Optional<int>>::value);
EXPECT_FALSE(std::is_trivially_destructible<Optional<WithDestructor>>::value);
}
TEST(Optional, Hash) {
// Test it's usable in std::unordered map (compile time check)
std::unordered_map<Optional<int>, Optional<int>> obj;
// Also check the std::hash template can be instantiated by the compiler
std::hash<Optional<int>>()(none);
std::hash<Optional<int>>()(3);
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment