summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@sequoia-pgp.org>2022-04-06 11:03:25 +0300
committerLars Wirzenius <liw@sequoia-pgp.org>2022-04-06 11:03:25 +0300
commita8ab93ee575820ebf331d773c331aec75c0c9822 (patch)
tree7d0820d0a5e1057f07a7937e8c020da0d65d572f
parent4e6ab59be162fff43e4234eb2c8766154536910b (diff)
downloadlookup-a8ab93ee575820ebf331d773c331aec75c0c9822.tar.gz
feat: simple set-like lookup
Sponsored-by: author
-rw-r--r--src/main.rs78
1 files changed, 77 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs
index e7a11a9..ebb5c4f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,79 @@
fn main() {
- println!("Hello, world!");
+ let mut c = Container::default();
+ c.insert(42);
+ println!("{}", c.contains(42));
+ c.remove(42);
+ println!("{}", c.contains(42));
+}
+
+#[derive(Debug, Default)]
+struct Container {
+ numbers: Vec<i32>,
+}
+
+impl Container {
+ fn len(&self) -> usize {
+ self.numbers.len()
+ }
+
+ fn is_empty(&self) -> bool {
+ self.numbers.is_empty()
+ }
+
+ fn contains(&self, n: i32) -> bool {
+ self.find(n).is_some()
+ }
+
+ fn insert(&mut self, n: i32) {
+ self.numbers.push(n);
+ }
+
+ fn remove(&mut self, n: i32) -> Option<i32> {
+ if let Some(i) = self.find(n) {
+ self.numbers.remove(i);
+ Some(n)
+ } else {
+ None
+ }
+ }
+
+ fn find(&self, n: i32) -> Option<usize> {
+ for (i, x) in self.numbers.iter().enumerate() {
+ if *x == n {
+ return Some(i);
+ }
+ }
+ None
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::Container;
+
+ #[test]
+ fn is_empty_initially() {
+ let c = Container::default();
+ assert_eq!(c.len(), 0);
+ assert!(c.is_empty());
+ }
+
+ #[test]
+ fn inserts() {
+ let mut c = Container::default();
+ assert!(!c.contains(0));
+ c.insert(0);
+ assert_eq!(c.len(), 1);
+ assert!(!c.is_empty());
+ assert!(c.contains(0));
+ }
+
+ #[test]
+ fn removes() {
+ let mut c = Container::default();
+ assert!(!c.contains(0));
+ c.insert(0);
+ c.remove(0);
+ assert!(c.is_empty());
+ }
}