1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//! Memusage is a simple dependency for memory usage autoreporting.
//! It contains a single trait an default implementations for `core` and `std`.
//! To use this crate simply import the `MemoryReport` trait. This gives access
//! to 3 methods `T::direct()`, `T::indirect(&self)` and `T::children(&self)`.
//! The total memory usage of a `struct` will be the sum of the 3 measurements.
//! 
//! All measurements for allocating structs (e.g. `HashMap`) are estimations.
//! This is due to hidden fields in these structs, compiler optmimizations and
//! other miscellaneous effects.



#![no_std]



#[cfg(feature = "alloc")]
extern crate alloc;

#[cfg(feature = "std")]
extern crate std;



mod builtin;



pub trait MemoryReport: Sized {
    /// A constant that indicates whether this object allocates memory other
    /// than the innate memory.
    const ALLOC: bool = false;

    /// A constant that indicates whether this object has children.
    const CHILD: bool = false;

    /// Reports the memory innate to the struct.
    /// This is equivalent to `core::mem::size_of::<Self>()`.
    #[inline]
    fn direct() -> usize {
        core::mem::size_of::<Self>()
    }

    /// Reports the memory directly allocated by this struct.
    /// For example, `Vec` returns its capacity times the size of the structs.
    #[inline]
    fn indirect(&self) -> usize {
        0
    }

    /// Reports the indirect and children memory of the children of the struct,
    /// if there are any. This returns non zero only if the children of the
    /// struct allocate memory.
    /// For example `Vec<Vec<T>>` would return a non zero value but a
    /// `Vec<usize>` would return 0.
    #[inline]
    fn children(&self) -> usize {
        0
    }
}