Mark constructing an Unexpected as cold
[folly.git] / folly / Uri-inl.h
index 5cb1967c66fcc0705a5b50f7abb27d73603e4a7c..50d57c2ed53f2fccc01154d498749c885bc3d0a9 100644 (file)
 #error This file may only be included from folly/Uri.h
 #endif
 
+#include <functional>
+#include <tuple>
+
 #include <folly/Conv.h>
+#include <folly/hash/Hash.h>
 
 namespace folly {
 
+namespace uri_detail {
+
+using UriTuple = std::tuple<
+    const std::string&,
+    const std::string&,
+    const std::string&,
+    const std::string&,
+    uint16_t,
+    const std::string&,
+    const std::string&,
+    const std::string&>;
+
+inline UriTuple as_tuple(const folly::Uri& k) {
+  return UriTuple(
+      k.scheme(),
+      k.username(),
+      k.password(),
+      k.host(),
+      k.port(),
+      k.path(),
+      k.query(),
+      k.fragment());
+}
+
+} // namespace uri_detail
+
 template <class String>
 String Uri::toString() const {
   String str;
@@ -49,4 +79,23 @@ String Uri::toString() const {
   return str;
 }
 
-}  // namespace folly
+} // namespace folly
+
+namespace std {
+
+template <>
+struct hash<folly::Uri> {
+  std::size_t operator()(const folly::Uri& k) const {
+    return std::hash<folly::uri_detail::UriTuple>{}(
+        folly::uri_detail::as_tuple(k));
+  }
+};
+
+template <>
+struct equal_to<folly::Uri> {
+  bool operator()(const folly::Uri& a, const folly::Uri& b) const {
+    return folly::uri_detail::as_tuple(a) == folly::uri_detail::as_tuple(b);
+  }
+};
+
+} // namespace std