Skip to content

Commit 8170f58

Browse files
authored
Merge pull request #477 from MrGunflame/deque-get
Add `Deque::{get, get_mut, get_unchecked, get_unchecked_mut}`
2 parents 662941d + 0234ca6 commit 8170f58

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-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: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,62 @@ 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+
let mut res = self.front + index;
589+
if res >= N {
590+
res -= N;
591+
}
592+
res
593+
}
538594
}
539595

540596
// Trait implementations
@@ -1099,4 +1155,52 @@ mod tests {
10991155
// Deque contains: 5, 6, 7, 8
11001156
assert_eq!(q.as_slices(), ([5, 6, 7, 8].as_slice(), [].as_slice()));
11011157
}
1158+
1159+
#[test]
1160+
fn get() {
1161+
let mut q: Deque<i32, 4> = Deque::new();
1162+
assert_eq!(q.get(0), None);
1163+
1164+
q.push_back(0).unwrap();
1165+
assert_eq!(q.get(0), Some(&0));
1166+
assert_eq!(q.get(1), None);
1167+
1168+
q.push_back(1).unwrap();
1169+
assert_eq!(q.get(0), Some(&0));
1170+
assert_eq!(q.get(1), Some(&1));
1171+
assert_eq!(q.get(2), None);
1172+
1173+
q.pop_front().unwrap();
1174+
assert_eq!(q.get(0), Some(&1));
1175+
assert_eq!(q.get(1), None);
1176+
1177+
q.push_back(2).unwrap();
1178+
q.push_back(3).unwrap();
1179+
q.push_back(4).unwrap();
1180+
assert_eq!(q.get(0), Some(&1));
1181+
assert_eq!(q.get(1), Some(&2));
1182+
assert_eq!(q.get(2), Some(&3));
1183+
assert_eq!(q.get(3), Some(&4));
1184+
}
1185+
1186+
#[test]
1187+
fn get_mut() {
1188+
let mut q: Deque<i32, 4> = Deque::new();
1189+
assert_eq!(q.get(0), None);
1190+
1191+
q.push_back(0).unwrap();
1192+
assert_eq!(q.get_mut(0), Some(&mut 0));
1193+
assert_eq!(q.get_mut(1), None);
1194+
1195+
q.push_back(1).unwrap();
1196+
assert_eq!(q.get_mut(0), Some(&mut 0));
1197+
assert_eq!(q.get_mut(1), Some(&mut 1));
1198+
assert_eq!(q.get_mut(2), None);
1199+
*q.get_mut(0).unwrap() = 42;
1200+
*q.get_mut(1).unwrap() = 43;
1201+
1202+
assert_eq!(q.pop_front(), Some(42));
1203+
assert_eq!(q.pop_front(), Some(43));
1204+
assert_eq!(q.pop_front(), None);
1205+
}
11021206
}

0 commit comments

Comments
 (0)