replace std::dequeue with UMPMCQueue in UnboundedBlockingQueue
[folly.git] / folly / Uri-inl.h
index 3fb692e93c681f5c20ba8cf375a3e3d40ef1cba7..50d57c2ed53f2fccc01154d498749c885bc3d0a9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #error This file may only be included from folly/Uri.h
 #endif
 
-#include "folly/Conv.h"
+#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;
-  toAppend(scheme_, "://", &str);
-  if (!password_.empty()) {
-    toAppend(username_, ":", password_, "@", &str);
-  } else if (!username_.empty()) {
-    toAppend(username_, "@", &str);
-  }
-  toAppend(host_, &str);
-  if (port_ != 0) {
-    toAppend(":", port_, &str);
+  if (hasAuthority_) {
+    toAppend(scheme_, "://", &str);
+    if (!password_.empty()) {
+      toAppend(username_, ":", password_, "@", &str);
+    } else if (!username_.empty()) {
+      toAppend(username_, "@", &str);
+    }
+    toAppend(host_, &str);
+    if (port_ != 0) {
+      toAppend(":", port_, &str);
+    }
+  } else {
+    toAppend(scheme_, ":", &str);
   }
   toAppend(path_, &str);
   if (!query_.empty()) {
@@ -45,5 +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