Snap for 8730993 from 0249166812f2b30a4b7e29165f25c83932755809 to mainline-tzdata3-release

Change-Id: I94f9214ba4f13716083e6c8c0083e096600816b2
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 3f828db..89ad255 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,5 +1,5 @@
 {
   "git": {
-    "sha1": "491feb0b3f9805f7548a459ac32ab24914e12db2"
+    "sha1": "a244c741ac60333e3c37298fffdbfc1aa5f3c0d6"
   }
 }
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 12fde18..9116b38 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -35,17 +35,17 @@
           command: cargo build --all --all-targets
       - run:
           name: Run all tests
-          command: cargo test --all --all-features
+          command: cargo test --all
       - run:
           name: Run all tests under miri
           command: |
-            cargo +nightly miri test --all-features
+            cargo +nightly miri test
       - run:
           name: Run all tests under sanitizers
           command: |
-            RUSTFLAGS="-Z sanitizer=address" cargo +nightly -Z build-std test --target x86_64-unknown-linux-gnu --all-features
-            RUSTFLAGS="-Z sanitizer=leak" cargo +nightly test -Z build-std --target x86_64-unknown-linux-gnu --all-features
-            RUSTFLAGS="-Z sanitizer=memory" cargo +nightly test -Z build-std --target x86_64-unknown-linux-gnu --all-features
+            RUSTFLAGS="-Z sanitizer=address" cargo +nightly -Z build-std test --target x86_64-unknown-linux-gnu
+            RUSTFLAGS="-Z sanitizer=leak" cargo +nightly test -Z build-std --target x86_64-unknown-linux-gnu
+            RUSTFLAGS="-Z sanitizer=memory" cargo +nightly test -Z build-std --target x86_64-unknown-linux-gnu
       - save_cache:
           paths:
             - /usr/local/cargo/registry
diff --git a/Android.bp b/Android.bp
index 260ac53..f365f34 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,5 +1,4 @@
-// This file is generated by cargo2android.py --config cargo2android.json.
-// Do not modify this file as changes will be overridden on upgrade.
+// This file is generated by cargo2android.py --device --run --dependencies.
 
 package {
     default_applicable_licenses: ["external_rust_crates_hashlink_license"],
@@ -41,11 +40,13 @@
     name: "libhashlink",
     host_supported: true,
     crate_name: "hashlink",
-    cargo_env_compat: true,
-    cargo_pkg_version: "0.7.0",
     srcs: ["src/lib.rs"],
     edition: "2018",
     rustlibs: [
         "libhashbrown",
     ],
 }
+
+// dependent_library ["feature_list"]
+//   ahash-0.4.6
+//   hashbrown-0.9.1 "ahash,default,inline-more"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54c2bbe..12963ea 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,11 +1,3 @@
-## [0.7.0
-- API incompatible change: depend on hashbrown 0.11, changes re-exported types.
-- Fix `LinkedHashSet::back` to take `&self` not `&mut self`.
-- API incompatible change: equality tests on `LinkedHashSet` are now *ordered*,
-  similar to `LinkedHashMap`.
-- Make the serde `Deserialize` implementations on `LinkedHashMap` and
-  `LinkedHashSet` generic on the `BuildHasher` type.
-
 ## [0.6.0]
 - API incompatible change: depend on hashbrown 0.9, re-export renamed
   hashbrown::TryReserveError type.
diff --git a/Cargo.toml b/Cargo.toml
index 92db926..6a5a2d4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,7 +13,7 @@
 [package]
 edition = "2018"
 name = "hashlink"
-version = "0.7.0"
+version = "0.6.0"
 authors = ["kyren <kerriganw@gmail.com>"]
 description = "HashMap-like containers that hold their key-value pairs in a user controllable order"
 documentation = "https://docs.rs/hashlink"
@@ -22,14 +22,11 @@
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/kyren/hashlink"
 [dependencies.hashbrown]
-version = "0.11.0"
+version = "0.9.0"
 
 [dependencies.serde]
 version = "1.0"
 optional = true
-[dev-dependencies.fxhash]
-version = "0.2.1"
-
 [dev-dependencies.serde_test]
 version = "1.0"
 
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index c6de186..6ad661b 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "hashlink"
-version = "0.7.0"
+version = "0.6.0"
 authors = ["kyren <kerriganw@gmail.com>"]
 edition = "2018"
 description = "HashMap-like containers that hold their key-value pairs in a user controllable order"
@@ -17,9 +17,8 @@
 serde_impl = ["serde"]
 
 [dependencies]
-hashbrown = "0.11.0"
+hashbrown = "0.9.0"
 serde = { version = "1.0", optional = true }
 
 [dev-dependencies]
 serde_test = "1.0"
-fxhash = "0.2.1"
diff --git a/METADATA b/METADATA
index 1aeaa1e..d38b627 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/hashlink/hashlink-0.7.0.crate"
+    value: "https://static.crates.io/crates/hashlink/hashlink-0.6.0.crate"
   }
-  version: "0.7.0"
+  version: "0.6.0"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2021
-    month: 5
-    day: 19
+    year: 2020
+    month: 11
+    day: 9
   }
 }
diff --git a/TEST_MAPPING b/TEST_MAPPING
deleted file mode 100644
index 91f37bf..0000000
--- a/TEST_MAPPING
+++ /dev/null
@@ -1,19 +0,0 @@
-// Generated by update_crate_tests.py for tests that depend on this crate.
-{
-  "presubmit": [
-    {
-      "name": "keystore2_test"
-    },
-    {
-      "name": "legacykeystore_test"
-    }
-  ],
-  "presubmit-rust": [
-    {
-      "name": "keystore2_test"
-    },
-    {
-      "name": "legacykeystore_test"
-    }
-  ]
-}
diff --git a/cargo2android.json b/cargo2android.json
deleted file mode 100644
index bf78496..0000000
--- a/cargo2android.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "device": true,
-  "run": true
-}
\ No newline at end of file
diff --git a/src/linked_hash_map.rs b/src/linked_hash_map.rs
index 191844c..32733ea 100644
--- a/src/linked_hash_map.rs
+++ b/src/linked_hash_map.rs
@@ -441,40 +441,6 @@
             }
         }
     }
-
-    /// If an entry with this key exists, move it to the front of the list and return a reference to
-    /// the value.
-    #[inline]
-    pub fn to_front<Q>(&mut self, k: &Q) -> Option<&mut V>
-    where
-        K: Borrow<Q>,
-        Q: Hash + Eq + ?Sized,
-    {
-        match self.raw_entry_mut().from_key(k) {
-            RawEntryMut::Occupied(mut occupied) => {
-                occupied.to_front();
-                Some(occupied.into_mut())
-            }
-            RawEntryMut::Vacant(_) => None,
-        }
-    }
-
-    /// If an entry with this key exists, move it to the back of the list and return a reference to
-    /// the value.
-    #[inline]
-    pub fn to_back<Q>(&mut self, k: &Q) -> Option<&mut V>
-    where
-        K: Borrow<Q>,
-        Q: Hash + Eq + ?Sized,
-    {
-        match self.raw_entry_mut().from_key(k) {
-            RawEntryMut::Occupied(mut occupied) => {
-                occupied.to_back();
-                Some(occupied.into_mut())
-            }
-            RawEntryMut::Vacant(_) => None,
-        }
-    }
 }
 
 impl<K, V, S> LinkedHashMap<K, V, S>
diff --git a/src/linked_hash_set.rs b/src/linked_hash_set.rs
index f55f6c5..1ab7dbb 100644
--- a/src/linked_hash_set.rs
+++ b/src/linked_hash_set.rs
@@ -250,7 +250,7 @@
     }
 
     #[inline]
-    pub fn back(&self) -> Option<&T> {
+    pub fn back(&mut self) -> Option<&T> {
         self.map.back().map(|(k, _)| k)
     }
 
@@ -304,8 +304,12 @@
     S: BuildHasher,
 {
     #[inline]
-    fn eq(&self, other: &Self) -> bool {
-        self.len() == other.len() && self.iter().eq(other)
+    fn eq(&self, other: &LinkedHashSet<T, S>) -> bool {
+        if self.len() != other.len() {
+            return false;
+        }
+
+        self.iter().all(|key| other.contains(key))
     }
 }
 
diff --git a/src/serde.rs b/src/serde.rs
index f44ebb3..b8e307c 100644
--- a/src/serde.rs
+++ b/src/serde.rs
@@ -31,59 +31,54 @@
     }
 }
 
-impl<'de, K, V, S> Deserialize<'de> for LinkedHashMap<K, V, S>
+#[derive(Debug)]
+pub struct LinkedHashMapVisitor<K, V> {
+    marker: PhantomData<LinkedHashMap<K, V>>,
+}
+
+impl<K, V> LinkedHashMapVisitor<K, V> {
+    fn new() -> Self {
+        LinkedHashMapVisitor {
+            marker: PhantomData,
+        }
+    }
+}
+
+impl<K, V> Default for LinkedHashMapVisitor<K, V> {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+impl<'de, K, V> Visitor<'de> for LinkedHashMapVisitor<K, V>
 where
     K: Deserialize<'de> + Eq + Hash,
     V: Deserialize<'de>,
-    S: BuildHasher + Default,
+{
+    type Value = LinkedHashMap<K, V>;
+
+    fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
+        write!(formatter, "a map")
+    }
+
+    #[inline]
+    fn visit_map<M: MapAccess<'de>>(self, mut map: M) -> Result<Self::Value, M::Error> {
+        let mut values = LinkedHashMap::with_capacity(map.size_hint().unwrap_or(0));
+
+        while let Some((k, v)) = map.next_entry()? {
+            values.insert(k, v);
+        }
+
+        Ok(values)
+    }
+}
+
+impl<'de, K, V> Deserialize<'de> for LinkedHashMap<K, V>
+where
+    K: Deserialize<'de> + Eq + Hash,
+    V: Deserialize<'de>,
 {
     fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
-        #[derive(Debug)]
-        pub struct LinkedHashMapVisitor<K, V, S> {
-            marker: PhantomData<LinkedHashMap<K, V, S>>,
-        }
-
-        impl<K, V, S> LinkedHashMapVisitor<K, V, S> {
-            fn new() -> Self {
-                LinkedHashMapVisitor {
-                    marker: PhantomData,
-                }
-            }
-        }
-
-        impl<K, V, S> Default for LinkedHashMapVisitor<K, V, S> {
-            fn default() -> Self {
-                Self::new()
-            }
-        }
-
-        impl<'de, K, V, S> Visitor<'de> for LinkedHashMapVisitor<K, V, S>
-        where
-            K: Deserialize<'de> + Eq + Hash,
-            V: Deserialize<'de>,
-            S: BuildHasher + Default,
-        {
-            type Value = LinkedHashMap<K, V, S>;
-
-            fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
-                write!(formatter, "a map")
-            }
-
-            #[inline]
-            fn visit_map<M: MapAccess<'de>>(self, mut map: M) -> Result<Self::Value, M::Error> {
-                let mut values = LinkedHashMap::with_capacity_and_hasher(
-                    map.size_hint().unwrap_or(0),
-                    S::default(),
-                );
-
-                while let Some((k, v)) = map.next_entry()? {
-                    values.insert(k, v);
-                }
-
-                Ok(values)
-            }
-        }
-
         deserializer.deserialize_map(LinkedHashMapVisitor::default())
     }
 }
@@ -105,57 +100,52 @@
     }
 }
 
-impl<'de, T, S> Deserialize<'de> for LinkedHashSet<T, S>
+#[derive(Debug)]
+pub struct LinkedHashSetVisitor<T> {
+    marker: PhantomData<LinkedHashSet<T>>,
+}
+
+impl<T> LinkedHashSetVisitor<T> {
+    fn new() -> Self {
+        LinkedHashSetVisitor {
+            marker: PhantomData,
+        }
+    }
+}
+
+impl<T> Default for LinkedHashSetVisitor<T> {
+    fn default() -> Self {
+        Self::new()
+    }
+}
+
+impl<'de, T> Visitor<'de> for LinkedHashSetVisitor<T>
 where
     T: Deserialize<'de> + Eq + Hash,
-    S: BuildHasher + Default,
+{
+    type Value = LinkedHashSet<T>;
+
+    fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
+        write!(formatter, "a sequence")
+    }
+
+    #[inline]
+    fn visit_seq<S: SeqAccess<'de>>(self, mut seq: S) -> Result<Self::Value, S::Error> {
+        let mut values = LinkedHashSet::with_capacity(seq.size_hint().unwrap_or(0));
+
+        while let Some(v) = seq.next_element()? {
+            values.insert(v);
+        }
+
+        Ok(values)
+    }
+}
+
+impl<'de, T> Deserialize<'de> for LinkedHashSet<T>
+where
+    T: Deserialize<'de> + Eq + Hash,
 {
     fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
-        #[derive(Debug)]
-        pub struct LinkedHashSetVisitor<T, S> {
-            marker: PhantomData<LinkedHashSet<T, S>>,
-        }
-
-        impl<T, S> LinkedHashSetVisitor<T, S> {
-            fn new() -> Self {
-                LinkedHashSetVisitor {
-                    marker: PhantomData,
-                }
-            }
-        }
-
-        impl<T, S> Default for LinkedHashSetVisitor<T, S> {
-            fn default() -> Self {
-                Self::new()
-            }
-        }
-
-        impl<'de, T, S> Visitor<'de> for LinkedHashSetVisitor<T, S>
-        where
-            T: Deserialize<'de> + Eq + Hash,
-            S: BuildHasher + Default,
-        {
-            type Value = LinkedHashSet<T, S>;
-
-            fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
-                write!(formatter, "a sequence")
-            }
-
-            #[inline]
-            fn visit_seq<SA: SeqAccess<'de>>(self, mut seq: SA) -> Result<Self::Value, SA::Error> {
-                let mut values = LinkedHashSet::with_capacity_and_hasher(
-                    seq.size_hint().unwrap_or(0),
-                    S::default(),
-                );
-
-                while let Some(v) = seq.next_element()? {
-                    values.insert(v);
-                }
-
-                Ok(values)
-            }
-        }
-
         deserializer.deserialize_seq(LinkedHashSetVisitor::default())
     }
 }
diff --git a/tests/linked_hash_map.rs b/tests/linked_hash_map.rs
index fbd3d2e..19dcc00 100644
--- a/tests/linked_hash_map.rs
+++ b/tests/linked_hash_map.rs
@@ -496,18 +496,3 @@
     drop(map);
     assert!(c.get() == 4);
 }
-
-#[test]
-fn test_order_equality() {
-    let xs = [1, 2, 3, 4, 5, 6];
-    let mut map1: LinkedHashMap<String, i32> = xs.iter().map(|i| (i.to_string(), *i)).collect();
-    let mut map2: LinkedHashMap<String, i32> = xs.iter().map(|i| (i.to_string(), *i)).collect();
-
-    assert_eq!(map1, map2);
-
-    map1.to_front("4");
-    assert_ne!(map1, map2);
-
-    map2.to_front("4");
-    assert_eq!(map1, map2);
-}
diff --git a/tests/linked_hash_set.rs b/tests/linked_hash_set.rs
index cb75887..13cceae 100644
--- a/tests/linked_hash_set.rs
+++ b/tests/linked_hash_set.rs
@@ -510,18 +510,3 @@
     set.to_front(&3);
     assert_eq!(set.front().copied(), Some(3));
 }
-
-#[test]
-fn test_order_equality() {
-    let xs = [1, 2, 3, 4, 5, 6];
-    let mut set1: LinkedHashSet<i32> = xs.iter().copied().collect();
-    let mut set2: LinkedHashSet<i32> = xs.iter().copied().collect();
-
-    assert_eq!(set1, set2);
-
-    set1.to_front(&4);
-    assert_ne!(set1, set2);
-
-    set2.to_front(&4);
-    assert_eq!(set1, set2);
-}
diff --git a/tests/serde.rs b/tests/serde.rs
index d397a24..fce3108 100644
--- a/tests/serde.rs
+++ b/tests/serde.rs
@@ -1,6 +1,5 @@
 #![cfg(feature = "serde_impl")]
 
-use fxhash::FxBuildHasher;
 use hashlink::{LinkedHashMap, LinkedHashSet};
 use serde_test::{assert_tokens, Token};
 
@@ -34,35 +33,6 @@
 }
 
 #[test]
-fn map_serde_tokens_empty_generic() {
-    let map = LinkedHashMap::<char, u32, FxBuildHasher>::with_hasher(FxBuildHasher::default());
-
-    assert_tokens(&map, &[Token::Map { len: Some(0) }, Token::MapEnd]);
-}
-
-#[test]
-fn map_serde_tokens_generic() {
-    let mut map = LinkedHashMap::with_hasher(FxBuildHasher::default());
-    map.insert('a', 10);
-    map.insert('b', 20);
-    map.insert('c', 30);
-
-    assert_tokens(
-        &map,
-        &[
-            Token::Map { len: Some(3) },
-            Token::Char('a'),
-            Token::I32(10),
-            Token::Char('b'),
-            Token::I32(20),
-            Token::Char('c'),
-            Token::I32(30),
-            Token::MapEnd,
-        ],
-    );
-}
-
-#[test]
 fn set_serde_tokens_empty() {
     let set = LinkedHashSet::<u32>::new();
 
@@ -87,22 +57,3 @@
         ],
     );
 }
-
-#[test]
-fn set_serde_tokens_generic() {
-    let mut set = LinkedHashSet::with_hasher(FxBuildHasher::default());
-    set.insert('a');
-    set.insert('b');
-    set.insert('c');
-
-    assert_tokens(
-        &set,
-        &[
-            Token::Seq { len: Some(3) },
-            Token::Char('a'),
-            Token::Char('b'),
-            Token::Char('c'),
-            Token::SeqEnd,
-        ],
-    );
-}