diff --git a/src/iface/arp_cache.rs b/src/iface/arp_cache.rs index e37bd6d..e074a0e 100644 --- a/src/iface/arp_cache.rs +++ b/src/iface/arp_cache.rs @@ -67,7 +67,24 @@ impl<'a> SliceCache<'a> { /// Sort entries in an order suitable for `find`. fn sort(&mut self) { - self.storage.sort_by_key(|&(key, _, _)| key) + #[cfg(feature = "std")] + fn sort(data: &mut [(IpAddress, EthernetAddress, usize)]) { + data.sort_by_key(|&(key, _, _)| key) + } + + #[cfg(not(feature = "std"))] + fn sort(data: &mut [(IpAddress, EthernetAddress, usize)]) { + // Use an insertion sort, which performs best on 10 elements and less. + for i in 1..data.len() { + let mut j = i; + while j > 0 && data[j-1].0 > data[j].0 { + data.swap(j, j - 1); + j = j - 1; + } + } + } + + sort(&mut self.storage) } /// Find the least recently used entry. diff --git a/src/managed.rs b/src/managed.rs index 23dfdec..85009ac 100644 --- a/src/managed.rs +++ b/src/managed.rs @@ -1,4 +1,5 @@ use core::ops::{Deref, DerefMut}; +#[cfg(feature = "std")] use core::borrow::BorrowMut; use core::fmt;