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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
//! General purpose data structures //! //! These are simply `std::vec::Vec` wrappers tuned for a specific purpose, //! so they are harder to misuse, or more efficient. //! //! For example: //! //! - The first template argument in `Array<I, T>` and `StackMapping<I, T>` //! requires to specify a type that will be used for indexing. This prevents //! us from accidentally using an index of the wrong type. //! //! - If we know a good upper bound for the size of a vector we prefer to //! use `Array<I, T>`, `BoundedVector<T>` or `StackMapping<Key, T>` as //! they never allocate after being constructed. //! //! - Bounds checking can be disabled for all these vectors. //! //! - `SmallVector` does not allocate anything when it contains only one or no elements. //! This can save memory when there are lots of vectors of size one. mod array; mod boundedvector; #[macro_use] mod vector; mod smallvector; mod stackmapping; use std::convert::TryFrom; pub use crate::memory::{ array::Array, boundedvector::BoundedVector, smallvector::SmallVector, stackmapping::StackMapping, vector::{assert_in_bounds, Vector}, }; /// Trait for types that can be used as an array index. pub trait Offset { fn as_offset(&self) -> usize; } impl Offset for usize { fn as_offset(&self) -> usize { *self } } impl Offset for u64 { fn as_offset(&self) -> usize { requires!(usize::try_from(*self).is_ok()); *self as usize } } impl Offset for i32 { fn as_offset(&self) -> usize { requires!(usize::try_from(*self).is_ok()); *self as usize } } /// A trait for objects that can report their memory usage on the heap pub trait HeapSpace { /// The number of bytes allocated on the heap that this owns. fn heap_space(&self) -> usize; } impl<T: Copy> HeapSpace for T { fn heap_space(&self) -> usize { 0 } } /// Convert bytes to megabytes for readability. pub fn format_memory_usage(bytes: usize) -> String { format!("{:12}", bytes >> 20) // MB }