summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@sequoia-pgp.org>2022-04-10 08:39:12 +0300
committerLars Wirzenius <liw@sequoia-pgp.org>2022-04-10 08:39:12 +0300
commit0e865a872b2da95827670d3b345defc3b957f606 (patch)
treeb41e93cb6951701335567b5563f317e4b6d14464
parentdfb4f810fc5cb7132242772ae4f1b225d211e6ba (diff)
downloadlookup-0e865a872b2da95827670d3b345defc3b957f606.tar.gz
use generics
Sponsored-by: author
-rw-r--r--src/main.rs62
1 files changed, 34 insertions, 28 deletions
diff --git a/src/main.rs b/src/main.rs
index 7fd05af..3d7b329 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,47 +1,53 @@
fn main() {
- let mut c = Container::default();
- c.insert(42);
- println!("{}", c.contains(42));
- c.remove(42);
- println!("{}", c.contains(42));
+ let mut c: Container<String> = Container::default();
+ let foo = String::from("foo");
+ let bar = String::from("bar");
+ c.insert(foo.clone());
+ c.insert(bar.clone());
+ println!("contains foo? {}", c.contains(&foo));
+ println!("len {}", c.len());
+ println!("is_empty {}", c.is_empty());
+
+ c.remove(foo.clone());
+ println!("contains foo? {}", c.contains(&foo));
}
#[derive(Debug, Default)]
-struct Container {
- numbers: Vec<i32>,
+struct Container<T: Eq> {
+ values: Vec<T>,
}
-impl Container {
+impl<T: Eq> Container<T> {
fn len(&self) -> usize {
- self.numbers.len()
+ self.values.len()
}
fn is_empty(&self) -> bool {
- self.numbers.is_empty()
+ self.values.is_empty()
}
- fn contains(&self, n: i32) -> bool {
- self.find(n).is_some()
+ fn contains(&self, v: &T) -> bool {
+ self.find(v).is_some()
}
- fn insert(&mut self, n: i32) {
- if !self.contains(n) {
- self.numbers.push(n);
+ fn insert(&mut self, v: T) {
+ if !self.contains(&v) {
+ self.values.push(v);
}
}
- fn remove(&mut self, n: i32) -> Option<i32> {
- if let Some(i) = self.find(n) {
- self.numbers.remove(i);
- Some(n)
+ fn remove(&mut self, v: T) -> Option<T> {
+ if let Some(i) = self.find(&v) {
+ self.values.remove(i);
+ Some(v)
} else {
None
}
}
- fn find(&self, n: i32) -> Option<usize> {
- for (i, x) in self.numbers.iter().enumerate() {
- if *x == n {
+ fn find(&self, v: &T) -> Option<usize> {
+ for (i, x) in self.values.iter().enumerate() {
+ if x == v {
return Some(i);
}
}
@@ -55,7 +61,7 @@ mod test {
#[test]
fn is_empty_initially() {
- let c = Container::default();
+ let c: Container<i32> = Container::default();
assert_eq!(c.len(), 0);
assert!(c.is_empty());
}
@@ -63,17 +69,17 @@ mod test {
#[test]
fn inserts() {
let mut c = Container::default();
- assert!(!c.contains(0));
+ assert!(!c.contains(&0));
c.insert(0);
assert_eq!(c.len(), 1);
assert!(!c.is_empty());
- assert!(c.contains(0));
+ assert!(c.contains(&0));
}
#[test]
fn removes() {
let mut c = Container::default();
- assert!(!c.contains(0));
+ assert!(!c.contains(&0));
c.insert(0);
c.remove(0);
assert!(c.is_empty());
@@ -82,12 +88,12 @@ mod test {
#[test]
fn inserts_only_once() {
let mut c = Container::default();
- assert!(!c.contains(0));
+ assert!(!c.contains(&0));
c.insert(0);
c.insert(0);
assert_eq!(c.len(), 1);
assert!(!c.is_empty());
- assert!(c.contains(0));
+ assert!(c.contains(&0));
c.remove(0);
assert!(c.is_empty());
}