From 80b18c8531b3e01d641222a8926af2eaae3efb54 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <bkchr@users.noreply.github.com>
Date: Fri, 31 May 2019 09:28:31 +0200
Subject: [PATCH] Remove `StorageList` (#2725)

* Remove `StorageList`

`StorageList` is not used anymore by `decl_storage!` and thus, it can be
removed.

* Fixes tests
---
 substrate/srml/support/src/lib.rs             |   2 +-
 .../support/src/storage/hashed/generator.rs   |  30 -----
 substrate/srml/support/src/storage/mod.rs     |  68 -----------
 .../srml/support/src/storage/storage_items.rs | 111 ------------------
 4 files changed, 1 insertion(+), 210 deletions(-)

diff --git a/substrate/srml/support/src/lib.rs b/substrate/srml/support/src/lib.rs
index 0931e4c5a3b..140b905e78d 100644
--- a/substrate/srml/support/src/lib.rs
+++ b/substrate/srml/support/src/lib.rs
@@ -58,7 +58,7 @@ mod double_map;
 pub mod traits;
 
 pub use self::storage::{
-	StorageList, StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap, AppendableStorageMap
+	StorageValue, StorageMap, EnumerableStorageMap, StorageDoubleMap, AppendableStorageMap
 };
 pub use self::hashable::Hashable;
 pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType};
diff --git a/substrate/srml/support/src/storage/hashed/generator.rs b/substrate/srml/support/src/storage/hashed/generator.rs
index 1cc62c69f75..5a8b2f9d8f5 100644
--- a/substrate/srml/support/src/storage/hashed/generator.rs
+++ b/substrate/srml/support/src/storage/hashed/generator.rs
@@ -207,36 +207,6 @@ pub trait StorageValue<T: codec::Codec> {
 	}
 }
 
-/// A strongly-typed list in storage.
-pub trait StorageList<T: codec::Codec> {
-	/// Get the prefix key in storage.
-	fn prefix() -> &'static [u8];
-
-	/// Get the key used to put the length field.
-	fn len_key() -> Vec<u8>;
-
-	/// Get the storage key used to fetch a value at a given index.
-	fn key_for(index: u32) -> Vec<u8>;
-
-	/// Read out all the items.
-	fn items<S: HashedStorage<Twox128>>(storage: &S) -> Vec<T>;
-
-	/// Set the current set of items.
-	fn set_items<S: HashedStorage<Twox128>>(items: &[T], storage: &mut S);
-
-	/// Set the item at the given index.
-	fn set_item<S: HashedStorage<Twox128>>(index: u32, item: &T, storage: &mut S);
-
-	/// Load the value at given index. Returns `None` if the index is out-of-bounds.
-	fn get<S: HashedStorage<Twox128>>(index: u32, storage: &S) -> Option<T>;
-
-	/// Load the length of the list
-	fn len<S: HashedStorage<Twox128>>(storage: &S) -> u32;
-
-	/// Clear the list.
-	fn clear<S: HashedStorage<Twox128>>(storage: &mut S);
-}
-
 /// A strongly-typed map in storage.
 pub trait StorageMap<K: codec::Codec, V: codec::Codec> {
 	/// The type that get/take returns.
diff --git a/substrate/srml/support/src/storage/mod.rs b/substrate/srml/support/src/storage/mod.rs
index 41ea4cfdbc1..a1891dade3b 100644
--- a/substrate/srml/support/src/storage/mod.rs
+++ b/substrate/srml/support/src/storage/mod.rs
@@ -196,74 +196,6 @@ impl<T: Codec, U> StorageValue<T> for U where U: hashed::generator::StorageValue
 	}
 }
 
-/// A strongly-typed list in storage.
-pub trait StorageList<T: Codec> {
-	/// Get the prefix key in storage.
-	fn prefix() -> &'static [u8];
-
-	/// Get the key used to store the length field.
-	fn len_key() -> Vec<u8>;
-
-	/// Get the storage key used to fetch a value at a given index.
-	fn key_for(index: u32) -> Vec<u8>;
-
-	/// Read out all the items.
-	fn items() -> Vec<T>;
-
-	/// Set the current set of items.
-	fn set_items(items: &[T]);
-
-	/// Set the item at the given index.
-	fn set_item<Arg: Borrow<T>>(index: u32, val: Arg);
-
-	/// Load the value at given index. Returns `None` if the index is out-of-bounds.
-	fn get(index: u32) -> Option<T>;
-
-	/// Load the length of the list
-	fn len() -> u32;
-
-	/// Clear the list.
-	fn clear();
-}
-
-impl<T: Codec, U> StorageList<T> for U where U: hashed::generator::StorageList<T> {
-	fn prefix() -> &'static [u8] {
-		<U as hashed::generator::StorageList<T>>::prefix()
-	}
-
-	fn len_key() -> Vec<u8> {
-		<U as hashed::generator::StorageList<T>>::len_key()
-	}
-
-	fn key_for(index: u32) -> Vec<u8> {
-		<U as hashed::generator::StorageList<T>>::key_for(index)
-	}
-
-	fn items() -> Vec<T> {
-		U::items(&RuntimeStorage)
-	}
-
-	fn set_items(items: &[T]) {
-		U::set_items(items, &mut RuntimeStorage)
-	}
-
-	fn set_item<Arg: Borrow<T>>(index: u32, val: Arg) {
-		U::set_item(index, val.borrow(), &mut RuntimeStorage)
-	}
-
-	fn get(index: u32) -> Option<T> {
-		U::get(index, &RuntimeStorage)
-	}
-
-	fn len() -> u32 {
-		U::len(&RuntimeStorage)
-	}
-
-	fn clear() {
-		U::clear(&mut RuntimeStorage)
-	}
-}
-
 /// A strongly-typed map in storage.
 pub trait StorageMap<K: Codec, V: Codec> {
 	/// The type that get/take return.
diff --git a/substrate/srml/support/src/storage/storage_items.rs b/substrate/srml/support/src/storage/storage_items.rs
index 2e7a8d4bb46..9d89b81e0d9 100644
--- a/substrate/srml/support/src/storage/storage_items.rs
+++ b/substrate/srml/support/src/storage/storage_items.rs
@@ -22,7 +22,6 @@
 //! Three kinds of data types are currently supported:
 //!   - values
 //!   - maps
-//!   - lists
 //!
 //! # Examples:
 //!
@@ -39,8 +38,6 @@
 //!     pub Value: b"putd_key" => SessionKey;
 //!     // private map.
 //!     Balances: b"private_map:" => map [AuthorityId => Balance];
-//!     // private list.
-//!     Authorities: b"auth:" => list [AuthorityId];
 //! }
 //!
 //!# fn main() { }
@@ -159,16 +156,6 @@ macro_rules! storage_items {
 		storage_items!($($t)*);
 	};
 
-
-	// lists
-	($name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => {
-		$crate::__storage_items_internal!(() $name: $prefix => list [$ty]);
-		storage_items!($($t)*);
-	};
-	(pub $name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => {
-		$crate::__storage_items_internal!((pub) $name: $prefix => list [$ty]);
-		storage_items!($($t)*);
-	};
 	() => ()
 }
 
@@ -282,84 +269,6 @@ macro_rules! __storage_items_internal {
 			}
 		}
 	};
-	// generator for lists.
-	(($($vis:tt)*) $name:ident : $prefix:expr => list [$ty:ty]) => {
-		$($vis)* struct $name;
-
-		impl $name {
-			fn clear_item<S: $crate::HashedStorage<$crate::Twox128>>(index: u32, storage: &mut S) {
-				if index < <$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) {
-					storage.kill(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index));
-				}
-			}
-
-			fn set_len<S: $crate::HashedStorage<$crate::Twox128>>(count: u32, storage: &mut S) {
-				(count..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage)).for_each(|i| $name::clear_item(i, storage));
-				storage.put(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key(), &count);
-			}
-		}
-
-		impl $crate::storage::hashed::generator::StorageList<$ty> for $name {
-			/// Get the prefix key in storage.
-			fn prefix() -> &'static [u8] {
-				$prefix
-			}
-
-			/// Get the key used to put the length field.
-			fn len_key() -> $crate::rstd::vec::Vec<u8> {
-				let mut key = $prefix.to_vec();
-				key.extend(b"len");
-				key
-			}
-
-			/// Get the storage key used to fetch a value at a given index.
-			fn key_for(index: u32) -> $crate::rstd::vec::Vec<u8> {
-				let mut key = $prefix.to_vec();
-				$crate::codec::Encode::encode_to(&index, &mut key);
-				key
-			}
-
-			/// Read out all the items.
-			fn items<S: $crate::HashedStorage<$crate::Twox128>>(storage: &S) -> $crate::rstd::vec::Vec<$ty> {
-				(0..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage))
-					.map(|i| <$name as $crate::storage::hashed::generator::StorageList<$ty>>::get(i, storage).expect("all items within length are set; qed"))
-					.collect()
-			}
-
-			/// Set the current set of items.
-			fn set_items<S: $crate::HashedStorage<$crate::Twox128>>(items: &[$ty], storage: &mut S) {
-				$name::set_len(items.len() as u32, storage);
-				items.iter()
-					.enumerate()
-					.for_each(|(i, item)| <$name as $crate::storage::hashed::generator::StorageList<$ty>>::set_item(i as u32, item, storage));
-			}
-
-			fn set_item<S: $crate::HashedStorage<$crate::Twox128>>(index: u32, item: &$ty, storage: &mut S) {
-				if index < <$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) {
-					storage.put(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)[..], item);
-				}
-			}
-
-			/// Load the value at given index. Returns `None` if the index is out-of-bounds.
-			fn get<S: $crate::HashedStorage<$crate::Twox128>>(index: u32, storage: &S) -> Option<$ty> {
-				storage.get(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::key_for(index)[..])
-			}
-
-			/// Load the length of the list.
-			fn len<S: $crate::HashedStorage<$crate::Twox128>>(storage: &S) -> u32 {
-				storage.get(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key()).unwrap_or_default()
-			}
-
-			/// Clear the list.
-			fn clear<S: $crate::HashedStorage<$crate::Twox128>>(storage: &mut S) {
-				for i in 0..<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len(storage) {
-					$name::clear_item(i, storage);
-				}
-
-				storage.kill(&<$name as $crate::storage::hashed::generator::StorageList<$ty>>::len_key()[..])
-			}
-		}
-	};
 }
 
 #[macro_export]
@@ -391,7 +300,6 @@ mod tests {
 
 	storage_items! {
 		Value: b"a" => u32;
-		List: b"b:" => list [u64];
 		Map: b"c:" => map [u32 => [u8; 32]];
 	}
 
@@ -405,25 +313,6 @@ mod tests {
 		assert!(Value::get(&storage).is_none());
 	}
 
-	#[test]
-	fn list() {
-		let mut storage = HashMap::new();
-		assert_eq!(List::len(&storage), 0);
-		assert!(List::items(&storage).is_empty());
-
-		List::set_items(&[0, 2, 4, 6, 8], &mut storage);
-		assert_eq!(List::items(&storage), &[0, 2, 4, 6, 8]);
-		assert_eq!(List::len(&storage), 5);
-
-		List::set_item(2, &10, &mut storage);
-		assert_eq!(List::items(&storage), &[0, 2, 10, 6, 8]);
-		assert_eq!(List::len(&storage), 5);
-
-		List::clear(&mut storage);
-		assert_eq!(List::len(&storage), 0);
-		assert!(List::items(&storage).is_empty());
-	}
-
 	#[test]
 	fn map() {
 		let mut storage = HashMap::new();
-- 
GitLab