diff --git a/parity-util-mem/Cargo.toml b/parity-util-mem/Cargo.toml index e15e460c1..ff69fc3aa 100644 --- a/parity-util-mem/Cargo.toml +++ b/parity-util-mem/Cargo.toml @@ -21,6 +21,7 @@ hashbrown = { version = "0.6", optional = true } mimallocator = { version = "0.1.3", features = ["secure"], optional = true } mimalloc-sys = { version = "0.1.6", optional = true } parity-util-mem-derive = { path = "derive", version = "0.1" } +impl-trait-for-tuples = "0.1.3" smallvec = { version = "1.0.0", optional = true } ethereum-types = { version = "0.8.0", optional = true, path = "../ethereum-types" } diff --git a/parity-util-mem/src/malloc_size.rs b/parity-util-mem/src/malloc_size.rs index 3c26a917a..b9761527f 100644 --- a/parity-util-mem/src/malloc_size.rs +++ b/parity-util-mem/src/malloc_size.rs @@ -261,42 +261,12 @@ impl MallocSizeOf for Box { } } -impl MallocSizeOf for () { - fn size_of(&self, _ops: &mut MallocSizeOfOps) -> usize { - 0 - } -} - -impl MallocSizeOf for (T1, T2) -where - T1: MallocSizeOf, - T2: MallocSizeOf, -{ - fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize { - self.0.size_of(ops) + self.1.size_of(ops) - } -} - -impl MallocSizeOf for (T1, T2, T3) -where - T1: MallocSizeOf, - T2: MallocSizeOf, - T3: MallocSizeOf, -{ - fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize { - self.0.size_of(ops) + self.1.size_of(ops) + self.2.size_of(ops) - } -} - -impl MallocSizeOf for (T1, T2, T3, T4) -where - T1: MallocSizeOf, - T2: MallocSizeOf, - T3: MallocSizeOf, - T4: MallocSizeOf, -{ +#[impl_trait_for_tuples::impl_for_tuples(12)] +impl MallocSizeOf for Tuple { fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize { - self.0.size_of(ops) + self.1.size_of(ops) + self.2.size_of(ops) + self.3.size_of(ops) + let mut result = 0; + for_tuples!( #( result += Tuple.size_of(ops); )* ); + result } } diff --git a/parity-util-mem/tests/derive.rs b/parity-util-mem/tests/derive.rs index 34674fd5f..87f8c9f50 100644 --- a/parity-util-mem/tests/derive.rs +++ b/parity-util-mem/tests/derive.rs @@ -76,3 +76,17 @@ fn derive_morecomplex() { assert!(t.malloc_size_of() > 8000); } + +#[test] +fn derive_tuple() { + #[derive(MallocSizeOf)] + struct Trivia { + tp1: (), + tp2: (Vec, Vec), + } + + let t = Trivia { tp1: (), tp2: (vec![7u8; 1024], vec![9u8; 1024]) }; + + assert!(t.malloc_size_of() > 2000); + assert!(t.malloc_size_of() < 3000); +}