Commit d364aea0 authored by Peter Griess's avatar Peter Griess Committed by Dave Watson

Try again to fix hash<fbstring> namespacing

Summary:
- Unfortunately when D1152140 broke the Android build, which uses the
Bionic C++ standard library, and which Boost doesn't auto-detect. Deal
with this by manually picking namespaces for template specialization
based on #defines.

Test Plan:
- fbconfig -r folly/ unicorn/utils/ && fbmake runtests
- Build Liger on iOS and Android

Reviewed By: andrei.alexandrescu@fb.com

FB internal diff: D1154569

Blame Revision: D1152140
parent ad1086fc
......@@ -73,6 +73,11 @@
#include <bits/c++config.h>
#endif
#ifdef _GLIBCXX_SYMVER
#include <ext/hash_set>
#include <ext/hash_map>
#endif
#ifdef _LIBSTDCXX_FBSTRING
#pragma GCC system_header
......@@ -2439,21 +2444,53 @@ _GLIBCXX_END_NAMESPACE_VERSION
} // namespace folly
#pragma GCC diagnostic pop
#ifndef _LIBSTDCXX_FBSTRING
// Hash functions to make fbstring usable with e.g. hash_map
//
// Handle interaction with different C++ standard libraries, which
// expect these types to be in different namespaces.
namespace std {
template <class C>
struct hash<folly::basic_fbstring<C> > : private hash<const C*> {
size_t operator()(const folly::basic_fbstring<C> & s) const {
return hash<const C*>::operator()(s.c_str());
}
};
template <>
struct hash< ::folly::fbstring> {
size_t operator()(const ::folly::fbstring& s) const {
return ::folly::hash::fnv32_buf(s.data(), s.size());
}
};
}
#if defined(_GLIBCXX_SYMVER) && !defined(__BIONIC__)
namespace __gnu_cxx {
template <class C>
struct hash<folly::basic_fbstring<C> > : private hash<const C*> {
size_t operator()(const folly::basic_fbstring<C> & s) const {
return hash<const C*>::operator()(s.c_str());
}
};
template <>
struct hash< ::folly::fbstring> {
size_t operator()(const ::folly::fbstring& s) const {
return ::folly::hash::fnv32_buf(s.data(), s.size());
}
};
}
#endif // _GLIBCXX_SYMVER && !__BIONIC__
#endif // _LIBSTDCXX_FBSTRING
#pragma GCC diagnostic pop
#undef FBSTRING_DISABLE_ADDRESS_SANITIZER
#undef throw
#undef FBSTRING_LIKELY
......
......@@ -495,19 +495,24 @@ std::string join(const Delim& delimiter,
} // namespace folly
// Hash functions for string and fbstring usable with e.g. hash_map
// Hash functions to make std::string usable with e.g. hash_map
//
// We let Boost pick the namespace here for us, since it has logic to do the
// right thing based on the C++ standard library implementation being used.
namespace BOOST_STD_EXTENSION_NAMESPACE {
// Handle interaction with different C++ standard libraries, which
// expect these types to be in different namespaces.
namespace std {
template <class C>
struct hash<folly::basic_fbstring<C> > : private hash<const C*> {
size_t operator()(const folly::basic_fbstring<C> & s) const {
struct hash<std::basic_string<C> > : private hash<const C*> {
size_t operator()(const std::basic_string<C> & s) const {
return hash<const C*>::operator()(s.c_str());
}
};
}
#if defined(_GLIBCXX_SYMVER) && !defined(__BIONIC__)
namespace __gnu_cxx {
template <class C>
struct hash<std::basic_string<C> > : private hash<const C*> {
size_t operator()(const std::basic_string<C> & s) const {
......@@ -516,6 +521,7 @@ struct hash<std::basic_string<C> > : private hash<const C*> {
};
}
#endif
// Hook into boost's type traits
namespace boost {
......
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