Add setPort() to folly::URI class.
[folly.git] / folly / String.h
index bea17b7261953ba91a15648ba4ba183273281a5b..241d4dbf6aac26479d88853cf3514a4f99eac137 100644 (file)
@@ -30,6 +30,7 @@
 #include <unordered_map>
 
 #include "folly/Conv.h"
+#include "folly/Demangle.h"
 #include "folly/FBString.h"
 #include "folly/FBVector.h"
 #include "folly/Portability.h"
@@ -317,45 +318,6 @@ std::string hexDump(const void* ptr, size_t size);
  */
 fbstring errnoStr(int err);
 
-/**
- * Return the demangled (prettyfied) version of a C++ type.
- *
- * This function tries to produce a human-readable type, but the type name will
- * be returned unchanged in case of error or if demangling isn't supported on
- * your system.
- *
- * Use for debugging -- do not rely on demangle() returning anything useful.
- *
- * This function may allocate memory (and therefore throw std::bad_alloc).
- */
-fbstring demangle(const char* name);
-inline fbstring demangle(const std::type_info& type) {
-  return demangle(type.name());
-}
-
-/**
- * Return the demangled (prettyfied) version of a C++ type in a user-provided
- * buffer.
- *
- * The semantics are the same as for snprintf or strlcpy: bufSize is the size
- * of the buffer, the string is always null-terminated, and the return value is
- * the number of characters (not including the null terminator) that would have
- * been written if the buffer was big enough. (So a return value >= bufSize
- * indicates that the output was truncated)
- *
- * This function does not allocate memory and is async-signal-safe.
- *
- * Note that the underlying function for the fbstring-returning demangle is
- * somewhat standard (abi::__cxa_demangle, which uses malloc), the underlying
- * function for this version is less so (cplus_demangle_v3_callback from
- * libiberty), so it is possible for the fbstring version to work, while this
- * version returns the original, mangled name.
- */
-size_t demangle(const char* name, char* buf, size_t bufSize);
-inline size_t demangle(const std::type_info& type, char* buf, size_t bufSize) {
-  return demangle(type.name(), buf, bufSize);
-}
-
 /**
  * Debug string for an exception: include type and what().
  */
@@ -495,19 +457,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 +483,7 @@ struct hash<std::basic_string<C> > : private hash<const C*> {
 };
 
 }
+#endif
 
 // Hook into boost's type traits
 namespace boost {