Skip to content

Commit 96631ac

Browse files
committed
Add Deque::{get, get_mut, get_unchecked, get_unchecked_mut}
1 parent 1f25e65 commit 96631ac

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1919
- Added `VecView`, the `!Sized` version of `Vec`.
2020
- Added pool implementations for 64-bit architectures.
2121
- Added `IntoIterator` implementation for `LinearMap`
22+
- Added `Deque::{get, get_mut, get_unchecked, get_unchecked_mut}`.
2223

2324
### Changed
2425

src/deque.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,58 @@ impl<T, const N: usize> Deque<T, N> {
535535
done,
536536
}
537537
}
538+
539+
/// Returns a reference to the element at the given index.
540+
///
541+
/// Index 0 is the front of the `Deque`.
542+
pub fn get(&self, index: usize) -> Option<&T> {
543+
if index < self.len() {
544+
let idx = self.to_physical_index(index);
545+
Some(unsafe { self.buffer.get_unchecked(idx).assume_init_ref() })
546+
} else {
547+
None
548+
}
549+
}
550+
551+
/// Returns a mutable reference to the element at the given index.
552+
///
553+
/// Index 0 is the front of the `Deque`.
554+
pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
555+
if index < self.len() {
556+
let idx = self.to_physical_index(index);
557+
Some(unsafe { self.buffer.get_unchecked_mut(idx).assume_init_mut() })
558+
} else {
559+
None
560+
}
561+
}
562+
563+
/// Returns a reference to the element at the given index without checking if it exists.
564+
///
565+
/// # Safety
566+
///
567+
/// The element at the given `index` must exist (i.e. `index < self.len()`).
568+
pub unsafe fn get_unchecked(&self, index: usize) -> &T {
569+
debug_assert!(index < self.len());
570+
571+
let idx = self.to_physical_index(index);
572+
self.buffer.get_unchecked(idx).assume_init_ref()
573+
}
574+
575+
/// Returns a mutable reference to the element at the given index without checking if it exists.
576+
///
577+
/// # Safety
578+
///
579+
/// The element at the given `index` must exist (i.e. `index < self.len()`).
580+
pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
581+
debug_assert!(index < self.len());
582+
583+
let idx = self.to_physical_index(index);
584+
self.buffer.get_unchecked_mut(idx).assume_init_mut()
585+
}
586+
587+
fn to_physical_index(&self, index: usize) -> usize {
588+
self.front.wrapping_add(index) % N
589+
}
538590
}
539591

540592
// Trait implementations
@@ -1099,4 +1151,31 @@ mod tests {
10991151
// Deque contains: 5, 6, 7, 8
11001152
assert_eq!(q.as_slices(), ([5, 6, 7, 8].as_slice(), [].as_slice()));
11011153
}
1154+
1155+
#[test]
1156+
fn get() {
1157+
let mut q: Deque<i32, 4> = Deque::new();
1158+
assert_eq!(q.get(0), None);
1159+
1160+
q.push_back(0).unwrap();
1161+
assert_eq!(q.get(0), Some(&0));
1162+
assert_eq!(q.get(1), None);
1163+
1164+
q.push_back(1).unwrap();
1165+
assert_eq!(q.get(0), Some(&0));
1166+
assert_eq!(q.get(1), Some(&1));
1167+
assert_eq!(q.get(2), None);
1168+
1169+
q.pop_front().unwrap();
1170+
assert_eq!(q.get(0), Some(&1));
1171+
assert_eq!(q.get(1), None);
1172+
1173+
q.push_back(2).unwrap();
1174+
q.push_back(3).unwrap();
1175+
q.push_back(4).unwrap();
1176+
assert_eq!(q.get(0), Some(&1));
1177+
assert_eq!(q.get(1), Some(&2));
1178+
assert_eq!(q.get(2), Some(&3));
1179+
assert_eq!(q.get(3), Some(&4));
1180+
}
11021181
}

0 commit comments

Comments
 (0)