Substitute BTreeMap/BTreeSet generated types for Vec (#459)

* Substitute BTreeMap/BTreeSet for Vec

* regen code

* cargo fmt

* undo test tweak since not substituting bounded things at the mo

* add a couple of comments
This commit is contained in:
James Wilson
2022-02-21 14:18:09 +00:00
committed by GitHub
parent e866d744de
commit d01fdd70d2
3 changed files with 13 additions and 47 deletions
+6 -6
View File
@@ -147,12 +147,12 @@ impl RuntimeGenerator {
"frame_support::traits::misc::WrapperKeepOpaque",
parse_quote!(::subxt::WrapperKeepOpaque),
),
// We override this because it's used as a key in a BTreeMap, and so we
// need to implement some extra derives for it for that to compile.
(
"sp_npos_elections::ElectionScore",
parse_quote!(::subxt::ElectionScore),
),
// BTreeMap and BTreeSet impose an `Ord` constraint on their key types. This
// can cause an issue with generated code that doesn't impl `Ord` by default.
// Decoding them to Vec by default (KeyedVec is just an alias for Vec with
// suitable type params) avoids these issues.
("BTreeMap", parse_quote!(::subxt::KeyedVec)),
("BTreeSet", parse_quote!(::std::vec::Vec)),
]
.iter()
.map(|(path, substitute): &(&str, syn::TypePath)| {
+4 -37
View File
@@ -242,40 +242,7 @@ impl<T> PhantomDataSendSync<T> {
unsafe impl<T> Send for PhantomDataSendSync<T> {}
unsafe impl<T> Sync for PhantomDataSendSync<T> {}
/// [`ElectionScore`] overrides any generated instance of `sp_npos_elections::ElectionScore` found
/// in the metadata, so that we can add some extra derives required for it to be used as the key
/// in a [`std::collections::BTreeMap`].
#[derive(Encode, Decode, Debug, PartialEq, Eq)]
pub struct ElectionScore {
/// The minimal winner, in terms of total backing stake.
///
/// This parameter should be maximized.
pub minimal_stake: u128,
/// The sum of the total backing of all winners.
///
/// This parameter should maximized
pub sum_stake: u128,
/// The sum squared of the total backing of all winners, aka. the variance.
///
/// Ths parameter should be minimized.
pub sum_stake_squared: u128,
}
// These are copied from the original impl; they don't affect encoding/decoding but help
// to keep the ordering the same if we then work with the decoded results.
impl Ord for ElectionScore {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
// we delegate this to the lexicographic cmp of slices`, and to incorporate that we want the
// third element to be minimized, we swap them.
[self.minimal_stake, self.sum_stake, other.sum_stake_squared].cmp(&[
other.minimal_stake,
other.sum_stake,
self.sum_stake_squared,
])
}
}
impl PartialOrd for ElectionScore {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
/// This represents a key-value collection and is SCALE compatible
/// with collections like BTreeMap. This has the same type params
/// as `BTreeMap` which allows us to easily swap the two during codegen.
pub type KeyedVec<K, V> = Vec<(K, V)>;
+3 -4
View File
@@ -1,3 +1,4 @@
// Note [jsdw]: generated from polkadot 0.9.13-82616422d0-aarch64-macos
#[allow(dead_code, unused_imports, non_camel_case_types)]
pub mod api {
use super::api as root_mod;
@@ -20073,9 +20074,7 @@ pub mod api {
#[derive(
:: subxt :: codec :: Encode, :: subxt :: codec :: Decode, Debug,
)]
pub struct BoundedBTreeMap<_0, _1>(
pub ::std::collections::BTreeMap<_0, _1>,
);
pub struct BoundedBTreeMap<_0, _1>(pub ::subxt::KeyedVec<_0, _1>);
}
pub mod bounded_vec {
use super::runtime_types;
@@ -23047,7 +23046,7 @@ pub mod api {
#[derive(:: subxt :: codec :: Encode, :: subxt :: codec :: Decode, Debug)]
pub struct EraRewardPoints<_0> {
pub total: ::core::primitive::u32,
pub individual: ::std::collections::BTreeMap<_0, ::core::primitive::u32>,
pub individual: ::subxt::KeyedVec<_0, ::core::primitive::u32>,
}
#[derive(:: subxt :: codec :: Encode, :: subxt :: codec :: Decode, Debug)]
pub struct Exposure<_0, _1> {